MongoDB java客户端mongo-java-driver使用

上一节我们了解了通过客户端mongo对数据库进行访问,本节我们使用mongodb的java驱动来操作mongodb数据库。

官方文档:http://docs.mongodb.org/ecosystem/drivers/java/

1.添加maven 依赖jar包

<dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongo-java-driver</artifactId>
			<version>2.13.0</version>
		</dependency>
2.java操作实例,详情参考代码

package cn.slimsmart.mongodb.demo.crud;

import java.net.UnknownHostException;
import java.util.Date;
import java.util.Set;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteConcern;
import com.mongodb.WriteResult;

public class MongoTest {

	private static MongoClient mongoClient;

	public static void main(String[] args) throws UnknownHostException {
		// 初始化mongoClient
		mongoClient = new MongoClient("192.168.36.61", 23000);
		// 1.数据库列表
		for (String s : mongoClient.getDatabaseNames()) {
			System.out.println("DatabaseName=" + s);
		}
		// 2.链接student数据库
		DB db = mongoClient.getDB("student");
		mongoClient.setWriteConcern(WriteConcern.JOURNALED);

		// 3.用户验证
		@SuppressWarnings("deprecation")
		boolean auth = db.authenticate("admin", "".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");
		System.out.println("----------save-------------");
		save(coll);
		System.out.println("----------query-------------");
		query(coll);
		System.out.println("----------update-------------");
		update(coll);
		System.out.println("----------delete-------------");
		delete(coll);
	}

	// 新增数据
	public static void save(DBCollection coll) {
		BasicDBObject doc = new BasicDBObject("_id", "6").append("name", new BasicDBObject("username", "zhangsan").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);
	}
	//查询
	public static void query(DBCollection coll) {
		// 1查询 - one
		DBObject myDoc = coll.findOne();
		System.out.println(myDoc);
		// 2 查询 - 数量
		System.out.println(coll.getCount());
		// 3查询 - 全部
		DBCursor cursor = coll.find();
		while (cursor.hasNext()) {
			System.out.println("全部--------" + cursor.next());
		}
		// 4查询 - 过滤 - 等于
		BasicDBObject query = new BasicDBObject("age", 1);
		cursor = coll.find(query);
		while (cursor.hasNext()) {
			System.out.println("age=1--------" + cursor.next());
		}

		// 5查询 - 过滤条件 - 不等于
		query = new BasicDBObject("age", new BasicDBObject("$ne", 1));
		cursor = coll.find(query);
		while (cursor.hasNext()) {
			System.out.println("age!=1" + cursor.next());
		}

		// 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());
		}
	}
	
	//更新
	public static void update(DBCollection coll) {
		DBObject search = coll.findOne(new BasicDBObject("_id", "6"));
		BasicDBObject object = new BasicDBObject().append("$set", new BasicDBObject("password", "1211111")).append("$set",
				new BasicDBObject("birth", new Date()));
		/*
		 * upsert when true, inserts a document if no document matches the update query criteria
		 * multi when true, updates all documents in the collection that match the update query criteria, otherwise only updates one
		 */
		WriteResult result = coll.update(search, object, true, true);
		System.out.println("update-result: " + result);
	}

	//删除
	public static void delete(DBCollection coll) {
		DBObject search = coll.findOne(new BasicDBObject("_id", "6"));  
		WriteResult result = coll.remove(search);  
		System.out.println("remove-result: " + result);  
	}
}
3.mongodb 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();
}

4.mongoDB分页的两种方法

mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的
下面这个是我的测试数据
db.test.find().sort({"age":1}); 

第一种方法
查询第一页的数据:db.test.find().sort({"age":1}).limit(2);

查询第二页的数据:db.test.find().sort({"age":1}).skip(2).limit(2);


查询其他页数以此类推。。。
第二种方法
查询第一页的数据:db.test.find().sort({"age":1}).limit(2);


跟上面的第一种方法一样的。
查询第二页的数据:


这个是获取第一页最后一条记录的值,然后排除前面的记录,就能获取到新的记录了
总结来说,如果数据量不是很大的话,可以使用第一种方法,毕竟比较简单,如果数据量比较大的话,使用第二种方法比较好,因为这样就可以不用到skip()这个函数,skip跳过太多的记录,效率有点低。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用介绍了使用无认证方式连接MongoDB数据库的方法。首先需要创建一个MongoDB客户端,指定服务器的IP地址和端口号,然后获取要连接的数据库。接下来可以进行基本操作,如创建集合。引用展示了使用直连方式连接MongoDB数据库的代码示例。其中的MongoDBUtil类提供了获取数据库和集合的方法。引用则展示了使用直连方式支持用户认证的代码示例,其中的MongoDBAuthUtil类提供了创建带有用户认证信息的MongoDB连接的方法。根据您提供的代码引用,似乎您正在尝试使用mongo命令的--out选项。然而,在您提供的引用中,并没有提到与mongo命令行工具相关的内容。请提供更多信息,以便我能够更好地回答您的问题。123 #### 引用[.reference_title] - *1* [Java操作MongoDB使用mongo-java-driver](https://blog.csdn.net/jinxilongjxl/article/details/108734824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* *3* [mongo-java-driver操作MongoDB](https://blog.csdn.net/hc1285653662/article/details/122445381)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值