MongoDB学习(四):通过Java使用MongoDB
环境配置
在Java项目中使用MongoDB,需要在项目中引入mongo.jar这个包。下载地址:下载
请尽量下载较新的版本,本文用的是2.10.1。
连接MongoDB
1 public synchronized static DB getDBConnection() throws UnknownHostException{ 2 if(db == null){ 3 MongoClient client = new MongoClient(DB_SERVER_IP, DBSERVER_PORT); 4 db = client.getDB(DB_NAME); 5 System.out.println("GET DBCONNECTION SUCCESSFUL"); 6 } 7 return db; 8 }
其中IP和PORT分别是数据库服务端的IP和端口号。
创建集合
public static DBCollection getCollection(String colName){ col = db.getCollection(colName); if(col == null){ col = db.createCollection(colName, null); } return col; }
插入文档
插入数据有4中方式可选:1.利用DBObjcet,2.利用DBObjectBuilder, 3.先创建Map对象,再用Map对象构造DBObject,4.直接通过json对象创建。
这里我们主要介绍第一种方式——利用DBObject插入。DBObject是一个接口,继承自BSONObject,是可被存入数据库的一个键值的Map。这里我们使用它的基本实现:BasicDBObject。
public static void insert(){ DBCollection col = getCollection("myCollection1"); if(col != null){ DBObject o = new BasicDBObject(); o.put("name", "Z"); o.put("gender", "f"); o.put("age", 1); col.insert(o); } }
另外,你也可以使用BasicDBObject提供的append()函数,来为对象插入键值对。
当你需要批量插入数据时,可以使用DBCollection.insert(List<DBObject> list);
查询文档
可以通过DBCollection.find()来查询集合中的文档。该函数返回一个游标DBCursor。通过对其迭代输出,就可以得到文档组。或者是通过DBCursor.toArray()直接转成DBObject的列表List<DBObject>。代码如下:
public static void search(){ DBCollection col = getCollection("myCollection1"); if(col != null){ DBCursor cursor = col.find(); while(cursor.hasNext()){ DBObject o = cursor.next(); System.out.println(o); } } }
public static void search(){ DBCollection col = getCollection("myCollection1"); if(col != null){ List<DBObject> list = col.find().toArray(); } }
当然,也可以设置查询条件,并对输出结果的字段进行限制:
public static void search2(){ DBCollection col = getCollection("myCollection1"); if(col != null){ //查询条件 DBObject query = new BasicDBObject(); query.put("gender", "m"); //输出结果是否有要输出某个字段。0表示不输出,1表示只输出该字段 DBObject field = new BasicDBObject(); field.put("name", 1); DBCursor cursor = col.find(query,field); while(cursor.hasNext()){ System.out.println(cursor.next()); } } }
上述代码就表示查询性别为m的全部文档,并输出其姓名。
较复杂的条件查询:
public static void search2(){ DBCollection col = getCollection("myCollection1"); if(col != null){ //查询条件 DBObject query = new BasicDBObject(); DBObject o = new BasicDBObject("$lt",24).append("$gt", 21); query.put("age", o); DBCursor cursor = col.find(query); while(cursor.hasNext()){ System.out.println(cursor.next()); } } }
这里我们筛选的是年龄小于24且大于21的全部文档。
更新文档
public static void update1(){ DBCollection col = getCollection("myCollection1"); if(col != null){ //查询条件 DBObject query = new BasicDBObject(); query.put("name", "A"); //用来替换的文档 DBObject newObject = new BasicDBObject(); newObject.put("name", "A1"); col.update(query, newObject); } }
这里我们将name这个字段等于A的文档替换成了name字段为A1的值,注意的是,新的文档将不包含旧文档的其他字段,是真正意义上的两个文档的替换,而非替换相同字段!另外一点需要注意的是,该方法只替换第一条符合查询条件的文档。因为multi的默认值为false,可以通过设置这个值为true来修改多条。
findAndModity(DBObject query, DBObject fields, DBObject sort, boolean remove, DBObject update,boolean returnNew,boolean upsert)也提供了类似的功能。
query
- query to match
fields
- fields to be returned
sort
- sort to apply before picking first document
remove
- if true, document found will be removed
update
- update to apply
returnNew
- if true, the updated document is returned, otherwise the old document is returned (or it would be lost forever)upsert
- do upsert (insert if document not present)
删除文档
删除指定的一个文档:
public static void remove1(){ DBCollection col = getCollection("myCollection1"); if(col != null){ DBObject o = col.findOne(); col.remove(o); } }
删除符合某条件的文档:
public static void remove2(){ DBCollection col = getCollection("myCollection1"); if(col != null){ //条件 DBObject query = new BasicDBObject(); query.put("name", "A1"); col.remove(query); } }
会删除符合条件的全部文档。
如需要删除集合下的全部文档时,可结合DBCursor实现。
参考:
API文档:http://api.mongodb.org/java/2.10.1/
其他资料:菜鸟教程
http://blog.csdn.net/hx_uestc/article/details/7620938