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关系
     
     
  • 相关阅读:
    【nodejs】使用Node.js实现REST Client调用REST API
    [Groovy] Groovy && JNI
    一些很实用的Maven Plugins
    秋天到了
    今天头好疼
    想起那个人的时候
    不知道标题
    生活让我懂得
    显示实现接口和实现接口
    Foreach原理
  • 原文地址:https://www.cnblogs.com/kelelipeng/p/12010554.html
Copyright © 2011-2022 走看看