MongoDB Java驱动快速上手

来源:互联网 发布:linux vi退出命令 编辑:程序博客网 时间:2024/05/09 16:27

本人这段时间做毕业设计项目用到了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 guarenteedcollection.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 operationcollection.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/

1 0
原创粉丝点击