spring boot 使用mongodb基本操作與一些坑


  mongodb雖然無事務性,但是它存取快,能有比較好的擴展性。從錢的角度考慮,相同數據量下,存儲到mongodb比oracle便宜1/3  因為錢的緣故,目前我所在的公司開始比較重視數據存儲成本。mongodb基本上是強制要求了。

無事務性,在高並發時,該如何處理,特別那種先查詢后插入數據的業務邏輯。還有待研究。

基本操作中,and 與 or的結合使用語句比傳統的 oracle語句不同。在菜鳥教程中有的例子

AND 和 OR 聯合使用

以下實例演示了 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;
    }

 

  • 更新操作:分兩部分 1)更新字段 2)更新查詢條件

所以必有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); }

 

  • 刪除與保存:目前我這邊沒有引入分布式鎖或者mongodb鎖。在高並發的情況下會導致數據重復插入。
/**
     * 保存
     *
     * @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 高並發還有待學習,如果各位有學習資料,歡迎指導

 

 

 

 














免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM