分享

MongoDB Java 入门手册

xioaxu790 发表于 2014-9-7 21:35:00 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 10584
问题导读
1、Java中如何与一个 MongoDB建立连接?
2、在 Java driver,如何用 MongoClient 做安全认证?
3、如何用 MongoClient 实例删除一个数据库?







安装:
下载安装包,双击安装。还要下载Java的驱动包。
启动:默认要在c盘根目录下先创建\data\db文件夹(否则在启动服务时添加 --dbpath d:\data,即指定数据库数据存放的地址)
  1. mkdir data\db    //用于存放数据文件
  2. cd C:\Program Files\MongoDB 2.6 Standard\bin  //转到安装地址
  3. mongod    //启动数据库服务,运行下面的程序时保证此窗口一直开着
  4. mongo     //启动客户端
复制代码


简介
这个页面使用 MongoDB Java Driver 的简要说明.
关于 Java API 的更多信息, 请转到online API Documentation for Java Driver.


快速浏览
使用 Java driver 非常简单。首先,确保 mongo.jar 包含在你的 classpath 中。下面的代码片段可在driver范例examples/QuickTour.java找到。

建立连接
要连接一个 MongoDB, 你至少需要要连接的数据库的名字。数据库并不必须事先存在——如不存在,MongoDB会帮你创建。
还有,在连接的时候你可以指定服务器地址和端口号。下面的例子展示了三种连接本地数据库mydb的方式。
  1. import com.mongodb.MongoClient;
  2. import com.mongodb.MongoException;
  3. import com.mongodb.WriteConcern;
  4. import com.mongodb.DB;
  5. import com.mongodb.DBCollection;
  6. import com.mongodb.BasicDBObject;
  7. import com.mongodb.DBObject;
  8. import com.mongodb.DBCursor;
  9. import com.mongodb.ServerAddress;
  10. import java.util.Arrays;
  11. // 直接连接一个单独的 MongoDB 服务器 (注意这不会自动发现最好的,即使它是复制集的成员之一)
  12. MongoClient mongoClient = new MongoClient();
  13. // 或
  14. MongoClient mongoClient = new MongoClient( "localhost" );
  15. // 或
  16. MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
  17. // 或, 要连接一个复制集,自动发现最好的,提供一列成员种子
  18. MongoClient mongoClient = new MongoClient(Arrays.asList(new ServerAddress("localhost", 27017),
  19.                                       new ServerAddress("localhost", 27018),
  20.                                       new ServerAddress("localhost", 27019)));
  21. 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 实例做如下的简单操作:
  1. MongoClient mongoClient = new MongoClient();
  2. DB db = mongoClient.getDB("test");
  3. boolean auth = db.authenticate(myUserName, myPassword);
复制代码

如果用户名和密码合法,认证成功。否则,失败。如果可能你应该查看 MongoDB 日志获取更多信息。
在一个可信的环境中,大多数用户以不需认证的方式运行MongoDB。

获取一个集合列表
每个数据库有0到多个集合。你可以从 db 中检索其中的一列(并打印出来)。
  1. Set<String> colls = db.getCollectionNames();
  2. for (String s : colls) {
  3.     System.out.println(s);
  4. }
复制代码


假设在数据库中有两个集合,分别是name 和 address ,你会看到
  1. name
  2. address
复制代码

这样的输出。

获得一个连接
要获得一个连接,只需指定集合的名称给 getCollection(String collectionName)方法 :
DBCollection coll = db.getCollection("testCollection");
一旦有你有了这个集合对象,你现在可以做如插入数据、查询等事情了。

设置 Write Concern
在版本 2.10.0, 默认的 write concern 是 WriteConcern.ACKNOWLEDGED, 但也很容易改变 :
  1. mongoClient.setWriteConcern(WriteConcern.JOURNALED);
复制代码

对 write concern 有很多选项. 还有在数据库、集合和独立更新操作中默认的 write concern 可以被覆盖。请看 API Documentation 以获得更多细节。
在版本 2.10.0 中改变了: 之前的版本 2.10.0, 默认的 concern 是 WriteConcern.NORMAL. 在正常情况下,客户端一般会改变这个以确保写入数据库发生问题时能被通知到。

插入一个文档
一旦你有了集合对象,你可以插入文档到集合中。例如,做一个如下的JSON 格式的小文档:
  1. {
  2.    "name" : "MongoDB",
  3.    "type" : "database",
  4.    "count" : 1,
  5.    "info" : {
  6.                x : 203,
  7.                y : 102
  8.              }
  9. }
复制代码

注意上面的文档包含一个"内置的"文档。要这样做的话,我们可以用 BasicDBObject 类去创建文档(包含内置文档),然后只要用 insert() 方法插入到集合中就可以了。
  1. BasicDBObject doc = new BasicDBObject("name", "MongoDB").
  2.                               append("type", "database").
  3.                               append("count", 1).
  4.                               append("info", new BasicDBObject("x", 203).append("y", 102));
  5. coll.insert(doc);
复制代码



用 findOne()查找集合中的第一个文档
要看上一步中我们插入的文档,我们可以用一个简单的 findOne() 操作获得集合中的第一个文档。这个方法返回一个独立的文档(不是DBCursor 的 find() 操作返回的),只有一个文档的时候很有用,或者你只对第一个感兴趣 。你不需要处理指针。
  1. DBObject myDoc = coll.findOne();
  2. System.out.println(myDoc);
  3. and you should see
  4. { "_id" : "49902cde5162504500b45c2c" ,
  5.   "name" : "MongoDB" ,
  6.   "type" : "database" ,
  7.   "count" : 1 ,
  8.   "info" : { "x" : 203 , "y" : 102}}
复制代码

注意:
_id 元素已由 MongoDB 自动添加到你的文档。记住, MongoDB 保留以 “_”/”$” 的元素名为内部使用。

添加多个文档
为了用查询做更多有趣的事情,让我们添加多个文档到集合中。这些集合如下:
  1. {
  2.    "i" : value
  3. }
复制代码


我们可以在一个循环中做得很有效
  1. for (int i=0; i < 100; i++) {
  2.     coll.insert(new BasicDBObject("i", i));
  3. }
复制代码

注意,我们可以插入不同形态的文档到同一个集合中。这就是我们说的mOngoDB是 "无定势的"。

统计一个集合中的文档数
既然我们已经插入了101个集合 (循环中100个,加上第一个), 我么可以用 getCount() 方法检查他们是否都在。
  1. System.out.println(coll.getCount());
复制代码

应该打印出 101.

用一个指针获得所有的文档
为了获得集合中的所有文档,我们将用 find() 方法。 find() 方法返回一个 DBCursor 对象,允许我们迭代匹配查询的文档集合。那么查询所有的文档并打印出来。
  1. DBCursor cursor = coll.find();
  2. try {
  3.    while(cursor.hasNext()) {
  4.        System.out.println(cursor.next());
  5.    }
  6. } finally {
  7.    cursor.close();
  8. }
复制代码

应该打印出集合中的所有101个文档。

用一个查询获得单个集合
我们可以创建一个查询,传一个参数给find() 方法,以获得集合中的一个子集。例如,如果我们想找到"i" 域的值是71的文档,我们可以这么做:
  1. BasicDBObject query = new BasicDBObject("i", 71);
  2. cursor = coll.find(query);
  3. try {
  4.    while(cursor.hasNext()) {
  5.        System.out.println(cursor.next());
  6.    }
  7. } finally {
  8.    cursor.close();
  9. }
复制代码


应该只打印一个文档
  1. { "_id" : "49903677516250c1008d624e" , "i" : 71 }
复制代码


你可能经常会看见 MongoDB 的例子和文档中 使用 $ 操作符,例如:
db.things.find({j: {$ne: 3}, k: {$gt: 10} });
这些在Java driver 中代表正则  String 键, 使用内置 DBObjects:
  1. BasicDBObject query = new BasicDBObject("j", new BasicDBObject("$ne", 3)).
  2.                                       append("k", new BasicDBObject("$gt", 10));
  3. cursor = coll.find(query);
  4. try {
  5.    while(cursor.hasNext()) {
  6.        System.out.println(cursor.next());
  7.    }
  8. } finally {
  9.    cursor.close();
  10. }
复制代码


用一个查询获得一个文档集合
我们可以用查询从集合中获得一个文档集。例如,如果我们想获得 "i" > 50 的所有文档,我们会这样写:
  1. query = new BasicDBObject("i", new BasicDBObject("$gt", 50));  // e.g. find all where i > 50
  2. cursor = coll.find(query);
  3. try {
  4.    while(cursor.hasNext()) {
  5.        System.out.println(cursor.next());
  6.    }
  7. } finally {
  8.    cursor.close();
  9. }
复制代码


应该打印出i > 50 的文档。
我们也可以获得一个范围,假如 20 < i <= 30:
  1. query = new BasicDBObject("i", new BasicDBObject("$gt", 20).
  2.                                                append("$lte", 30));  // i.e.   20 < i <= 30
  3. cursor = coll.find(query);
  4. try {
  5.    while(cursor.hasNext()) {
  6.        System.out.println(cursor.next());
  7.    }
  8. } finally {
  9.    cursor.close();
  10. }
复制代码


管理函数快揽
创建一个索引
MongoDB 支持索引,他们很容易加到一个集合上。要创建一个索引,你只需指定要索引的域,并制定索引是升序(1)还是降序(-1)。下面在i域上创建一个升序索引:
  1. coll.createIndex(new BasicDBObject("i", 1));  // create index on "i", ascending
  2. Getting a List of Indexes on a Collection
  3. You can get a list of the indexes on a collection:
  4. List<DBObject> list = coll.getIndexInfo();
  5. for (DBObject o : list) {
  6.    System.out.println(o);
  7. }
  8. and you should see something like
  9. { "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} }
  10. Getting A List of Databases
  11. You can get a list of the available databases:
  12. MongoClient mongoClient = new MongoClient();
  13. for (String s : mongoClient.getDatabaseNames()) {
  14.    System.out.println(s);
  15. }
复制代码


删除一个数据库
你可以通过名字用一个 MongoClient 实例删除一个数据库:
  1. MongoClient mongoClient = new MongoClient();
  2. mongoClient.dropDatabase("myDatabase");
复制代码




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条