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