MongoDB 3.x+Java 官方学习资料

mongodb3.x的时候,网上很多博客都是2.x的,比起一遍又一遍得再stackoverflow搜索,不如拿起来官方最新文档学习一遍。

MongoDB 3.4+Java驱动文档

  • MongoDB Driver Quick Start Java的快速使用文档,对于想快速上手同学,可以比对下面的官方的demo快速学习

注:下面的代码片段来自github中的QuickTour.java示例代码,在github的driver资源中找到。

前提条件

  • 使用默认端口27017在本地主机A上运行MongoDB
  • MongoDB的驱动程序。关于如何安装驱动程序的MongoDB,请参见安装
  • 下面是一些import语句:
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.ServerAddress;

import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;

import org.bson.Document;
import java.util.Arrays;
import com.mongodb.Block;

import com.mongodb.client.MongoCursor;
import static com.mongodb.client.model.Filters.*;
import com.mongodb.client.result.DeleteResult;
import static com.mongodb.client.model.Updates.*;
import com.mongodb.client.result.UpdateResult;
import java.util.ArrayList;
import java.util.List;

建立连接

通过使用MongoClient()建立一个连接,获取到MongoDB的实例。

该MongoClient实例表示到数据库的一个连接池,即使是多个线程,你也只需要MongoClient的一个实例。

重要提示
通常,你只创建一个MongoClient实例去获得已经部署的MongoDB数据库(例如:standalone部署,Replica Set部署,或Sharded cluster部署)并在你的应用程序使用。然而,如果你创建多个实例:
- 对于每个MongoClient实例,都受资源使用的限制(例如:最大连接数等)
- 要清理一个实例,调用MongoClient.close()清理资源。

连接到一个MongoDB实例

下面的例子显示五种方式连接到本地机器上mydb数据库,如果数据库不存在,MongoDB的会为您创建它。

连接到一个MongoDB实例:

  • 您可以实例化一个对象MongoClient不带任何参数来连接到端口27017本地主机上运行的MongoDB实例:
MongoClient mongoClient =new MongoClient();
  • 您可以明确指定主机名来连接到端口27017指定的主机上运行的MongoDB实例:
MongoClient mongoClient = new MongoClient( “localhost”);
  • 你可以明确地指定主机名和端口:
MongoClient mongoClient =new MongoClient( “localhost”,27017);
  • 您可以指定MongoClientURI连接字符串:
MongoClientURI connectionString =new MongoClientURI( “mongodb://localhost:27017”);
MongoClient mongoClient =new MongoClient(的connectionString);

连接字符串大多遵循RFC 3986,与域名的除外。MongoDB的,它可以列出用逗号分隔的多个域名。有关连接字符串的更多信息,请参见连接字符串。

进入数据库

一旦你有MongoClient实例并连接到MongoDB数据库,可以使用MongoClient.getDatabase()方法来访问数据库。

指定数据库的getDatabase()方法的名称。如果数据库不存在,MongoDB会在你第一次储存数据时创建数据库。

下面是连接“mydb”数据库的例子

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

MongoDatabase实例是不可变的。(一个MongoDatabase对象只对应一个数据库)

访问集合

当你有一个MongoDatabase实例时,通过getCollection()方法来访问集合..

getCollection()指定的集合不存在数据库时,MongoDB会在你第一次储存数据时创建集合。

例如,下面的语句,使用数据库实例来访问名为mydb数据库中的test集合:

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

MongoCollection实例是不可变的。(这里的不可变意思同上)

创建文档

使用(mongodb的)java驱动来创建文档,使用文档类。

例如,请看以下JSON文件:

  {
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
   "versions": [ "v3.2", "v3.0", "v2.6" ],
   "info" : { x : 203, y : 102 }
  }

使用Java驱动创建Document ,用字段和值作为构造方法实例化Document 对象,append()方法添加其他字段和值。这个值也可以是其他的Document 对象

 Document doc = new Document("name", "MongoDB")
                .append("type", "database")
                .append("count", 1)
                .append("versions", Arrays.asList("v3.2", "v3.0", "v2.6"))
                .append("info", new Document("x", 203).append("y", 102));

注:BSON 类型的数组 对应Java类型的 java.util.List.
BSON类型的数组以及相应的类型在Java中可以看到。

插入Document

当你有了Document对象,,你能将Document插入该集合.

插入一个Document

要插入一个document到集合,使用集合的insertOne()方法。

collection.insertOne(doc);

注:如果最顶级的字段没有指定_id,MongoDB将在自动添加_id字段在Document中。

下面是一个插入多个Document的例子

{ "i" : value }

在循环中创建Document添加到documents集合中

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

要在集合中插入这些documents,通过insertMany()方法插入documents集合。

collection.insertMany(documents);

注:如果最顶级的字段没有指定_id,MongoDB将在自动添加_id字段在Document中。

集合中Document的大小

计算集合中Document的数量,可以通过集合的count()方法。下面的代码应输出101(insertMany插入100个加上insertOne插入1个)。

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

查询集合Query the Collection

使用find()方法查询集合。To query the collection, you can use the collection’s find() method。不使用任何参数将查询所有文档,使用过滤器可以查询所有满足过滤条件的对象。

find()方法返回一个FindIterable() 实例。他提供一个接口方便链式调用其他方法。

查询集合中的第一个document
使用find().first()返回集合中的第一个document

如果集合为空,将返回null。

TIP
如果你只对集合中的第一个感兴趣使用find().first()方法

例子

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

打印

{ "_id" : { "$oid" : "551582c558c7b4fbacf16735" },
  "name" : "MongoDB",
  "type" : "database",
  "count" : 1,
  "info" : { "x" : 203, "y" : 102 } }

NOTE
_ id字段将自动填加到mongodb中,你的document和值将于这里展示的有所不同。MongoDB保存 “_” 开始的字段, “$” 在内部使用。

查询集合中的全部document

取出集合中的全部document,不加任何参数调用find()方法。

通过迭代器遍历所有结果,需要在find()后加iterator()

下面这个集合取出全部document并打印所有返回的document(101 documents):

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

不建议使用迭代器来遍历,入伙循环提前结束,将导致cursor对象内存泄漏。

for (Document cur : collection.find()) {
    System.out.println(cur.toJson());
}

指定查询过滤器

通过匹配条件来查询所有document,在find() 方法加入过滤器参数.。java驱动提供了过滤器帮助来方便得创建过滤器对象。

得到一个匹配过滤条件的document。
例如:查询第一个i等于71的document, 通过eq过滤对象来充当条件。

myDoc = collection.find(eq("i", 71)).first();
System.out.println(myDoc.toJson()); 

例子打印:

{ “_id” : { “$oid” : “5515836e58c7b4fbc756320b” }, “i” : 71 }

获得所有匹配过滤条件的documents
下面这个例子打印所有i>50的documents

Block<Document> printBlock = new Block<Document>() {
     @Override
     public void apply(final Document document) {
         System.out.println(document.toJson());
     }
};

collection.find(gt("i", 50)).forEach(printBlock);

这个例子对FindIterable 对象调用forEach 方法,将对每一个Block中的document调用apply() [一开始没看懂forEach,后来想了想觉得应该是用了模板方法,foreach函数内遍历Block集合,对集合内每个Document调用apply()]

过滤一定范围内的值,例如 50 < i <= 100

collection.find(and(gt("i", 50), lte("i", 100))).forEach(printBlock);

更新documents

集合中更新document使用 updateOne 和updateMany 方法。

传递一个过滤器对象到方法中,实现对特定对象的更新。

更新一个对象

使用 updateOne

更新第一个i等于10的Document,并将i的值设置为110:

collection.updateOne(eq("i", 10), new Document("$set", new Document("i", 110)));

更新多个文档
使用updateMany 方法

得到将i小于100的Document,再将Documenti的值从增加到100

UpdateResult updateResult = collection.updateMany(lt("i", 100), inc("i", 100));
System.out.println(updateResult.getModifiedCount());

删除文档

使用deleteOne 和deleteMany 方法.

删除所有i为100的值

collection.deleteOne(eq("i", 110));

通过过滤器删除多个文档

使用deleteMany方法

以下示例删除i大于或等于100的所有文档:

DeleteResult deleteResult = collection.deleteMany(gte("i", 100));
System.out.println(deleteResult.getDeletedCount());

创建索引

要给一个或多个字段创建索引,通过 createIndex() 方法.。

new Document(<-field1>, <-type1>).append(<-field2->, <-type2>) …
升序索引类型, 将 <-type> 置为1.
降序索引类型, 将 <-type> 置为-1.
下面例子指定升序:

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

查看一个集合的索引类型,看 Create Indexes

其他信息

其他文档查看Java Driver Tutorials

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值