Java操作MongoDB数据库方法详解
Java与mongodb的连接
1.连单台mongodb
Mongomg=newMongo();//默认连本机127.0.0.1端口为27017 Mongomg=newMongo(ip);//可以指定ip端口默认为27017 Mongomg=newMongo(ip,port);//也可以指定ip及端口
2.连双台mongodb
//ip为主机ip地址,port为端口号,dataBaseName相当于数据库名 DBAddressleft=newDBAddress("ip:port/dataBaseName"); DBAddressright=newDBAddress("ip:port/dataBaseName"); //若一个mongodb出现问题,会自动连另外一台 Mongomongo=newMongo(left,right);
3.连多台mongodb
ListmongoHostList=newArrayList (); mongoHostList.add(newServerAddress("ip",port)); mongoHostList.add(newServerAddress("ip",port)); mongoHostList.add(newServerAddress("ip",port)); Mongomg=newMongo(mongoHostList);
Java获取mongodb的数据库名
1.获取mongodb的db(数据库)
//dataBaseName相当于关系数据库里的数据库名,mongodb中若没有该 //数据库名也不会报错,默认mongodb会建立这个数据库名,为空。 DBdb=mg.getDB(dataBaseName);
注意:mongodb区分大小写,程序中一定要注意
2.mongodb的db安全认证
//安全认证java代码返回true表示通过,false表示没通过不能进行操作 db.authenticate("userName","password".toCharArray()); if(db.authenticate("admin","123".toCharArray())){ System.out.println("连接mongodb成功..."); }else{ System.out.println("连接mongodb失败..."); }
Java对mongodb的collection进行crud操作
1.得到mongodb中的db的collection(表)
//参数tableName相当于关系数据库里的表名, //若mongodb中没有该tableName,默认会创建该tableName,为空 DBCollectionusers=db.getCollection(tableName); //列出库的集合列表,相对于表对象 Setcolls=db.getCollectionNames(); for(Strings:colls){ } //获取单个集合 DBCollectioncon=db.getCollection("users");
2.mongodb中的db的collection自增长主键
Mongodb中也像传统的关系数据库里表一样,有主键(_id)概念,用来唯一标识他们。当用户往collection中插入一条新记录的时候,如果没有指定_id属性,那么mongodb会自动生成一个ObjectId类型的值,保存为_id的值。
_id的值可以为任何类型,除了数组,在实际应用中,鼓励用户自己定义_id值,但是要保证他的唯一性。
传统的数据库中,通常用一个递增的序列来提供主键,在Mongodb中用ObjectId来代替,我们可以通过如下的方法来得到主键。
publicclassTools{ /** *实现mongodb主键自增长的功能 *@paramusers *@paramtableName *@return */ publicstaticlonggetNext(DBCollectionusers,StringtableName){ longincId=0; try{ DBObjectret=users.findAndModify( newBasicDBObject("_id",tableName),null,null,false, newBasicDBObject("$inc",newBasicDBObject("next",1)), true,true); incId=Long.valueOf(ret.get("next").toString()); }catch(Exceptione){ e.printStackTrace(); } returnincId; } }
3.java对collection进行插入操作
DBdb=m.getDB("testdb"); DBCollectioncon=db.getCollection("users"); //普通添加 BasicDBObjectdoc=newBasicDBObject(); doc.put("name","MongoDB"); doc.put("type","database"); doc.put("count",1); BasicDBObjectinfo=newBasicDBObject(); info.put("x",203); info.put("y",102); doc.put("info",info); con.insert(doc);//插入对象 //特殊添加 //添加多个特殊数据(模式自由) for(inti=1;i<=20;i++){ con.insert(newBasicDBObject().append("i",i)); } DBObjectuser_json=(DBObject)JSON.parse("{'user':[{'name':'AAA','age':'18'},{'name':'BBB','age':'19'}]}"); con.insert(user_json); //添加JAVA对象 //添加java对象,对象要序列化Serializable接口 UserInfouserinfo=newUserInfo("用户甲AA",1); Useruser=newUser(1,"123",userinfo); ByteArrayOutputStreamos=newByteArrayOutputStream(); ObjectOutputStreamout=newObjectOutputStream(os); out.writeObject(user); os.close();out.close(); con.insert(MonGoUtil.insertObject("user_info",os.toByteArray())); Listlist=newArrayList (); list.add(newUserInfo("List1",1)); list.add(newUserInfo("List2",2)); list.add(newUserInfo("List3",3)); ByteArrayOutputStreamos=newByteArrayOutputStream(); ObjectOutputStreamout=newObjectOutputStream(os); out.writeObject(list); os.close();out.close(); con.insert(MonGoUtil.insertObject("lists",os.toByteArray()));
4.java对collection的查询操作
/**输出获取到的文档**/ publicstaticvoidshowDBCursor(DBCursorcur){ while(cur.hasNext()){ System.out.println(cur.next()); } System.out.println(); }
高级查询
//查询_id为30000返回cust_Id的值,mongodb查询都会返回主键的值 System.out.println(users.findOne(newBasicDBObject("_id",30000),newBasicDBObject("cust_Id",true))); findAndRemove()查询_id=30000的数据,并且删除 users.findAndRemove(newBasicDBObject("_id",30000)); findAndModify介绍 users.findAndModify( newBasicDBObject("_id",28),//查询_id=28的数据 newBasicDBObject("cust_Id",true),//查询cust_Id属性 newBasicDBObject("notice_Id",true),//按照notice_Id排序 false,//查询到的记录是否删除,true表示删除 newBasicDBObject("province_Id","100"),//将province_id的值改为100 true,//是否返回新记录true返回,false不返回 true//如果没有查询到该数据是否插collectiontrue入库,false不入 ));
查询所有数据
//列出所有文档 BasicDBObjectquery=newBasicDBObject(); System.out.println("列出"+con.getName()+"集合(表)的所有文档..."); showDBCursor(con.find());
查询JAVA对象
Stringkey="user_info"; BasicDBObjectquery=newBasicDBObject(); query.put(key,newBasicDBObject("$exists",true)); byte[]b=(byte[])con.findOne(query).get(key); InputStreaminputStream=newByteArrayInputStream(b); ObjectInputStreamin=newObjectInputStream(inputStream); Userusers=(User)in.readObject(); System.out.println("用户对象_json:"+JSONArray.fromObject(users));
单一条件查询(数字)
BasicDBObjectquery=newBasicDBObject(); query.put("i",11); showDBCursor(con.find(query));
单一条件查询(字符串)
BasicDBObjectquery=newBasicDBObject(); query.put("name","MongoDB"); showDBCursor(con.find(query));
$ne非等于查询
BasicDBObjectquery=newBasicDBObject(); query.put("name",newBasicDBObject("$ne","MongoDB")); showDBCursor(con.find(query));
根据列名查询
System.out.println("查询有'type'字段的数据...");//false表示没有 BasicDBObjectquery=newBasicDBObject(); query.put("type",newBasicDBObject("$exists",true));//false showDBCursor(con.find(query));
单字段and查询
System.out.println("单字段and条件的使用,i>=2andi<5,i:[2,5)..."); BasicDBObjectquery=newBasicDBObject(); query.put("i",newBasicDBObject("$gte",2).append("$lt",5)); showDBCursor(con.find(query));
多字段and查询
BasicDBObjectquery=newBasicDBObject();(); query.put("name","MongoDB"); query.put("type","database"); System.out.println(con.findOne(query)); showDBCursor(con.find(query));
单字段or查询
System.out.println("单字段or条件的使用,i<2ori>=18..."); BasicDBListvalues=newBasicDBList(); values.add(newBasicDBObject("i",newBasicDBObject("$gte",18))); values.add(newBasicDBObject("i",newBasicDBObject("$lt",2))); BasicDBObjectquery=newBasicDBObject();(); query.put("$or",values); showDBCursor(con.find(query));
多字段or查询
//"多字段or条件的使用,name:'MongoDB'orx:'203'..." BasicDBListvalues=newBasicDBList();(); values.add(newBasicDBObject("name","MongoDB")); values.add(newBasicDBObject("x",203)); BasicDBObjectquery=newBasicDBObject();(); query.put("$or",values); showDBCursor(con.find(query));
$in查询
System.out.println("in条件的使用$in..."); BasicDBListvalues=newBasicDBList();(); for(inti=1;i<=10;i++){ values.add(i); } BasicDBObjectquery=newBasicDBObject();(); query.put("i",newBasicDBObject("$in",values)); showDBCursor(con.find(query));
OrderBy排序查询
System.out.println("排序[1=asc,-1=desc]..."); showDBCursor(con.find(query).sort(newBasicDBObject("i",-1)));
分页查询
//"分页查询的使用,总数据量:"+con.find(query).count() con.find(query).limit(1);//只取第1条数据 con.find(query).skip(1).limit(1);//从1开始取1条数据,下标从0开始 con.find(query).sort(newBasicDBObject("i",-1)).skip(0).limit(5);//DESC后取5条数据 //findAndRemove()方法,删除查询到的数据,删除后的结果集 con.findAndRemove(newBasicDBObject("i",1)); showDBCursor(con.find(query)); con.findAndRemove(newBasicDBObject("i",newBasicDBObject("$in",values)));//【注意:多个数值无效】 showDBCursor(con.find(query));
(not) OR (notin)查询
System.out.println("not,notin条件的使用$not"); BasicDBObjectquery=newBasicDBObject();(); query.put("i",newBasicDBObject("$not",newBasicDBObject("$in",values))); showDBCursor(con.find(query));
Like模糊查询
System.out.println("like查询的使用..."); BasicDBObjectquery=newBasicDBObject();(); query.put("type",MonGoUtil.getLikeStr("a")); showDBCursor(con.find(query));
根据字段类型查询
System.out.println("根据数据类型查询,字符类型..."); BasicDBObjectquery=newBasicDBObject();(); query.put("name",newBasicDBObject("$type",2));//字节 showDBCursor(con.find(query)); System.out.println("根据数据类型查询,整型..."); BasicDBObjectquery=newBasicDBObject();(); query.put("i",newBasicDBObject("$type",16)); showDBCursor(con.find(query));
返回查询的部分字段
//"查询数据的部分字段,1表示只返回本字段,0表示返回除此字段之外的字段" con.find(newBasicDBObject("name",MonGoUtil.getLikeStr("b")),newBasicDBObject("name",1));
5.java对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(); //参数3表示数据库不存在是否添加(默认false),参数4表示是否多条修改(false只修改1条) con.update(newBasicDBObject("name","MongoDB"), newBasicDBObject("$set",newBasicDBObject("type","修改后的type"))).getN(); con.update(newBasicDBObject("name","MongoDBs"), newBasicDBObject("$set",newBasicDBObject("type","修改后的type")),true,true).getN();
6.java对collection的删除操作
/移除cust_Id为6533615的数据。注意用remove方法不释放磁盘空间, //mongodb只在collection中做了标志,没有正在删除。 users.remove(newBasicDBObject("cust_Id","6533615")).getN(); //移除id>=1的数据 users.remove(newBasicDBObject("_id",newBasicDBObject("$gte",1))).getN(); //移除整个collection,drop也不释放磁盘空间 users.drop(); //根据条件删除文档(数据) BasicDBListrls=newBasicDBList(); for(inti=11;i<=20;i++){ rls.add(i); } query.put("i",newBasicDBObject("$in",rls)); con.remove(query);
7.读取mongodb中BinaryData类型数据
Binarybinary=(Binary)doc.get("Data"); byte[]data=binary.getData();