mongodb雖然無事務性,可是它存取快,能有比較好的擴展性。從錢的角度考慮,相同數據量下,存儲到mongodb比oracle便宜1/3 由於錢的緣故,目前我所在的公司開始比較重視數據存儲成本。mongodb基本上是強制要求了。spring
無事務性,在高併發時,該如何處理,特別那種先查詢後插入數據的業務邏輯。還有待研究。sql
基本操做中,and 與 or的結合使用語句比傳統的 oracle語句不一樣。在菜鳥教程中有的例子:mongodb
如下實例演示了 AND 和 OR 聯合使用,相似常規 SQL 語句爲: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'數據庫
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個 Nosql 數據庫",
"by" : "菜鳥教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
那麼在spring boot 中該如何處理:利用mongodb的接口 orOperator
where name="b" and date <'2018-12-14' and (off>20 or off is null)
誤區:我想在and中包含 or的語句。哪知道根本不是這樣的。or的語句本來就包含了外層的and 紅色部分須要重點關注
public List<AimsImIobs> findByProductCode(List<String> planCodeList, Date date) { Query query = new Query(); //或者有效期爲null Criteria criteria = Criteria.where("name").is("b") .and("date").lt(date) .orOperator(Criteria.where("off").gt(20), Criteria.where("off").is(null)); query.addCriteria(criteria); List<AimsImIobs> list = mongoTemplate.find(query, AimsImIobs.class, AIMS_IM_IOBS); return list; }
因此必有query 和update 併發
public void update(AimsImIobs aimsImIobs) {
//更新查詢條件 Query query = new Query(Criteria.where("name").is(aimsImIobs.getPlanCode()) .and("invalidateDate").is(null)); Update update = new Update(); //更新有效期爲最新的開始時間 update.set("invalidateDate", aimsImIobs.getEffectiveDate()); update.set("dateCreated", new Date()); mongoTemplate.updateFirst(query, update, AimsImIobs.class, AIMS_IM_IOBS); }
/** * 保存 * * @param aimsImIobs */ public void saveAimsImIobs(AimsImIobs aimsImIobs) { Date time = new Date(); aimsImIobs.setDateCreated(time); //保存前,先刪除重複數據 fileid Query query = new Query(); //或者有效期爲null Criteria criteria = Criteria.where("planCode").is(aimsImIobs.getPlanCode()) .and("fileId").is(aimsImIobs.getFileId()) .and("effectiveDate").is(aimsImIobs.getEffectiveDate()); query.addCriteria(criteria);
//刪除數據。刪除只是查詢語句 mongoTemplate.remove(query,AimsImIobs.class,AIMS_IM_IOBS); mongoTemplate.save(aimsImIobs, AIMS_IM_IOBS); }
後續關於mongodb 高併發還有待學習,若是各位有學習資料,歡迎指導oracle