MongoDB自增長主鍵,批量操作,distinct記錄,條件組合查詢
阿新 • • 發佈:2018-11-30
一,建立自增長主鍵
在 mongodb 的命令列終端,建立一個 collection 比如 sequence,然後插入一條記錄:
MongoDB Enterprise > db.sequence.insert({_id:"userseq",seq:0})
WriteResult({ "nInserted" : 1 })
建立一個Service, 呼叫 mongodb 的一個 API,修改這個 sequence 裡面的物件,並返回更改後的值作為程式即將儲存的物件的 ID。
@Service public class SequenceService { private Logger logger = LoggerFactory.getLogger(SequenceService.class); private static final String SEQ_COLLECTION = "sequence"; private static final String PRIMARY_KEY = "_id"; private static final String SEQUENCE_FIELD = "seq"; @Autowired private MongoTemplate temp; public Integer getNextUserSeq(){ Integer seq = getNextSequence("userseq"); logger.info("getNextUserSeq() 的下一個值 ::: " + seq); return seq; } private Integer getNextSequence(String name) { DBObject ret = temp.getCollection(SEQ_COLLECTION).findAndModify( Query.query(Criteria.where(PRIMARY_KEY).is(name)).getQueryObject(), null, null, false, new Update().inc(SEQUENCE_FIELD, 1).getUpdateObject(), true, false); return ((Double) ret.get(SEQUENCE_FIELD)).intValue(); } }
注意, findAndModify 這個方法是過載的,如果 public DBObject findAndModify(final DBObject query, final DBObject update) 這個介面,將會返回修改前的值,比如值已經被這個介面從 4 改到 5 了,但是返回的卻是 4,不是最新的 5。所以我程式裡使用的是更多引數的介面,其倒是第二個引數設為 true, 意思是返回修改後的值。
還有一個就是這個返回值的型別是 Double 型的,最終返回前做一下型別轉換。
最後,程式在儲存物件的時候,呼叫 SequenceService.getNextUserSeq() 返回的值作為 ID 的值。
public void createUser(User user){
encryptPassword(user);
user.setId(seqService.getNextUserSeq());
userDao.insert(user);
}
二,使用 BulkOperations 類可以批量增刪改物件。
public int enableUsers(List<String> userIds){ BulkOperations bulkOps = temp.bulkOps(BulkMode.ORDERED, User.class); bulkOps.updateMulti(Query.query(Criteria.where("id").in(userIds)), Update.update("enabled", "1")); bulkOps.execute(); return 1; }
三, distinct 獲取記錄的唯一欄位資料
public List<String> getLoginNames(String mobile) {
return (List<String>)temp.getCollection("user")
.distinct("loginName", Query.query(Criteria.where("mobile").is(mobile)).getQueryObject());
}
但是如果希望通過 id 作為 Query 裡的查詢欄位,那麼注意了,不是我們定義的實體類比如這裡 User 裡的 id 欄位,而應該是 MongoDB 儲存 Collection 裡面的的欄位名,也就是 “_id”, 也就是說下面的語句才是可工作的:
public List<String> getLoginNames(Integer id) {
return (List<String>)temp.getCollection("user").distinct("loginName",
Query.query(Criteria.where("_id").is(id)).getQueryObject());
}
public List<User> getUsersByNameLike(String keyword) {
Query query = new Query();
query.addCriteria(Criteria.where("loginName").ne("admin"))
.addCriteria(new Criteria()
.orOperator(Criteria.where("loginName").regex(keyword),
Criteria.where("fullName").regex(keyword)));
List<User> users = temp.find(query, User.class);
return users;
}