java 对mongodb的操作
1.1连单台mongodb
Mongo mg = newMongo();//默认连本机127.0.0.1 端口为27017
Mongo mg = newMongo(ip);//可以指定ip 端口默认为27017
Mongo mg = newMongo(ip,port);//也可以指定ip及端口号
1.2连双台mongodb
//ip为主机ip地址,port为端口号,dataBaseName相当于数据库名
DBAddress left = new DBAddress("ip:port/dataBaseName");
DBAddress right = new DBAddress("ip:port/dataBaseName");
//若一个mongodb出现问题,会自动连另外一台
Mongo mongo = new Mongo(left, right);
1.3连多台mongodb
List<ServerAddress> mongoHostList = newArrayList<ServerAddress>();
mongoHostList.add(newServerAddress("ip",port));
mongoHostList.add(newServerAddress("ip",port));
mongoHostList.add(newServerAddress("ip",port));
Mongo mg = newMongo(mongoHostList);
2.1获取mongodb的db
dataBaseName相当于关系数据库里的数据库名,mongodb中若没有该数据库名也不会报错,默认mongodb会建立这个数据库名,为空。
DB db = mg.getDB(dataBaseName); //注意:mongodb区分大小写,程序中一定要注意
2.2mongodb的db安全认证
若这个时候要想访问db中的collection(相当于关系数据库里的表),就必须通过安全认证才可以访问,否则后台会报您没有通过安全认证。
//安全认证java代码 返回true表示通过,false表示没通过不能进行操作
boolean auth =db.authenticate("userName", "password".toCharArray());
3.1得到mongodb中的db的collection
DBCollection users = db.getCollection(tableName);
参数tableName相当于关系数据库里的表名,若mongodb中没有该tableName,默认会创建该tableName,为空
3.2mongodb中的db的collection自增长主键
Mongodb中也像传统的关系数据库里表一样,有主键(_id)概念,用来唯一标识他们。当用户往collection中插入一条新记录的时候,
如果没有指定_id属性,那么mongodb会自动生成一个ObjectId类型的值,保存为_id的值。
3.3java对collection进行插入操作
//第一种插入方式
DBObject data1 = newBasicDBObject();
data1.put("cust_Id", "123456");
data1.put("is_Show", 1);
data1.put("start_time", newDate());
users.insert(data1);//等同于users.save(data1);
//第二中插入方式
BasicDBObjectBuilderdata1 =BasicDBObjectBuilder.start().add(...).add(...);
users.insert(data1.get());//等同于users.save(data1.get());
//第三种插入方式
Map<String, Object> data1 = new HashMap<String, Object>();
data1.put(...);
……
users.insert(new BasicDBObject(data1));//等同于users.save(new BasicDBObject(data1)
);
//第四中插入方式
String json = "{'database': 'mkyongDB','table' : 'hosting'," + "'detail' : {'records' : 99, 'index' : 'vps_index1', 'active' :'true'}}}";
DBObject data1 = (DBObject)JSON.parse(json);
users.insert(data1);//等同于users.save(data1);
3.4java对collection的查询操作
====================================
DBObject fields = new BasicDBObject();
fields.put("_id", false);
fields.put("tag", true);
fields.put("tv_sec", true);
DBCursor cur = users.find(query, fields);
可以用来过滤不需要获取的字段, 减少IO
====================================
//查询所有的数据find()
DBCursor cur = users.find(); while(cur.hasNext()){...}
//查询id大于等于1的记录,并且只取10条记录
DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).limit(10);
//查询id大于等于1的记录,并按id进行降序-1表示降序,1升序。
DBCursor cur = users.find(new BasicDBObject("_id",newBasicDBObject("$gte",1))).sort(newBasicDBObject("_id",-1));
//查询id大于等于1的记录,并跳过前10条记录显示 相当于id>10
DBCursor cur = users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).skip(10);
//查询id大于等于1的记录,跳过前10条记录并且只显示10条记录。相当//于分页功能where id>10 and id<=20
DBCursor cur = users.find(newBasicDBObject("_id", newBasicDBObject("$gte",1))).skip(10).limit(10);
//查询id大于等于1的所有记录数 返回int型
users.find(newBasicDBObject("_id",newBasicDBObject("$gte",1))).count()
//findAndRemove() 查询_id=30000的数据,并且删除
users.findAndRemove(newBasicDBObject("_id", 30000));
3.5java对collection的更新操作
查询id为300的记录,将cust_Id的值更新为6533615,一定要注意大小写,以及数据//类型,返回值为int表示所影响的记录条数可以用users.findOne(newBasicDBObject("_id",300));查看下,会发现这条记录//只返回两个字段了,分别为_id,cust_Id,别的字段都删除了。
users.update(newBasicDBObject("_id",300), newBasicDBObject ("cust_Id","6533615")).getN();
//这种写法可以实现只更新id为300的cust_Id值为6533615,而不删除这条记录的别的字//段属性
users.update(newBasicDBObject("_id",300), newBasicDBObject("$set",newBasicDBObject("cust_Id","6533615"))).getN();
3.6java对collection的删除操作
//移除cust_Id为6533615的数据。注意 用remove方法不释放磁盘空间,
//mongodb只在collection中做了标志,没有正在删除。
users.remove(newBasicDBObject("cust_Id","6533615")).getN();
//移除id>=1的数据
users.remove(newBasicDBObject("_id",new BasicDBObject("$gte",1))).getN();
//移除整个collection,drop也不释放磁盘空间
users.drop();
本周实验性地使用上mongodb,应用场景很简单,所以现在对mongodb了解也不是很深入。本文主要介绍mongodb的java客户端编程,这方面的内容也很简单,这里只是做个总结。不得不说,像mongodb这种介于kv和sql之间的存储,对很多的互联网应用很合适。mongodb现在的应用案例已经很多,并且社区的活跃度很高(国内也有不少人对其有很深的研究,如果有时间和精力,或许我也会投入一些对mongodb的研究),很值得期待。
言归正传,下面总结下使用Java开发mongodb应用的一些点滴。在Java中和mongodb交互的最直接的选择就是使用MongoDB Java Driver,其下载地址是:http://github.com/mongodb/mongo-java-driver/downloads。总的来说,在Java中操作mongodb的API还是很简洁,下面对其一些常见的使用做些介绍。
1、连接数据库
和mongodb建立连接的示例代码如下:
Mongo m =new Mongo("localhost",27017); DB db = m.getDB("db_test");
尽管这里获得了表示mongodb的db_test数据库连接的对象db,但这时并没有真正和mongodb建立连接,所以即便这时数据库没起来也不会抛出异常,尽管你还是需要catch它的实例化过程。mongodb的java driver对连接做了池化处理,所以应用中只需要实例化一个Mongo对象即可,对它的操作是线程安全的,这对开发使用来说真的是很方便。
2、取得DBCollection
mongodb中的collection在Java中使用DBCollection表示(这是一个抽象类,尽管你不必需要知道),创建DBCollection实例也是一行代码,和创建DB实例一样,这个操作并不涉及真正的和数据库之间的通信。
DBCollection coll = db.getCollection("collection1");
要获得类似mysql中“show tables”功能,可以使用如下代码:
Set<String> colls = db.getCollectionNames();for(String s : colls){System.out.println(s);}3、插入文档
mongodb存储JSON格式的文档,而在Java中表示这种数据格式的最简便的类就是Map了。MongoDB Java Driver中提供的BasicDBObject就是个Map(它继承自LinkedHashMap并实现DBObject接口),它会将Map中的数据转换成BSON格式传输到mongodb。下面是插入文档的示例:
DBCollection coll=db.getCollection("collection1");
BasicDBObject doc=new BasicDBObject();
doc.put("name","kafka0102");doc.put("age",28);doc.put("time", newDate());
coll.insert(doc);
mongodb中每个插入的文档会产生个唯一标识_id。当调用coll.insert(doc);时,driver会检查其中是否有_id字段,如果没有则自动生成ObjectId实例来作为_id的值,这个ObjectId由4部分编码而成:当前时间、机器标识、进程号和自增的整数。
insert函数也支持插入文档列表:
insert(List<DBObject> list)
而提交操作也有update( DBObject q , DBObject o )、remove( DBObject o )。
4、查询文档4.1、findOne
findOne是查询满足条件的第一条记录(不意味着数据库满足条件的只有一条记录),查询条件使用DBObject表示,示例如下:
DBCollection coll=db.getCollection("collection1");
BasicDBObject cond=new BasicDBObject();
cond.put("name","kafka0102");cond.put("age",28);
DBObject ret=coll.findOne(cond);System.out.println(ret);
返回结果是个DBObject,可以通过get(key)来取值。对于查询条件,可以通过嵌套多层来表示复杂的格式,比如:
query=newBasicDBObject();
query.put("i", new BasicDBObject("$gt",50));// e.g. find all where i > 50
4.2、find
find函数是查询集合的,它返回的DBCursor是DBObject的迭代器,使用示例如下:
DBCollection coll=db.getCollection("collection1");
BasicDBObject cond=new BasicDBObject();cond.put("i", new BasicDBObject("$gt",20).append("$lte",30));
DBCursor ret=coll.find(cond);
while(ret.hasNext()){System.out.println(ret.next());}
5、使用索引
创建索引语句如:coll.createIndex(new BasicDBObject(“i”, 1)); ,其中i表示要索引的字段,1表示升序(-1表示降序)。可以看到,DBObject成为java客户端通用的结构表示。查看索引使用DBCollection.getIndexInfo()函数。
6、MongoDB Java Driver的并发性
前面提到,Java MongoDB Driver使用了连接的池化处理,这个连接池默认是保持10个连接,可以通过Option进行修改,在应用中使用Mongo的一个实例即可。连接池中的每个连接使用DBPort结构表示(而不是DBCollection),并寄存于DBPortPool中,所以对DBCollection的操作并不意味着使用同一个连接。如果在应用的一次请求过程中,需要保证使用同一个连接,可以使用下面的代码片断:
DB db...; db.requestStart();//code.... db.requestDone();
在requestStart和requestDone之间使用的连接就不是来自于DBPortPool,而是当前线程中的ThreadLocal结构变量(MyPort中保持了DBPort成员)。
7、其他选择
尽管Java mongodb driver很不错,但就像很多人不使用JDBC而使用一些ORM框架,mongodb的java客户端也有其他的选择。
1)对POJO和DAO的支持。对于那些热衷ORM的人来说,Morphia(http://code.google.com/p/morphia/wiki/QuickStart)是个不错的选择,它通过在POJO中添加注释来实现映射,并提供对DAO的CRUD操作的支持。
2)对DSL的支持。Sculptor就是这样的东西,使用者编写中立的DSL文件,Sculptor将其翻译成代码。这通常不具有吸引力,除非是多语言的应用,能将DSL翻译成多种编程语言,否则除了增加学习成本,没什么收益。
3)对JDBC的支持。mongo-jdbc是这样的东西,但现在还是实验性质的。它或许是想亲近Java程序员,不过它显然不能完全兼容JDBC,而很多Java程序员对JDBC也并不感冒,所以它不是很值得使用。
java 对mongodb的操作的更多相关文章
- mongodb高级操作及在Java企业级开发中的应用
Java连接mongoDB Java连接MongoDB需要驱动包,个人所用包为mongo-2.10.0.jar.可以在网上下载最新版本. package org.dennisit.mongodb.st ...
- Java对MongoDB进行分组操作并统计各个分组的数量
最近在检索MongoDB的数据时需要用到分组操作,由于没有现成的说明文档可参考,只能是在代码中不断调试.摸索前进:目前已现实了Java对MongoDB的分组操作,并统计各个分组的数量.现通过示例详细解 ...
- Java 连接MongoDB
1.驱动 通过java连接MongoDB需要一个java版的驱动 下载地址:http://mongodb.github.io/mongo-java-driver/ 2.连接MongoDB 通过 com ...
- Java实现mongodb原生增删改查语句
Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...
- 第12章—使用NoSQL数据库—使用MongoDB+Jpa操作数据库
使用MongoDB+Jpa操作数据库 SpringData还提供了对多种NoSQL数据库的支持,包括MongoDB;neo4j和redis.他不仅支持自动化的repository,还支持基于模板的数据 ...
- MongoDB的基本使用及java对MongoDB的基本增删改查
MongoDB的特点 MongoDB 是文档存储数据库,存储结构灵活 MongoDB 支持复杂查询操作.支持序列 MongoDB 采用C++开发,可以做分布式扩展 MongoDB 采用BSON格式存储 ...
- MongoDB第三天(正则,管道,聚合,字符串,算术,日期,java连接MongoDB)
部分正则表达式: i:忽略大小写 m:多行查找 x:设置 x 选项后,正则表达式中的非转义的空白字符将被忽略. s:允许点字符(即.)匹配包括换行符在内的所有字符. w:匹配包括下划线的任何单词字 ...
- java 连接 mongodb 及使用
MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB. 一.引入MongoDB Java Driver包 如果需要操作MongoDB的J ...
- java 实现mongoDB 增加,删除,修改,查看,多条件查询,聚合查询,分组查询(史上最全)
首先idea创建一手springboot项目 引入如下依赖 <dependency> <groupId>org.mongodb</groupId> <arti ...
随机推荐
- 一步步实现windows版ijkplayer系列文章之一——Windows10平台编译ffmpeg 4.0.2,生成ffplay
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- Git GUI可视化操作教程
1.在本地新建版本库 首先,我们打开Git GUI是这样的一个界面,选择第一项,新建版本库. 然后选择你需要进行版本管理的项目路径,我选择了一个LoginDemo的项目. 当你创建了版本库的时候, ...
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- 用Executors工具类创建线程池
多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 线程池主要用来解决线程生命周期开销问题和资源不足问题.通过对多个任务重用线程,线程创建 ...
- Java 在方法和作用域内的内部类
通常,如果所读写 的代码包含了内部类,那么它们都是"平凡的"内部类,简单并且容易理解,然而,内部类的语法覆盖了大量其它的更加难以理解的计数,例如可以在一个方法里或者在任意的作用域里 ...
- 2018-11-1 NOIP 模拟赛解题报告
T1 Domino 多米诺骨牌 题目大意 给你N个骨牌,上下各有一个数,要使上面一排的和为偶数,同时下面一排的和也为偶数,最多要翻转多少次?如果无法达成那么输出-1. 解法 水题秒切 根据数的奇偶性质 ...
- mysql 5.7 百度云网盘下载
mysql 百度云下载 链接: https://pan.baidu.com/s/1fPSEcgtDN7aU2oQ_sL08Ww 提取码: 关注公众号[GitHubCN]回复2539获取
- rabbitmq 相关
Exchange 在上一节我们看到生产者将消息投递到Queue中,实际上这在RabbitMQ中这种事情永远都不会发生.实际的情况是,生产者将消息发送到Exchange(交换器,下图中的X),由Exch ...
- P3402 最长公共子序列
P3402 最长公共子序列经典问题LCS-->LIS把第一数列转化成1~n,然后将第二个数列映射成1~n中的一些数,然后求第二个数列的LIS即可,然后用Bit求LIS,O(nlogN) //数据 ...
- Mac idea 快捷键
Mac键盘符号和修饰键说明 ⌘ Command⇧ Shift⌥ Option⌃ Control↩︎ Return/Enter⌫ Delete⌦ 向前删除键(Fn+Delete)↑ 上箭头↓ 下箭头← ...