转自:http://limingnihao.iteye.com/blog/1940438
第3章 MongoDB的Java驱动
(黎明你好原创作品,转载请注明)
3.1 下载Java驱动
3.1.1 Jar包
http://central.maven.org/maven2/org/mongodb/mongo-java-driver/
3.1.2 Maven
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>2.10.1</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
3.2 基本操作
3.2.1 基本操作
- String myUserName = "admin";
- String myPassword = "admin";
- MongoClient mongoClient = new MongoClient("localhost", 27017);
- // 1.数据库列表
- for (String s : mongoClient.getDatabaseNames()) {
- System.out.println("DatabaseName=" + s);
- }
- // 2.链接student数据库
- DB db = mongoClient.getDB("student");
- mongoClient.setWriteConcern(WriteConcern.JOURNALED);
- // 3.用户验证
- boolean auth = db.authenticate(myUserName, myPassword.toCharArray());
- System.out.println("auth=" + auth);
- // 4.集合列表
- Set<String> colls = db.getCollectionNames();
- for (String s : colls) {
- System.out.println("CollectionName=" + s);
- }
- // 5.获取摸个集合对象
- DBCollection coll = db.getCollection("user");
3.2.2 新增
- BasicDBObject doc = new BasicDBObject("_id", "6").append("name", new BasicDBObject("username", "limingnihao").append("nickname", "黎明你好")).append("password", "123456")
- .append("password", "123456").append("regionName", "北京").append("works", "5").append("birth", new Date());
- WriteResult result = coll.insert(doc);
- System.out.println("insert-result: " + result);
3.2.3 查询
- // 2.1查询 - one
- DBObject myDoc = coll.findOne();
- System.out.println(myDoc);
- // 2.2 查询 - 数量
- System.out.println(coll.getCount());
- // 2.3查询 - 全部
- DBCursor cursor = coll.find();
- while (cursor.hasNext()) {
- System.out.println("全部--------" + cursor.next());
- }
- // 2.4查询 - 过滤 - 等于
- BasicDBObject query = new BasicDBObject("age", 1);
- cursor = coll.find(query);
- while (cursor.hasNext()) {
- System.out.println("age=1--------" + cursor.next());
- }
- // 2.5查询 - 过滤条件 - 不等于
- query = new BasicDBObject("age", new BasicDBObject("$ne", 1));
- cursor = coll.find(query);
- while (cursor.hasNext()) {
- System.out.println("age!=1" + cursor.next());
- }
- // 2.6查询 - 过滤条件 - 20 < i <= 30
- query = new BasicDBObject("age", new BasicDBObject("$gt", 20).append("$lte", 30));
- cursor = coll.find(query);
- while (cursor.hasNext()) {
- System.out.println("20<age<=30" + cursor.next());
- }
3.2.4 修改
- DBObject search = coll.findOne(new BasicDBObject("_id", "5"));
- BasicDBObject object = new BasicDBObject().append("$set", new BasicDBObject("password", "1211111")).append("$set", new BasicDBObject("birth", new Date()));
- WriteResult result = coll.update(search, object, true, true);
- System.out.println("update-result: " + result);
3.2.5 删除
- DBObject search = coll.findOne(new BasicDBObject("_id", "6"));
- WriteResult result = coll.remove(search);
- System.out.println("remove-result: " + result);
3.3 Java驱动并发
Java MongoDB驱动程序是线程安全的。如果在Web服务器环境中使用,那么应该创建一个MongoClient实例全局使用。MongoClient内部维护了数据库的连接池(默认连接池大小为10)。每次DB请求(查询、插入等)的Java线程将从连接池中获取链接并进行支持,然后释放连接。每次使用连接是不相同的。
在复制(replica)模式下,如果设置slaveOK选项为on,那么读操作会被均匀的分布到各个slave上。这意味着对于同一个线程,一个写操作后紧跟着的一个读操作,有可能被发送到不同的服务器上(写操作发送到master上,读操作发送到slave上),这样读操作有可能不会立刻反映出上一个写操作的数据(因为主从的异步性)。
如果你想要确保在一个session中完整的一致性(例如在一个http请求中),你可能希望java驱动是用同一个socket连接,这时你可以通过使用"consistent request"来达到目的——在操作前后分别调用requestStart()和requestDone()。
DB和DBCollection完全是线程安全的。事实上,你不管怎么样调用都是同一实例,因为他们进行了缓存。
- DB db...;
- db.requestStart();
- try {
- db.requestEnsureConnection();
- code....
- } finally {
- db.requestDone();
- }
在单独写操作上的WriteConcern选项
默认情况下,每次写操作后,连接就被释放回连接池——此时你调用getLastError()是没用的。
所以可以采用两种方式:
1,使用类似WriteConcern.SAFE这样的写策略来代替默认策略,这样java驱动会自动首先调用getLastError(),然后才将连接放回连接池。
- DBCollection coll...;
- coll.insert(..., WriteConcern.SAFE);
2,采用上述的requestStart()和requestDone()方式来维持连接不被释放,中间调用getLastError()获取错误信息。
- DBCollection coll...;
- coll.insert(..., WriteConcern.SAFE);
- DB db...;
- DBCollection coll...;
- db.requestStart();
- try {
- coll.insert(...);
- DBObject err = db.getLastError();
- } finally {
- db.requestDone();
- }