MongoDB Java驱动快速上手
Posted 秋风Haut
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB Java驱动快速上手相关的知识,希望对你有一定的参考价值。
本人这段时间做毕业设计项目用到了Mongo数据库,但是对Mongo的java驱动不怎么了解,刚好学校让做外文翻译,于是,我灵机一动,要不把Mongo Java驱动的官方文档给翻译了吧。于是就有了下面这个。
注:本人对Mongo的部署还没有了解太深刻,因此文中涉及相关内容的翻译可能不太准确,请在留言区提出,我以后会不定时更新和修改。
先放出官网链接:
http://mongodb.github.io/mongo-java-driver/3.0/
http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/
获取连接:
MongoDB驱动提供了5种获取连接的方式: 如果库里没有这个数据库 mongodb会自动为你创建
//这种创建方式不会主动发现主服务器(MongoDb可服务器集群部署),即使它是一个复制集的成员。
MongoClient mongoClient = new MongoClient();
MongoClient mongoClient = new MongoClient( "localhost" );
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
//通过一个复制集连接,自动发现主服务器,需提供一个连接列表。
MongoClient mongoClient = new MongoClient( Arrays.asList(new ServerAddress("localhost", 27017), new ServerAddress("localhost", 27018), new ServerAddress("localhost", 27019)));
//还可以通过连接字符串来连接
MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017,localhost:27018,localhost:27019");
MongoClient mongoClient = new MongoClient(connectionString);
//连接
MongoDatabase database = mongoClient.getDatabase("mydb");
这时,这个database对象就是连接指定数据库的一个连接。
MongoClient实际上代表的是这个数据库的连接池。只是即使是多线程环境下,你也只需要一个MongoClient
*PS:很明显你在指定的数据库簇上只创建了一个MongoClient但是在整个项目中使用了它。当创建多实例时:
1、所有的资源限制对每个MongoClient实例都有效。
2、用完记得使用MongoClient.close()关闭资源。*
得到一个集合:
为了得到一个集合进行操作,你需要向getCollection方法指定集合名字。下面的例子会得到一个与test集合连接:
MongoCollection<Document>collection=database.getCollection("test");
插入一个文档:
一旦拥有了集合对象,你就可以向集合中插入文档。比如,考虑以下这个json文档,其中有一个info字段是一个嵌套文档:
"name" : "MongoDB",
"type" : "database",
"info" :
x : 203,
你可以使用document类来使用java驱动来创建文档,你也可以使用此类来创建嵌套文档。
Document doc = new Document("name","MongoDB"
.append("type", "database")
.append("info",
new Document("x", 203).
);
使用insertOne()方法来向集合中插入文档:
collection.insertOne(doc);
批量插入文档:
使用insertMany()方法来批量插入文档:
接下来的例子将会添加多个文档:
"i" : value
循环创建文档:
List<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100; i++)
documents.add(new Document("i", i));
将documents对象传给insertMany()方法即可将文档批量插入集合中
collection.insertMany(documents);
collection中的Count函数:
现在我们已经向collection中插入101个文档,100个批量插入,加上第一个.我们可以通过count()方法来检查是否全部成功.以下的语句应该打印出101:
System.out.println(collection.count());
查询集合:
使用find()来查询集合:
查询集合中的第一个文档:
在find()操作上,在调用first()方法,就可以查看第一个文档.collection.find().first() 会返回第一个文档或空,而不是一个cursor.这对单一文档或你只关心第一个文档的查询非常有利.以下例子会只返回find()查询结果中的第一个文档:
Document myDoc = collection.find().first();
System.out.println(myDoc.toJson());
应该打印出以下结果:
"_id" : "$oid" : "551582c558c7b4fbacf16735",
"name" : "MongoDB",
"type" : "database",
"count" : 1, "
"info" :
"x" : 203,
注:_id元素会被自动添加到MongoDB中,值不与展示出的一致,MongoDB内部使用的所有字段将会以$和_开头
搜索集合中的所有文档
使用find()方法可以获取集合中的所有元素,
find()方法会返回一个FindIterator实例,该实例提供了链接与控制查找操作的非常流畅的接口,使用iterator()方法来得到collection上的iterator实例,这个实例则用来查询和迭代。接下来的代码查询出集合中所有的文档,并打印出来。
尽管以下的foreach循环可能会被使用,但我们不推荐这样做,因为如果循环体提前结束的话就会出现错误。(这里不明白为什么)
for(Document cur : collection.find())
System.out.println(cur.toJson());
使用查询过滤器来得到一个文档:
我们可以通过向find()方法传进一个参数,来构建一个查询过滤器,来从集合中得到一个文档。比如我们想要得到那个id为71的文档,就可以这样做:
import static com.mongodb.client.model.Filters.*;
myDoc = collection.find(eq("id", 71)).first();
System.out.println(myDoc.toJson());
它应该只打印一个文档。
"_id" : "$oid" : "5515836e58c7b4fbc756320b" ,
注:可以使用Filters, Sorts 和 Projections 来构建一个简洁清晰的查询。
使用Query来得到一个文档集
可以使用Query来得到一个文档集,如,要得到所有id>50的文档,就可以这样做:
// now use a range query to get a larger subset
Block<Document> printBlock = new Block<Document>()
@Override
public void apply(final Document document)
System.out.println(document.toJson());
;
collection.find(gt("id", 50)).forEach(printBlock);
注意:我们这里对应用了文档block的findIterable使用了forEach()方法,这样我们可以打印出所有id>50的文档。
还可以得到一个范围:50
// 2. Ordered bulk operation - order is guarenteed
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))));
// 2. Unordered bulk operation - no guarantee of order of operation
collection.bulkWrite(
Arrays.asList(new InsertOneModel<>(new Document("_id", 4)),
new InsertOneModel<>(new Document("_id", 5)),
new InsertOneModel<>(new Document("_id", 6)),
new UpdateOneModel<>(new Document("_id", 1),
new Document("$set", new Document("x", 2))),
new DeleteOneModel<>(new Document("_id", 2)),
new ReplaceOneModel<>(new Document("_id", 3),
new Document("_id", 3).append("x", 4))),
new BulkWriteOptions().ordered(false));
注:不推荐在2.6以前版本的mongo上进行块操作
http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/
以上是关于MongoDB Java驱动快速上手的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB快速入门学习笔记8 MongoDB的java驱动操作
使用 mongodb 的 Docker Image 快速上手系列 lab