这个页面使用 MongoDB Java Driver 的简要说明.
关于 Java API 的更多信息, 请转到 online API Documentation for Java Driver.
使用 Java driver 非常简单。首先,确保 mongo.jar
包含在你的 classpath 中。下面的代码片段可在driver范例examples/QuickTour.java找到。
要连接一个 MongoDB, 你至少需要要连接的数据库的名字。数据库并不必须事先存在——如不存在,MongoDB会帮你创建。
还有,在连接的时候你可以指定服务器地址和端口号。下面的例子展示了三种连接本地数据库mydb的方式。
import com.mongodb.MongoClient; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.ServerAddress; import java.util.Arrays; // 直接连接一个单独的 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))); DB db = mongoClient.getDB( "mydb" );
此时,db客户端已经能连接一个指定的MongoDB服务器了。这样,你可做进一步的操作了。
注意:
MongoClient
实例实际上代表一个对数据库的连接池;甚至在多线程时你也只需要一个MongoClient
的实例。看 concurrency 文档页面获取更多信息。
MongoClient
类被设计成线程安全、线程间共享。典型地,对一个给定的数据库集群你只创建一个实例,并在你的应用中交叉使用。如果由于某些原因你决定创建许多的MongoClient
实例,请注意:
MongoClient
实例MongoClient.close()来清除资源
版本 2.10.0的更新:MongoClient 类是版本 2.10.0的新添加的. 先前发布的版本,请使用 Mongo 类代替。
认证 (可选)
当获取数据库被用户名和密码控制认证时,MongoDB 可以运行在安全模式下。此模式下,任何客户端在做任何操作前都要提供用户名和密码。在 Java driver, 你只需用
MongoClient
实例做如下的简单操作:MongoClient mongoClient = new MongoClient();
DB db = mongoClient.getDB("test"); boolean auth = db.authenticate(myUserName, myPassword);如果用户名和密码合法,认证成功。否则,失败。如果可能你应该查看 MongoDB 日志获取更多信息。
在一个可信的环境中,大多数用户以不需认证的方式运行MongoDB。
获取一个集合列表
每个数据库有0到多个集合。你可以从 db 中检索其中的一列(并打印出来)。
Set<String> colls = db.getCollectionNames(); for (String s : colls) { System.out.println(s); }假设在数据库中有两个集合,分别是name 和 address ,你会看到
name address这样的输出。
获得一个连接
要获得一个连接,只需指定集合的名称给 getCollection(String collectionName)方法 :
DBCollection coll = db.getCollection("testCollection");一旦有你有了这个集合对象,你现在可以做如插入数据、查询等事情了。
设置 Write Concern
在版本 2.10.0, 默认的 write concern 是 WriteConcern.ACKNOWLEDGED, 但也很容易改变 :
mongoClient.setWriteConcern(WriteConcern.JOURNALED);对 write concern 有很多选项. 还有在数据库、集合和独立更新操作中默认的 write concern 可以被覆盖。请看 API Documentation 以获得更多细节。
在版本 2.10.0 中改变了: 之前的版本 2.10.0, 默认的 concern 是 WriteConcern.NORMAL. 在正常情况下,客户端一般会改变这个以确保写入数据库发生问题时能被通知到。
插入一个文档
一旦你有了集合对象,你可以插入文档到集合中。例如,做一个如下的JSON 格式的小文档:
{ "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { x : 203, y : 102 } }注意上面的文档包含一个"内置的"文档。要这样做的话,我们可以用 BasicDBObject 类去创建文档(包含内置文档),然后只要用
insert()
方法插入到集合中就可以了。BasicDBObject doc = new BasicDBObject("name", "MongoDB"). append("type", "database"). append("count", 1). append("info", new BasicDBObject("x", 203).append("y", 102)); coll.insert(doc);用
findOne()查找集合中的第一个文档
要看上一步中我们插入的文档,我们可以用一个简单的 findOne() 操作获得集合中的第一个文档。这个方法返回一个独立的文档(不是DBCursor 的 find() 操作返回的),只有一个文档的时候很有用,或者你只对第一个感兴趣 。你不需要处理指针。
DBObject myDoc = coll.findOne();
System.out.println(myDoc);and you should see
{ "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102}}
注意:
_id 元素已由
MongoDB 自动添加到你的文档。记住, MongoDB 保留以 “_”/”$” 的元素名为内部使用。
添加多个文档
为了用查询做更多有趣的事情,让我们添加多个文档到集合中。这些集合如下:
{ "i" : value }我们可以在一个循环中做得很有效
for (int i=0; i < 100; i++) { coll.insert(new BasicDBObject("i", i)); }
注意,我们可以插入不同形态的文档到同一个集合中。这就是我们说的mOngoDB是 "无定势的"。
统计一个集合中的文档数
既然我们已经插入了101个集合 (循环中100个,加上第一个), 我么可以用
getCount()
方法检查他们是否都在。System.out.println(coll.getCount());应该打印出
101
.
用一个指针获得所有的文档
为了获得集合中的所有文档,我们将用
find()
方法。find()
方法返回一个DBCursor
对象,允许我们迭代匹配查询的文档集合。那么查询所有的文档并打印出来。
DBCursor cursor = coll.find(); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); }应该打印出集合中的所有101个文档。
用一个查询获得单个集合
我们可以创建一个查询,传一个参数给find() 方法,以获得集合中的一个子集。例如,如果我们想找到"i" 域的值是71的文档,我们可以这么做:
BasicDBObject query = new BasicDBObject("i", 71); cursor = coll.find(query); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); }应该只打印一个文档
{ "_id" : "49903677516250c1008d624e" , "i" : 71 }你可能经常会看见 MongoDB 的例子和文档中 使用 $ 操作符,例如:
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
这些在Java driver 中代表正则
String
键, 使用内置DBObjects
:BasicDBObject query = new BasicDBObject("j", new BasicDBObject("$ne", 3)). append("k", new BasicDBObject("$gt", 10)); cursor = coll.find(query); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); }
用一个查询获得一个文档集合
我们可以用查询从集合中获得一个文档集。例如,如果我们想获得 "i" > 50 的所有文档,我们会这样写:
query = new BasicDBObject("i", new BasicDBObject("$gt", 50)); // e.g. find all where i > 50 cursor = coll.find(query); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); }应该打印出i > 50 的文档。
我们也可以获得一个范围,假如
20 < i <= 30
:
query = new BasicDBObject("i", new BasicDBObject("$gt", 20). append("$lte", 30)); // i.e. 20 < i <= 30 cursor = coll.find(query); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); }管理函数快揽
创建一个索引
MongoDB 支持索引,他们很容易加到一个集合上。要创建一个索引,你只需指定要索引的域,并制定索引是升序(1)还是降序(-1)。下面在i域上创建一个升序索引:
coll.createIndex(new BasicDBObject("i", 1)); // create index on "i", ascending
Getting a List of Indexes on a Collection
You can get a list of the indexes on a collection:
List<DBObject> list = coll.getIndexInfo(); for (DBObject o : list) { System.out.println(o); }and you should see something like
{ "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} }Getting A List of Databases
You can get a list of the available databases:
MongoClient mongoClient = new MongoClient(); for (String s : mongoClient.getDatabaseNames()) { System.out.println(s); }删除一个数据库
你可以通过名字用一个
MongoClient
实例删除一个数据库:MongoClient mongoClient = new MongoClient(); mongoClient.dropDatabase("myDatabase");