Mongo 在Java中的增删改查操作

来源:互联网 发布:java框架有几种 编辑:程序博客网 时间:2024/06/05 00:52

看了网上好多的代码啊,真心看着乱乱乱啊,都没心情看了,自己整理了一下,请笑纳吧得意

备注个官网上增删改查命令的网址吧,英文的http://docs.mongodb.org/manual/reference/crud/


先给大家看下我导入的包包吧

import java.net.UnknownHostException;import org.bson.types.ObjectId;import org.junit.Test;import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBCursor;import com.mongodb.DBObject;import com.mongodb.Mongo;

一、首先与数据库连接获取集合的操作

//创建Mongo对象Mongo mongo=new Mongo("localhost", 27017);//连接名为tom的数据库,如果不存在则创建DB myDB = mongo.getDB("tom");//从该数据库中获取名为mycollection  的数据集合,如果不存在则创建collectionDBCollection collection = myDB.getCollection("myCollection");

那那,之后的所有操作都是要借助这个collection(也可以换成其他的名字的)  的哦。所以果断的封装了这段代码

/** * 获取collection * @throws UnknownHostException  * */ public DBCollection getCollection() { Mongo mongo;try {mongo = new Mongo("localhost", 27017);//连接名为tom的数据库,如果不存在则创建DB myDB = mongo.getDB("tom");//从该数据库中获取名为mycollection  的数据集合,如果不存在则创建collectionDBCollection collection = myDB.getCollection("myCollection");return collection;} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} }

为了方便使用这个集合collection ,我直接弄了个全局变量

 public DBCollection collection=getCollection();

开始增删改查了~~

二、增加操作

/** * 插入数据操作 * */public int insertAction(long userId,String name,int age,String message){//创建存放数据的对象(或者是容器吧)DBObject document= new BasicDBObject();//这里存放的数据类型有好多,也可以是BasicDBObject类型的document.put("name",name);document.put("age", age);document.put("userId", userId);//              存放的类型是List<Map>List<Map> list=new ArrayList<Map>();Map<String,Object> map=new HashMap<String,Object>();map.put("message", message);list.add(map);document.put("message",list);//到此要存放的对象我就鼓捣好了,你也可以继续弄的//请看插入// 可以不加那额getN()的,加上就是返回该操作影响到的记录行数,其他的操作也可以加上这个的,效果一样return collection.insert(document).getN();// 还可以添加多条记录,还可以是List<DBObject>类型的//collection.insert(document,document,document);//              collection.insert(List<DBObject>);}



其实还有一个插入操作是save(DBObject),这个方法和insert的用法一样,但是效果不同,insert 的记录如果在数据库中存在则不作为,只有当记录不存在时才插入。而save如果发现要插入的数据已存在则更新该记录,不存在时就插入该记录。


三、查询操作

1、查询所有的记录

public void searchAll(){DBCursor cur=collection.find();while(cur.hasNext()){DBObject obj=cur.next();System.out.println("---"+obj);}}


2、根据 _id 查询用户(额,这个 _id 貌似是每个记录都有且唯一的,由于和根据其他属性查询有点不一样,所以单个列出来了,当然,我理解的有可能不对,等我查查再补充上)。看代码

collection.findOne(new BasicDBObject("_id",new ObjectId("53e18de6d294b5581f38178d")))
findOne 是查询出一条记录,find是查询出所有符合条件的记录

3、根据用户名字查询记录

/*** 按照name查找用户信息* */public BasicDBObject searchById(String name){BasicDBObject obj=(BasicDBObject)collection.findOne(new BasicDBObject("name",name));return obj;}
可怜这里我强行的只要了一个记录,其实完全有可能是重名啊对不对,反正我就这么写了,你也可以把返回的类型改成DBCursor,把findOne改成find遍历游标去吧

4、根据年龄有范围的查询~~,这个我喜欢,请注意不一样的地方安静

/***查询年龄大于Myage的用户*/public void searchByage(int Myage){DBCursor cur=collection.find(new BasicDBObject("age",new BasicDBObject("$gt",Myage)));while(cur.hasNext()){BasicDBObject tem=(BasicDBObject)cur.next();System.out.println(tem);}}

吐槽下:每次干个查询啊删除啊之类的总要先new个BasicDBObject ,你说烦人不,

看上面的写法吧,好好看看啊$gt 就是大于的意思。之后的按条件删除也可以这么用的

看下所有的条件吧奋斗

条件操作符$gt : >$lt : <$gte: >=$lte: <=$ne : !=、<>$in : in$nin: not in$all: all$not: 反匹配(1.3.3及以上版本)


四、更新操作。

这个有个update函数,还有个findAndModify ,这两个都是更新,后面的是查找并更新,上面的官网里没有这个呢。

*********************************************************************************************************************************************************

db.COLLECTION_NAME.update({},{},true|false,true|false);
第一个参数是查询选择器,与findOne的参数一样,相当于sql的where子句
第二个参数是更新操作文件,由各种更新操作符和更新值构成,
第三个参数是upsert。如果是true,表示如果没有符合查询选择器的文档,mongo将会综合第一第二个参数向集合插入一个新的文档。
第四个参数是multi。true:更新匹配到的所有文档,false:更新匹配到的第一个文档,默认值
第三第四个参数也可以合并成一个:
db.COLLECTION_NAME.update({},{},{multi:true|false,upsert:true|false});
 
拥有类似事务特性的更新与查询操作——findAndModify.
非常奇怪的是,在上面的链接里面没有找到这个函数的定义。
它是原子性的,会返回符合查询条件的更新后的文档。
一次最多只更新一个文档,也就是条件query条件,且执行sort后的第一个文档。
db.COLLECTION_NAME.findAndModify({query:{},
                                                                update:{},
                                                                remove:true|false,
                                                                new:true|false,
                                                                sort:{},
                                                                fields:{},
                                                                upsert:true|false});
query是查询选择器,与findOne的查询选择器相同
update是要更新的值,不能与remove同时出现
remove表示删除符合query条件的文档,不能与update同时出现
new为true:返回个性后的文档,false:返回个性前的,默认是false
sort:排序条件,与sort函数的参数一致。
fields:投影操作,与find*的第二个参数一致。
upsert:与update的upsert参数一样。
 
不论是update的第二个参数,还是findAndModify的update,在不指定更新操作符的情况下,将会用指定的新值替换旧值。

*******************************************************************************************************************************************

以上是网上粘来的,可以看看,我写的是最简单的方法,没有用到后面的两个参数

请看代码

collection.findAndModify(new BasicDBObject("name","tom"),new BasicDBObject("age",23));

可怜上面代码的后果是把那条名字是tom的记录直接换成了一个只有一个age属性为23 的记录了,名字神马的都没有了,所以换的时候注意下后面那参数啊

/** * 更新操作*/public void updateAction(long userId,String message){DBObject old = searchById(userId);//这个方法是我自己写的,根据userId查找记录List list=(List)old.get("message");System.out.println("****"+list);Map<String,Object> map=new HashMap<String,Object>();map.put("message", message);list.add(map);old.put("message", list);collection.findAndModify(new BasicDBObject("userId",userId),old);}

上面的样子就可以只更改message字段了大笑,当然还可以用下面的语句

collection.update(new BasicDBObject("userId",userId),old);

我发现个问题就是这两个方法使用的时候第一个参数必须在那个括号里new 放到外面new好再放到括号里就不可以了比如下面的样子就不行

BasicDBObject obj=new BasicDBObject("userId",userId);collection.update(obj,old);

上面的样子就不可以更新了,我也不知道为什么。。。。

五、删除操作~~

该操作同样有个remove 和findAndremove 估计意思和上面差不多吧,看代码

<pre name="code" class="java">/*** 删除操作*/public void delById(){//根据_id删除//System.out.print(collection.remove(new BasicDBObject("_id",new ObjectId("53e18de6d294b5581f38178d"))).getN());//这样也可以找到,就是new不new的那个话题。乱啊BasicDBObject a= new BasicDBObject("name","花了");System.out.println(collection.findOne(a));//根据姓名删除(getN返回影响的行数)System.out.print(collection.remove(new BasicDBObject("name","王五")).getN());//删除年龄大于20的用户信息//System.out.print(collection.remove(new BasicDBObject("age",new BasicDBObject("$gte",20))).getN());}


好吧,慢慢再更新吧,这个只是最基本的操作,看着不知道舒服点不吐舌头


0 0
原创粉丝点击