最近在学习使用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 = chun_@126.com的
iter = colleciton.find(new BasicDBObject("email", "chun_@126.com"));
cursor2 = iter.iterator();
while(cursor2.hasNext()) {
Document doc = cursor2.next();
System.out.println("符合条件的2:" + doc.toJson());
}
cursor2.close();
System.out.println("=========================");
//查找email != chun_@126.com的
iter = colleciton.find(new BasicDBObject("email", new BasicDBObject("$ne", "chun_@126.com")));
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();
}
}
持续补充完善中……