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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值