使用MongoDB需要對文檔結構進行合理的設計,以滿足某些特定需求。比如随機選取文檔,使用skip跳過随機個文檔就沒有在文檔中加個随機鍵,
然後使用某個随機數對文檔進行查詢高效,随機鍵還能添加索引,效率更高。合理選擇,合理設計。
import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.nerd.mongo.config.ConfigFactory;
/**
* MONGOS
* @author chenlongquan
*
*/
public class MongoUtil {
private final static ThreadLocal<Mongo> mongos = new ThreadLocal<Mongo>();
public static DB getdb(){
return getMongos().getDB(ConfigFactory.getMongoConfig().getDb());
}
public static Mongo getMongos() {
Mongo mongo = mongos.get();
if (mongo == null) {
try {
mongo = new Mongo(ConfigFactory.getMongoConfig().getIp(),ConfigFactory.getMongoConfig().getPort());
mongos.set(mongo);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
}
return mongo;
}
public static void close(){
Mongo mongo = mongos.get();
if(mongo!=null){
mongo.close();
mongos.remove();
}
}
/**
* 擷取集合(表)
*
* @param collection
*/
public static DBCollection getCollection(String collection) {
return getdb().getCollection(collection);
}
......................................................
複制
下面我們就可以在這上面的基礎上對mongodb進行基本的crud操作
例如:
/**
* 插入
*
* @param collection
* @param o 插入
*
*/
public static void insert(String collection, DBObject o) {
getCollection(collection).insert(o);
}
/**
* 批量插入
*
* @param collection
* @param list
* 插入的清單
*/
public void insertBatch(String collection, List<DBObject> list) {
if (list == null || list.isEmpty()) {
return;
}
getCollection(collection).insert(list);
}
複制
測試用例:
insert("user1",
new BasicDBObject().append("name", "admin3").append("type", "2").append("score", 70)
.append("level", 2).append("inputTime", new Date().getTime()));
複制
工具類使用:
/**
* 删除
*
* @param collection
* @param q
* 查詢條件
*/
public void delete(String collection, DBObject q) {
getCollection(collection).remove(q);
}
/**
* 批量删除
*
* @param collection
* @param list
* 删除條件清單
*/
public void deleteBatch(String collection, List<DBObject> list) {
if (list == null || list.isEmpty()) {
return;
}
for (int i = 0; i < list.size(); i++) {
getCollection(collection).remove(list.get(i));
}
}
/**
* 更新
*
* @param collection
* @param q
* 查詢條件
* @param setFields
* 更新對象
*/
public static void update(String collection, DBObject q, DBObject setFields) {
getCollection(collection).updateMulti(q,
new BasicDBObject("$set", setFields));
}
/**
* 查找集合所有對象
*
* @param collection
*/
public static List<DBObject> findAll(String collection) {
return getCollection(collection).find().toArray();
}
/**
* 按順序查找集合所有對象
*
* @param collection
* 資料集
* @param orderBy
* 排序
*/
public static List<DBObject> findAll(String collection, DBObject orderBy) {
return getCollection(collection).find().sort(orderBy)
.toArray();
}
/**
* 查找(傳回一個對象)
*
* @param collection
* @param q
* 查詢條件
*/
public static DBObject findOne(String collection, DBObject q) {
return getCollection(collection).findOne(q);
}
/**
* 查找(傳回一個對象)
*
* @param collection
* @param q
* 查詢條件
* @param fileds
* 傳回字段
*/
public static DBObject findOne(String collection, DBObject q, DBObject fileds) {
return getCollection(collection).findOne(q, fileds);
}
/**
* 分頁查找集合對象,傳回特定字段
*
* @param collection
* @param q
* 查詢條件
* @param fileds
* 傳回字段
* @pageNo 第n頁
* @perPageCount 每頁記錄數
*/
public static List<DBObject> findLess(String collection, DBObject q, DBObject fileds, int pageNo,
int perPageCount) {
return getCollection(collection).find(q, fileds)
.skip((pageNo - 1) * perPageCount).limit(perPageCount)
.toArray();
}
複制