• 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 高并发还有待学习,如果各位有学习资料,欢迎指导













    学习的时间不一定要特定安排
  • 相关阅读:
    js判断手机或Pc端登陆.并跳转到相应的页面
    短信接口的使用
    sql替换
    jQuery 双击事件(dblclick)
    attr 和 prop 的区别
    如何获得select被选中option的value和text
    微信公众号基本配置
    关闭当前界面
    oninput、onchange与onpropertychange事件的区别, 与input输入框实时检测
    thinkphp5 与 endroid 二维码生成
  • 原文地址:https://www.cnblogs.com/zhongzheng123/p/10119855.html
Copyright © 2020-2023  润新知