zoukankan      html  css  js  c++  java
  • mongodb复杂条件查询 (or与and)

    分类专栏: mongodb

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/tjbsl/article/details/80620303
    使用Mongodb查询需要拼接复杂的or和and参数
    MongoDb有表格:
    1
    "state1" : 11,
    "state2" : 21,
    "value" : 100
    2
    "state1" : 11,
    "state2" : 22,
    "value" : 300
    3
    "state1" : 11,
    "state2" : 22,
    "value" : 200
    4
    "state1" : 12,
    "state2" : 21,
    "value" : 300
     
    要实现管理数据的如下SQL形式:
    关系数据库:select * from where(state1=11 and state2=22) or value >300
    首先使用MongoDB的方式查询:
    分为以下几个步骤实现:
    步骤一:实现 (state1=11 and state2=22)
    db.getCollection('testOrAnd').find(
    {$and:[{"state1":11},{"state2":22}]}
    )
    步骤二:使用or形式实现 value >300
    db.getCollection('testOrAnd'). find(
    { $or:[{"value":{$gte:300}}] }
    )
    步骤三:将步骤一参数拼接到步骤二or条件
    db.getCollection('testOrAnd').
    find({$or:
    [
    {$and:[{"state1":11},{"state2":22}]},{"value":{$gte:300}}
    ]
    })
     
    最终实现结果:
     
    使用spring-mongotemplate的方式查询(Criteria.where是静态方法):
    分析查询方式,类似使用client的分析方式,分为以下几个步骤实现:
    步骤一:实现 (state1=11 and state2=22)
    query.addCriteria(
    new Criteria().andOperator(
    Criteria.where("state1").is(11),
    Criteria.where("state2").is(22)
    )
    );
    步骤二:使用or形式实现 value >300
    query.addCriteria(
    new Criteria().orOperator(
    Criteria.where("value").gte(300)
    )
    );
    步骤三:将步骤一参数拼接到步骤二or条件
    query.addCriteria(
    new Criteria().orOperator(
    Criteria.where("value").gte(300),
    new Criteria().andOperator(
    Criteria.where("state1").is(11),
    Criteria.where("state2").is(22)
    )
    )
    );
     
    升级查询,实际场景中要根据传输的参数是否为空,拼接查询条件:
    (1)如果最外层是and关系(query.add多个creterria默认为and关系)
    if(条件){
    query.addCriteria(Criteria.where);
    }
    if(条件){
    query.addCriteria(Criteria.where);
    }
    if(条件){
    query.addCriteria(Criteria.where);
    }
    默认拼接的query条件为and形式。
    (1)如果最外层是or关系(目前只想到此笨方法)
    //1.拼接参数
    Criteria operator1=null;
    Criteria operator2=null;
    if(1==1){//模拟判断条件
    operator1 = new Criteria().andOperator(
    Criteria.where("state1").is(11),
    Criteria.where("state2").is(22)
    );
    }
    if(1==1){//模拟判断条件
    operator2 = Criteria.where("value").gte(300);
    }
    //2.判断参数
    if(operator1!=null && operator2!=null){
    query.addCriteria(new Criteria().orOperator(operator1,operator2));
    }else if(operator1!=null){
    query.addCriteria(operator1);
    }else if(operator2!=null){
    query.addCriteria(operator2);
    }
     
    补充:多个条件直接查询,默认是and形式
    db.getCollection('testOrAnd').find({"state1":11,"state2":22})
    即query.add多个creterria默认为and关系
     
     
  • 相关阅读:
    【C#进阶系列】06 类型和成员基础
    纪中5日T1 1564. 旅游
    纪中17日T1 2321. 方程
    纪中17日T2 2322. capacitor
    纪中10日T1 2313. 动态仙人掌
    纪中14日听课小结 图论 最短路 二分图 差分约束
    一个抓猫的游戏 消遣GAME 持续更新中!
    洛谷P1464 Function  HDU P1579 Function Run Fun
    洛谷P1976 鸡蛋饼
    纪中12日T1 2307. 选择
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12010554.html
Copyright © 2011-2022 走看看