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

[经验分享] java操作mongo的一点记录

[复制链接]

尚未签到

发表于 2016-12-2 08:55:38 | 显示全部楼层 |阅读模式
  一、驱动
  mongo对应的java驱动的下载地址
  https://github.com/mongodb/mongo-java-driver/downloads
  二、文档
  API文档的地址
  http://api.mongodb.org/java/
  官方入门地址
  http://www.mongodb.org/display/DOCS/Java+Tutorial
  在java里像在shell里一样操作mongo的一个东东
  http://www.jongo.org
  三、官方的几点说明(未完全翻译官方网站提供的所有内容)
  1.java驱动的并发情况
      mongo db的java驱动是线程安全的,在一个web项目中,可以创建一个Mongo的单例,然后在每次请求时都使用这个单例。该单例会维护一个内部的连接池(默认大小为10),对于每次对DB的请求(find、insert等),java线程都会从连接池中获取一个连接,进行操作,然后释放连接,所以,每次使用的连接可能不总是同一个连接。如果你想一直使用同一个连接,可以用下边这种方式:
  


DB db...;
db.requestStart();
code....
db.requestDone();
  

      但是如果最后db.requestDone()没有被调用,该连接不会被交还给线程池,所以,一定要在finally块中调用db.requestDone()。
      DB和DBCollection都是线程安全的。
      在默认配置的情况下,每次对DB请求(find、insert等)后,连接会被交还给连接池,你并不知道是否操作成功,这会造成“数据无故丢失”的情况。所以,对于数据安全性比较重要的操作,我们要使用WriteConcern.SAFE模式,这样,驱动会在将连接交还前调用getLastError()方法来校验是否操作成功。示例如下:
  


DBCollection coll...;
coll.insert(..., WriteConcern.SAFE);
  2.数据类型
  (1)正则表达式
     java驱动使用java.util.regex.Pattern做正则表达式:

Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE);
BasicDBObject query = new BasicDBObject("name", john);
// finds all people with "name" matching /joh?n/i
DBCursor cursor = collection.find(query);
  (2)日期、时间
      java驱动使用java.util.Date做日期:

Date now = new Date();
BasicDBObject time = new BasicDBObject("ts", now);
collection.save(time);
  (3)内嵌文档

{
"x" : {
"y" : 3
}
}
  上边这种文档结构可以用下边这种方式存储

BasicDBObject y = new BasicDBObject("y", 3);
BasicDBObject x = new BasicDBObject("x", y);
  (4)数组
      扩展自List的结构都可以用数组形式存储

{
"x" : [
1,
2,
{"foo" : "bar"},
4
]
}
  上边这种结构形式可以用下边这种方式存储

ArrayList x = new ArrayList();
x.add(1);
x.add(2);
x.add(new BasicDBObject("foo", "bar"));
x.add(4);
BasicDBObject doc = new BasicDBObject("x", x);
  四、MongoOptions
  java驱动中,可以在获取mongo实例时,指定一些参数,如下:
  ServerAddress serverAddress=new ServerAddress("127.0.0.1",27017);
  MongoOptions mongoOptions=new MongoOptions();
  Mongo mongo=new Mongo(serverAddress,mongoOptions);
  参数列表如下:
  #控制系统在发生连接错误时是否重试 ,默认为false --boolean
  mongo.options.autoConnectRetry=false
  #每个主机允许的连接数(每个主机的连接池大小),当连接池被用光时,会被阻塞住 ,默认为10 --int
  mongo.options.connectionsPerHost=10
  #设置等待获取连接池连接的最大数,比如,connectionsPerHost 是10,threadsAllowedToBlockForConnectionMultiplier 是5,则最多有50个线程可以等待获取连接 --int
  mongo.options.threadsAllowedToBlockForConnectionMultiplier=5
  #被阻塞线程从连接池获取连接的最长等待时间(ms) --int
  mongo.options.maxWaitTime 
  #在建立(打开)套接字连接时的超时时间(ms),默认为0(无限) --int
  mongo.options.connectTimeout=0
  #套接字超时时间;该值会被传递给Socket.setSoTimeout(int)。默认为0(无限) --int
  mongo.options.socketTimeout=0
  #This controls whether or not to have socket keep alive turned on (SO_KEEPALIVE). defaults to false --boolean
  mongo.options.socketKeepAlive=false
  #Override the DBCallback factory. Default is for the standard Mongo Java driver configuration --DBCallbackFactory
  mongo.options.dbCallbackFactory 
  #//指明是否允许驱动从次要节点或者奴隶节点读取数据,默认为false --boolean
  mongo.options.slaveOk=false
  #如果为true,驱动每次update后会发出一个getLastError命令来保证成功,默认为false --boolean
  mongo.options.safe=false 
  #If set, the w value of WriteConcern for the connection is set to this. Defaults to 0; implies safe = true --int
  mongo.options.w=0
  #If set, the wtimeout value of WriteConcern for the connection is set to this. Defaults to 0; implies safe = true --int
  mongo.options.wtimeout=0
  #Sets the fsync value of WriteConcern for the connection. Defaults to false; implies safe = true --boolean
  mongo.options.fsync=false
  五、杂
  ObjectId由4部分编码而成:当前时间、机器标识、进程号和自增的整数。
  排序加翻页
  collection.find(queryObject).sort(new BasicDBObject().append("pt", "-1").append("ct", "1")).skip(10).limit(10);
  小记录:
  从名为tag的数组中删除值为123的元素
  BasicDBObject updateObject = new BasicDBObject().append("$pull", new BasicDBObject().append("tag","123"));
  //queryObject是查询条件
  dbCollection.updateMulti(queryObject, updateObject);
  六、操作
  查询数量,以下三种方式未发现明显性能差别,相对于在mongoVUE里查询,都表现较慢

//  方式一
long count=collection.find(queryObject).count();
//方式二,可以查询某个字段的数量
long count=collection.getCount(queryObject,new BasicDBObject().append("_id", 1));
//方式三
long count=collection.count(queryObject);
  批量从数组中删除元素

//从name等于xiaoming的文档中批量删除tag数组中的r521元素
collection.updateMulti(new BasicDBObject().append("name", "xiaoming"),
new BasicDBObject().append("$pull", new BasicDBObject().append("tag","r521")));
   存图片文件
  


String newFileName = "mkyong-java-image";
File imageFile = new File("c:\\JavaWebHosting.png");
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
gfsFile.save();
  取图片文件
  


String newFileName = "mkyong-java-image";
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
System.out.println(imageForOutput);
  打印所有图片

GridFS gfsPhoto = new GridFS(db, "photo");
DBCursor cursor = gfsPhoto.getFileList();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
  存到另外一个文件中
  


String newFileName = "mkyong-java-image";
GridFS gfsPhoto = new GridFS(db, "photo");
GridFSDBFile imageForOutput = gfsPhoto.findOne(newFileName);
imageForOutput.writeTo("c:\\JavaWebHostingNew.png"); //output to new file
  删除图片
  


String newFileName = "mkyong-java-image";
GridFS gfsPhoto = new GridFS(db, "photo");
gfsPhoto.remove(gfsPhoto.findOne(newFileName));
  to be continued...

运维网声明 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-308475-1-1.html 上篇帖子: 查看mongo数据库的慢查询 下篇帖子: 为什么人们对mongo感兴趣
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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