package study.java.hanyx.mongodb.util;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;
import com.mongodb.client.model.Filters;
/**
* MongoDB 工具类
*
* MongoClient包含线程池,故设置为单例
* @author 韩元旭
*/
public class MongoDBUtil {
private MongoDBUtil() {
}
private static MongoClient instance = null;
public static MongoClient getInstance() {
if (instance == null) {
instance = new MongoClient("192.168.56.101", 27017);
}
return instance;
}
/**
* 获取指定数据库,不存在会创建新的数据库
*
* @param dbName
* 数据库名称
* @return
*/
public MongoDatabase getDB(String dbName) {
if (notEmptyString(dbName)) {
return instance.getDatabase(dbName);
}
return null;
}
/**
* 获取指定数据库中的集合,不存在会创建新的
* @param dbName
* @param collName
* @return
*/
public MongoCollection<Document> getCollection(String dbName, String collName) {
if (notEmptyString(dbName) && notEmptyString(collName)) {
return instance.getDatabase(dbName).getCollection(collName);
}
return null;
}
/**
* 获取所有数据库名称列表
* @return
*/
public List<String> getAllDBNames() {
List<String> list = new ArrayList<String>();
MongoIterable<String> dbNames = instance.listDatabaseNames();
for (String s : dbNames) {
list.add(s);
}
return list;
}
/**
* 获取指定数据库下所有集合名称
* @param dbName
* @return
*/
public List<String> getAllCollections(String dbName) {
List<String> list = new ArrayList<String>();
if (notEmptyString(dbName)) {
MongoIterable<String> colls = getDB(dbName).listCollectionNames();
for (String s : colls) {
list.add(s);
}
}
return list;
}
/**
* 根据主键Id查找数据
* @param coll
* @param id
* @return
*/
public Document findById(MongoCollection<Document> coll, String id) {
ObjectId objId = null;
try {
objId = new ObjectId(id);
} catch (Exception e) {
return null;
}
return coll.find(Filters.eq("_id", objId)).first();
}
/**
* 根据条件查询
* @param coll
* @param filter
* @return
*/
public MongoCursor<Document> find(MongoCollection<Document> coll, Bson filter) {
return coll.find(filter).iterator();
}
/**
* 根据主键Id升序排列分页查询
* @param coll
* @param pageNo 页码
* @param pageSize 页容量
* @return
*/
public MongoCursor<Document> findByPage(MongoCollection<Document> coll, int pageNo, int pageSize) {
return findByPage(coll, "_id", pageNo, pageSize, true);
}
/**
* 根据主键Id分页查询
* @param coll
* @param pageNo 页码
* @param pageSize 页容量
* @param isAsc 是否升序排列
* @return
*/
public MongoCursor<Document> findByPage(MongoCollection<Document> coll, int pageNo, int pageSize, boolean isAsc) {
return findByPage(coll, "_id", pageNo, pageSize, isAsc);
}
/**
* 分页查询
* @param coll
* @param key 排序字段名
* @param pageNo 页码
* @param pageSize 页容量
* @param isAsc 是否升序排列
* @return
*/
public MongoCursor<Document> findByPage(MongoCollection<Document> coll, String key, int pageNo, int pageSize, boolean isAsc) {
key = notEmptyString(key)?key:"_id";
Bson orderBy = new BasicDBObject(key, isAsc?1:-1);
return coll.find().sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
}
/**
* 根据主键Id删除数据
* @param coll
* @param id
* @return
*/
public long deleteById(MongoCollection<Document> coll, String id) {
ObjectId objId = null;
try {
objId = new ObjectId(id);
} catch (Exception e) {
return 0L;
}
return coll.deleteOne(Filters.eq("_id", objId)).getDeletedCount();
}
/**
* 根据主键Id修改数据
* @param coll
* @param id
* @param newdoc
* @return
*/
public long updateById(MongoCollection<Document> coll, String id, Document newdoc) {
ObjectId objId = null;
try {
objId = new ObjectId(id);
} catch (Exception e) {
return 0L;
}
return coll.updateOne(Filters.eq("_id", objId), new Document("$set", newdoc)).getModifiedCount();
}
/**
* 关闭连接
*/
public void close() {
if (instance != null) {
instance.close();
instance = null;
}
}
/**
* 非空字符串的判断
* @param str
* @return
*/
private boolean notEmptyString(String str) {
return !(str == null || "".equals(str));
}
}