问题导读
1、Java中如何与一个 MongoDB建立连接?
2、在 Java driver,如何用 MongoClient 做安全认证?
3、如何用 MongoClient 实例删除一个数据库?
安装:
下载安装包,双击安装。还要下载Java的驱动包。
启动:默认要在c盘根目录下先创建\data\db文件夹(否则在启动服务时添加 --dbpath d:\data,即指定数据库数据存放的地址)
- mkdir data\db //用于存放数据文件
- cd C:\Program Files\MongoDB 2.6 Standard\bin //转到安装地址
- mongod //启动数据库服务,运行下面的程序时保证此窗口一直开着
- mongo //启动客户端
复制代码
简介
这个页面使用 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 ,你会看到
复制代码
这样的输出。
获得一个连接
要获得一个连接,只需指定集合的名称给 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 保留以 “_”/”$” 的元素名为内部使用。
添加多个文档
为了用查询做更多有趣的事情,让我们添加多个文档到集合中。这些集合如下:
复制代码
我们可以在一个循环中做得很有效
- 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");
复制代码
|