最近在学习使用Mongodb,众所周知:Mongodb是一种最接近传统关系型数据库的Nosql产品,利用它可以实现最基本的CRUD(增删改查)操作。下面是我小结的关于Mongodb的Java版的增删改查的操作,用到的mongodb版本是3.0+。
首先,引入mongo-java-driver-3.2.2.jar包,新建一个测试类如下:
package test; import java.util.HashMap; import java.util.Map; import org.bson.Document; import com.mongodb.BasicDBObject; import com.mongodb.BulkWriteOperation; import com.mongodb.DBCollection; import com.mongodb.MongoClient; import com.mongodb.QueryOperators; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; /** * Mongodb API for Java * Basic CRUD * @author Connor * */ public class MongoTest { public static void main(String[] args) { MongoClient mc = new MongoClient("localhost", 27017);//MongoClient线程安全的 try{ //先连接数据库,不存在的话会自动创建 MongoDatabase db = mc.getDatabase("test"); //再连接集合(表) MongoCollection<Document> colleciton = db.getCollection("foo"); /** query相关 */ //无条件遍历表 //1)通过游标 MongoCursor<Document> cursor = colleciton.find().iterator(); while(cursor.hasNext()) { Document doc = cursor.next(); System.out.println("json:" + doc.toJson()); } cursor.close(); System.out.println("========================"); //2) for(Document doc : colleciton.find()) { // System.out.println("json2:" + doc.toJson()); } //查找userName以Connor打头,age>20的(含正则表达式) cursor = colleciton.find(Filters.and(Filters.gte("age", 20), Filters.regex("userName", "^Connor"))).iterator(); while(cursor.hasNext()) { Document doc = cursor.next(); System.out.println("json:" + doc.toJson()); } cursor.close(); System.out.println("=================================="); //比较适合数字范围查询(不加.append的部分就是单条件查询) FindIterable<Document> iter = colleciton.find(new BasicDBObject("age", new BasicDBObject("$gt", 20) .append("$lt", 30)));//colleciton.find().limit(n)则表明取全部记录的前n条 MongoCursor<Document> cursor2 = iter.iterator(); while(cursor2.hasNext()) { Document doc = cursor2.next(); System.out.println("符合条件的:" + doc.toJson()); } cursor2.close(); System.out.println("======================"); //查找email = [email protected]的 iter = colleciton.find(new BasicDBObject("email", "[email protected]")); cursor2 = iter.iterator(); while(cursor2.hasNext()) { Document doc = cursor2.next(); System.out.println("符合条件的2:" + doc.toJson()); } cursor2.close(); System.out.println("========================="); //查找email != [email protected]的 iter = colleciton.find(new BasicDBObject("email", new BasicDBObject("$ne", "[email protected]"))); cursor2 = iter.iterator(); while(cursor2.hasNext()) { Document doc = cursor2.next(); System.out.println("符合条件的3:" + doc.toJson()); } cursor2.close(); System.out.println("======================="); //查询userName在Connor2, Someone中的 iter = colleciton.find(new BasicDBObject("userName", new BasicDBObject(QueryOperators.IN, new String[]{"Connor2", "Someone"}))); cursor2 = iter.iterator(); while(cursor2.hasNext()) { Document doc = cursor2.next(); System.out.println("符合条件的4:" + doc.toJson()); } cursor2.close(); System.out.println("========================"); /** insert相关 */ Map<String, Object> map = new HashMap<>(); map.put("name", "Fanfan"); map.put("gender", "female"); map.put("profession", "singer"); map.put("nationality", "Taiwan"); map.put("age", 38); Document doc = new Document(map); colleciton.insertOne(doc); //insert多条 // List<Document> list = new ArrayList<Document>(); // list.add(doc); // colleciton.insertMany(list); //不再推荐的用法 DBCollection coll = mc.getDB("test").getCollection("foo"); BulkWriteOperation builder = coll.initializeOrderedBulkOperation(); BasicDBObject obj = new BasicDBObject("name", "Fanfan").append("gender", "female").append("age", 35) .append("profession", "singer").append("nationality", "Taiwan"); //或者BasicDBObject obj = new BasicDBObject(map); builder.insert(obj); //测试 cursor = colleciton.find().iterator(); while(cursor.hasNext()) { doc = cursor.next(); System.out.println("json(new):" + doc.toJson()); } cursor.close(); System.out.println("========================"); /** update相关 */ // map.put("nationality", "Taiwan"); // BasicDBObject newObj = new BasicDBObject(map); // colleciton.updateOne(new BasicDBObject("nationality", new BasicDBObject("eq", "Taiwan")), // new BasicDBObject("nationality", "Chinese")); BasicDBObject condition = new BasicDBObject(); condition.put("name", "Fanfan"); BasicDBObject update = new BasicDBObject(); update.put("nationality", "Chinese"); BasicDBObject setObj = new BasicDBObject("$set", update); /* * update xxx set age = age +2, name = where ... BasicDBObject incObj = new BasicDBObject("age", 2); BasicDBObject setObj2 = new BasicDBObject("name", "Fanweiqi"); BasicDBObject allObj = new BasicDBObject(); allObj.put("$inc", incObj); allObj.put("$set", setObj2); colleciton.updateMany(condition, allObj);*/ colleciton.updateOne(condition, setObj); cursor = colleciton.find().iterator(); while(cursor.hasNext()) { doc = cursor.next(); System.out.println("json(new2):" + doc.toJson()); } cursor.close(); System.out.println("========================"); /** delete相关 */ // coll.remove(obj); // colleciton.findOneAndDelete(new BasicDBObject("name", "Fanfan"));//只能删除一条 colleciton.deleteMany(new BasicDBObject("name", "Fanfan"));//删除所有符合条件的 // colleciton.deleteMany(new BasicDBObject("age", new BasicDBObject("$gt", 20) // .append("$lt", 30)));//删除20<age<30的记录 cursor = colleciton.find().iterator(); while(cursor.hasNext()) { doc = cursor.next(); System.out.println("json(new3):" + doc.toJson()); } cursor.close(); System.out.println("========================"); } catch(Exception e) { e.printStackTrace(); } } }
mongoClient的连接池写法:
List<ServerAddress> saList = new ArrayList<ServerAddress>(); if(mongoClient == null){ MongoClientOptions.Builder builder = new MongoClientOptions.Builder(); builder.connectionsPerHost(50);//与目标数据库能够建立的最大connection数量为50 builder.autoConnectRetry(true);//自动重连数据库启动 //如果当前所有的connection都在使用中,则每个connection上可以有50个线程排队等待 builder.threadsAllowedToBlockForConnectionMultiplier(50); //如果当前所有的connection都在使用中,则每个connection上可以有50个线程排队等待 builder.maxWaitTime(1000*60*2); //与数据库建立连接的timeout设置为1分钟 builder.connectTimeout(1000*60*1); MongoClientOptions clientOptions = builder.build(); try { //数据库连接实例 ServerAddress address1 = new ServerAddress(MongoDbUtils.MONGO_IP, MongoDbUtils.MONGO_PORT); saList.add(address1); mongoClient = new MongoClient(saList, clientOptions); } catch (UnknownHostException e) { e.printStackTrace(); } }
持续补充完善中……