Mongodb 的CRUD操作(Java API 3.0+)

最近在学习使用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();
			}
		}

持续补充完善中……

猜你喜欢

转载自raising.iteye.com/blog/2317436