. 连接MongoDB数据库

```java

import com.mongodb.Mongo;

import com.mongodb.DBCollection;

import com.mongodb.BasicDBObject;

import com.mongodb.DBObject;

import com.mongodb.DBCursor;

import com.mongodb.MongoAdmin;

// 创建Mongo对象,传入数据库地址和端口号(可选)

Mongo db = new Mongo("localhost", "mydb");

// 或者传入数据库名称

Mongo db = new Mongo("localhost", 27017, "mydb");

```

2. 查看MongoDB数据库列表

```java

Mongo m = new Mongo();

for (String s : m.getDatabaseNames()) {

System.out.println(s);

}

```

3. 删除一个数据库

```java

Mongo m = new Mongo();

m.dropDatabase("myDatabaseName");

```

4. MongoDB安全验证(非必选)

在JAVA中可使用如下方法连接:

```java

boolean auth = db.authenticate(userName, password);

if (auth) {

System.out.println("Authentication successful");

} else {

System.out.println("Authentication failed");

}

```

如果用户名密码验证通过,返回值为true,否则为false。

5. 获取集合列表

```java

Set colls = db.getCollectionNames();

for (String s : colls) {

System.out.println(s);

}

```

6. 获得一个集合

```java

DBCollection coll = db.getCollection("testCollection");

```

当你获取了这个集合对象,你就可以对数据进行增删查改之类的操作。

以下是重构后的代码:

```java

// 获取集合索引信息

List list = coll.getIndexInfo();

for (DBObject o : list) {

System.out.println(o);

}

// 插入文档,默认ID

// 当保存的对象没有设置ID时,mongoDB会默认给该条记录设置一个ID("_id")。

// 当然你也可以设置自己指定的ID,如:(在mongoDB中执行用db.users.save({_id:1,name:'bruce'});)

// 当你获得了一个集合对象,你就可以把文档插入到这个对象中。例如,存在一个JSON式的小文档:

// {

// "name" : "MongoDB",

// "type" : "database",

// "count" : 1,

// "info" : {

// x : 203,

// y : 102

// }

// }

// 请注意,这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档,并且使用insert()方法方便地将它插入到集合中。

BasicDBObject doc = new BasicDBObject();

doc.put("name", "MongoDB");

doc.put("type", "database");

doc.put("count", 1);

BasicDBObject info = new BasicDBObject();

info.put("x", 203);

info.put("y", 102);

doc.put("info", info);

coll.insert(doc);

// 批量插入

List datas = new ArrayList<>();

for (int i = 0; i < 100; i++) {

BasicDBObject bo = new BasicDBObject();

bo.put("name", "bruce");

bo.append("age", i);

datas.add(bo);

}

```

以下是重构后的内容:

1. 插入文档到集合中:

```java

coll.insert(datas);

```

2. 使用findOne()查找集合中第一个文档:

```java

DBObject myDoc = coll.findOne();

System.out.println(myDoc);

```

返回类似:

```json

{

"_id" : "ac907a1f5b9d5e4a233ed300",

"name" : "MongoDB",

"type" : 1,

"info" : {

"x" : 203,

"y" : 102

},

"_ns" : "testCollection"

}

```

注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名是以“_”做为开始。

3. 加入多种文档到集合中:

```java

for(int i = 0; i < 100; i++){

coll.insert(new BasicDBObject().append("i", i));

}

```

可以通过循环来实现。注意我们可以在一个集合中插入不同类型的文档,这就是我们所说的“模式自由”(schema-free)。

4. 统计集合中的文档数量:

```java

System.out.println(coll.getCount());

```

5. 使用光标(cursor)来获取全部文档:

```java

DBCursor cur = coll.find();

while(cur.hasNext()){

System.out.println(cur.next());

}

```

为了获取集合中的所有文档,我们可以使用find()方法。这个方法返回一个DBCursor对象,来允许我们将符合查询条件的文档迭代出来。

我们可以创建一个查询,并传递给find()方法来获取集合中所有文档的一个子集。例如,我们想要查询域名为"i",并且值为71的文档:

```java

BasicDBObject query = new BasicDBObject();

query.put("i", 71);

Cursor cur = coll.find(query);

while (cur.hasNext()) {

System.out.println(cur.next());

}

```

类转换:

当把一个类对象存到mongoDB后,从mongoDB取出来时使用setObjectClass()将其转换回原来的类。

```java

public class Tweet implements DBObject {

/* ... */

}

Tweet myTweet = new Tweet();

myTweet.put("user", "bruce");

myTweet.put("message", "fun");

myTweet.put("date", new Date());

collection.insert(myTweet);

//转换

collection.setObjectClass(Tweet.class);

Tweet myTweet = (Tweet) collection.findOne();

```

11. 使用条件查询获取集合:

比较符:

- "$gt":大于

- "$gte":大于等于

- "$lt":小于

- "$lte":小于等于

- "$in":包含

例如,我们想要查询所有i>50的文档:

```java

BasicDBObject query = new BasicDBObject();

query.put("i", new BasicDBObject("$gt", 50));

Cursor cur = coll.find(query);

while (cur.hasNext()) {

System.out.println(cur.next());

}

```

以下是重构后的代码:

```java

import com.mongodb.BasicDBObject;

import com.mongodb.DBCursor;

import com.mongodb.DBObject;

import com.mongodb.MongoClient;

import com.mongodb.client.MongoCollection;

import com.mongodb.client.MongoDatabase;

import org.bson.Document;

import java.util.regex.Pattern;

public class MongoDBDemo {

public static void main(String[] args) {

MongoClient mongoClient = new MongoClient("localhost", 27017);

MongoDatabase database = mongoClient.getDatabase("test");

MongoCollection collection = database.getCollection("users");

// 查询名字匹配 joh?n 的记录,不区分大小写

Pattern pattern = Pattern.compile("joh?n", Pattern.CASE_INSENSITIVE);

BasicDBObject query = new BasicDBObject("name", pattern);

DBCursor cursor = collection.find(query);

while (cursor.hasNext()) {

System.out.println(cursor.next());

}

// 创建索引

collection.createIndex(new BasicDBObject("i", 1));

// 获取索引列表并打印

List indexList = collection.getIndexInfo();

for (DBObject o : indexList) {

System.out.println(o);

}

}

}

```

以下是重构后的代码:

```java

public class Tweet implements DBObject {

// ...

}

// 创建Tweet对象并设置属性

Tweet myTweet = new Tweet();

myTweet.put("user", userId);

myTweet.put("message", message);

myTweet.put("date", new Date());

// 将Tweet对象插入到MongoDB集合中

collection.insert(myTweet);

// 从MongoDB集合中取出文档并将其转换为DBObject接口类型

collection.setObjectClass(Tweet.class);

Tweet retrievedTweet = (Tweet) collection.findOne();

```

关于JAVA驱动的并发性,可以参考以下代码:

```java

// 创建一个单例的MongoDB驱动实例

Mongo m;

m.restartStart();

// ... 其他代码 ...

m.requestDone();

```