设为首页 收藏本站
查看: 1960|回复: 0

[经验分享] MongoDB java客户端mongo-java-driver使用

[复制链接]

尚未签到

发表于 2015-11-11 07:18:58 | 显示全部楼层 |阅读模式
  上一节我们了解了通过客户端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(&quot;192.168.36.61&quot;, 23000);
// 1.数据库列表
for (String s : mongoClient.getDatabaseNames()) {
System.out.println(&quot;DatabaseName=&quot; + s);
}
// 2.链接student数据库
DB db = mongoClient.getDB(&quot;student&quot;);
mongoClient.setWriteConcern(WriteConcern.JOURNALED);
// 3.用户验证
@SuppressWarnings(&quot;deprecation&quot;)
boolean auth = db.authenticate(&quot;admin&quot;, &quot;&quot;.toCharArray());
System.out.println(&quot;auth=&quot; + auth);
// 4.集合列表
Set<String> colls = db.getCollectionNames();
for (String s : colls) {
System.out.println(&quot;CollectionName=&quot; + s);
}
// 5.获取摸个集合对象
DBCollection coll = db.getCollection(&quot;user&quot;);
System.out.println(&quot;----------save-------------&quot;);
save(coll);
System.out.println(&quot;----------query-------------&quot;);
query(coll);
System.out.println(&quot;----------update-------------&quot;);
update(coll);
System.out.println(&quot;----------delete-------------&quot;);
delete(coll);
}
// 新增数据
public static void save(DBCollection coll) {
BasicDBObject doc = new BasicDBObject(&quot;_id&quot;, &quot;6&quot;).append(&quot;name&quot;, new BasicDBObject(&quot;username&quot;, &quot;zhangsan&quot;).append(&quot;nickname&quot;, &quot;张三&quot;))
.append(&quot;password&quot;, &quot;123456&quot;).append(&quot;password&quot;, &quot;123456&quot;).append(&quot;regionName&quot;, &quot;北京&quot;).append(&quot;works&quot;, &quot;5&quot;).append(&quot;birth&quot;, new Date());
WriteResult result = coll.insert(doc);
System.out.println(&quot;insert-result: &quot; + 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(&quot;全部--------&quot; + cursor.next());
}
// 4查询 - 过滤 - 等于
BasicDBObject query = new BasicDBObject(&quot;age&quot;, 1);
cursor = coll.find(query);
while (cursor.hasNext()) {
System.out.println(&quot;age=1--------&quot; + cursor.next());
}
// 5查询 - 过滤条件 - 不等于
query = new BasicDBObject(&quot;age&quot;, new BasicDBObject(&quot;$ne&quot;, 1));
cursor = coll.find(query);
while (cursor.hasNext()) {
System.out.println(&quot;age!=1&quot; + cursor.next());
}
// 6查询 - 过滤条件 - 20 < i <= 30
query = new BasicDBObject(&quot;age&quot;, new BasicDBObject(&quot;$gt&quot;, 20).append(&quot;$lte&quot;, 30));
cursor = coll.find(query);
while (cursor.hasNext()) {
System.out.println(&quot;20<age<=30&quot; + cursor.next());
}
}
//更新
public static void update(DBCollection coll) {
DBObject search = coll.findOne(new BasicDBObject(&quot;_id&quot;, &quot;6&quot;));
BasicDBObject object = new BasicDBObject().append(&quot;$set&quot;, new BasicDBObject(&quot;password&quot;, &quot;1211111&quot;)).append(&quot;$set&quot;,
new BasicDBObject(&quot;birth&quot;, 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(&quot;update-result: &quot; + result);
}
//删除
public static void delete(DBCollection coll) {
DBObject search = coll.findOne(new BasicDBObject(&quot;_id&quot;, &quot;6&quot;));  
WriteResult result = coll.remove(search);  
System.out.println(&quot;remove-result: &quot; + result);  
}
}
3.mongodb java驱动并发    
     Java MongoDB驱动程序是线程安全的。如果在Web服务器环境中使用,那么应该创建一个MongoClient实例全局使用。MongoClient内部维护了数据库的连接池(默认连接池大小为10)。每次DB请求(查询、插入等)的Java线程将从连接池中获取链接并进行支持,然后释放连接。每次使用连接是不相同的。
      在复制(replica)模式下,如果设置slaveOK选项为on,那么读操作会被均匀的分布到各个slave上。这意味着对于同一个线程,一个写操作后紧跟着的一个读操作,有可能被发送到不同的服务器上(写操作发送到master上,读操作发送到slave上),这样读操作有可能不会立刻反映出上一个写操作的数据(因为主从的异步性)。
      如果你想要确保在一个session中完整的一致性(例如在一个http请求中),你可能希望java驱动是用同一个socket连接,这时你可以通过使用&quot;consistent request&quot;来达到目的——在操作前后分别调用requestStart()和requestDone()。DB和DBCollection完全是线程安全的。事实上,你不管怎么样调用都是同一实例,因为他们进行了缓存。
  

DB db...;
db.requestStart();
try {
db.requestEnsureConnection();
code....
} finally {
db.requestDone();
}在单独写操作上的WriteConcern选项

默认情况下,每次写操作后,连接就被释放回连接池——此时你调用getLastError()是没用的。

所以可以采用两种方式:  
  1,使用类&#20284;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({&quot;age&quot;:1});

DSC0000.jpg

第一种方法

查询第一页的数据:db.test.find().sort({&quot;age&quot;:1}).limit(2);

DSC0001.jpg

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

   DSC0002.jpg

查询其他页数以此类推。。。

第二种方法

查询第一页的数据:db.test.find().sort({&quot;age&quot;:1}).limit(2);

  

跟上面的第一种方法一样的。

查询第二页的数据:

   DSC0003.jpg

这个是获取第一页最后一条记录的&#20540;,然后排除前面的记录,就能获取到新的记录了

总结来说,如果数据量不是很大的话,可以使用第一种方法,毕竟比较简单,如果数据量比较大的话,使用第二种方法比较好,因为这样就可以不用到skip()这个函数,skip跳过太多的记录,效率有点低。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137662-1-1.html 上篇帖子: Mongodb数据库集群分片技术 下篇帖子: 30分钟学MongoDB系列 ——MapReduce处理和Mongo管理工具使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表