Mongodb java driver 3.x 常用方法

在pom.xml配置依赖

<dependencies>  
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>  

导入常用的包

import com.mongodb.MongoClient;  
import com.mongodb.MongoClientURI;  
import com.mongodb.client.MongoCollection;  
import com.mongodb.client.MongoCursor;  
import com.mongodb.client.MongoDatabase;  
import org.bson.Document;  
import org.bson.conversions.Bson;  
import org.bson.types.ObjectId;

// 导入com.mongodb.client.model.Filters类中的静态方法
import static com.mongodb.client.model.Filters.*;  
import static com.mongodb.client.model.Projections.*;  

连接数据库

有四种连接方法,具体参考: 官方文档

这里使用

MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017,localhost:27018,localhost:27019");  
MongoClient mongoClient = new MongoClient(connectionString);

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

阿里云官方推荐使用方法,支持主从节点不固定的情况下,自动识别。

获取 collection

MongoCollection<Document> collection = database.getCollection("test");  

插入文档

文档结构:

{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
   "info" : {
               x : 203,
               y : 102
             }
}

相应的Bson Document对象:

Document doc = new Document("name", "MongoDB")  
               .append("type", "database")
               .append("count", 1)
               .append("info", new Document("x", 203).append("y", 102));

// 插入文档               
collection.insertOne(doc);  

注意:info 使用内嵌对象

插入多个文档

List<Document> documents = new ArrayList<Document>();  
for (int i = 0; i < 100; i++) {  
    documents.add(new Document("i", i));
}

collection.insertMany(documents);  

统计文档总数

System.out.println(collection.count());  

查询单篇文档

Document myDoc = collection.find().first();  
System.out.println(myDoc.toJson());  

查询所有文档

MongoCursor<Document> cursor = collection.find().iterator();  
try {  
    while (cursor.hasNext()) {
        System.out.println(cursor.next().toJson());
    }
} finally {
    cursor.close();
}

使用查询过滤器

  • 查询单篇文档
import static com.mongodb.client.model.Filters.*;

myDoc = collection.find(eq("i", 71)).first();  
System.out.println(myDoc.toJson());  
  • 查询多篇文档
MongoCursor<Document> cursor = dbCollection  
                .find(gt("i", 0))
                .iterator();

while (cursor.hasNext()) {  
            System.out.println(cursor.next());
        }                
  • 指定多个查询条件
// 10 <= i <= 100
Bson filter = and(gte("i",10),lte("i",100));  
// status = 1
filter = and(filter, eq("status",1));  
myDoc = collection.find(filter).first()  
  • 使用ID查询
// 使用ObjectId对象来包装id
Document doc = dbCollection  
.find(eq("_id", new ObjectId("576c00b50cf23b8ea4175a14")))
.first();

使用排序

import static com.mongodb.client.model.Sorts.*;

// ascending 升序 descending 降序 
myDoc = collection.find(exists("i")).sort(descending("i")).first();  
System.out.println(myDoc.toJson());  

指定查询字段

// excludeId() 排除_id字段
myDoc = collection.find().projection(excludeId()).first();  
System.out.println(myDoc.toJson());

// 只包含部分字段
myDoc = collection.find().projection(include("news_title","news_posttime")).first();  
System.out.println(myDoc.toJson());

// 上面的查询是会返回_id字段的,如果要排除_id字段,可以使用Bson 类型来限定多个条件
Bson fields = include("news_title", "news_uuid", "news_posttime");  
fields = and(fields, excludeId());  
// 只返回news_title,news_uuid字段
myDoc = collection.find().projection(fields).first();  
System.out.println(myDoc.toJson());  

更新文档

  • 更新单个文档
collection.updateOne(eq("i", 10), set("i", 110));  
  • 更新多个文档
UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100));  
System.out.println(updateResult.getModifiedCount());  

删除文档

  • 删除单个文档
collection.deleteOne(eq("i", 110));  
  • 删除多个文档
DeleteResult deleteResult = collection.deleteMany(gte("i", 100));  
System.out.println(deleteResult.getDeletedCount());