【问题标题】:MongoDB query with multiple conditions具有多个条件的 MongoDB 查询
【发布时间】:2021-08-21 17:31:05
【问题描述】:

我有多个文档的数据:

{
 "_id" : ObjectId("57b68dbbc19c0bd86d62e486"),
 "empId" : "1"
 "type" : "WebUser",
 "city" : "Pune"
}
{
 "_id" : ObjectId("57b68dbbc19c0bd86d62e487"),
 "empId" : "2"
 "type" : "Admin",
 "city" : "Mumbai"
}
{
 "_id" : ObjectId("57b68dbbc19c0bd86d62e488"),
 "empId" : "3"
 "type" : "Admin",
 "city" : "Pune"
}
{
 "_id" : ObjectId("57b68dbbc19c0bd86d62e489"),
 "empId" : "4"
 "type" : "User",
 "city" : "Mumbai"
}

我想根据我的多个条件获取数据:

condition 1:- {"type" : "WebUser", "city" : "Pune"}

condition 2:- {"type" : "WebUser", "city" : "Pune"} & {"type" : "User", "city" : "Mumbai"}

运行条件 1 时我想要以下结果:

    {
     "_id" : ObjectId("57b68dbbc19c0bd86d62e486"),
     "empId" : "1"
     "type" : "WebUser",
     "city" : "Pune"
    }

当我运行第二个条件时:

{
  "_id" : ObjectId("57b68dbbc19c0bd86d62e486"),
  "empId" : "1"
  "type" : "WebUser",
  "city" : "Pune"
}
{
  "_id" : ObjectId("57b68dbbc19c0bd86d62e489"),
  "empId" : "4"
  "type" : "User",
  "city" : "Mumbai"
}

我想通过一个查询得到以上结果,

目前我正在使用以下聚合查询,

 db.emp.aggregate([
     { $match: { '$and': [
         {"type" : "WebUser", "city" : "Pune"}, 
         {"type" : "User", "city" : "Mumbai"}
     ] } },
     { $group: { _id: 1, ids: { $push: "$empId" } } }
 ])

以上查询适用于第一个条件,而其他条件则失败。请帮帮我。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    对于第二个条件,您可以在查询中使用 $in 运算符:

    db.emp.find({
        "type" : { "$in": ["WebUser", "User"] },
        "city" : { "$in": ["Pune", "Mumbai"] }
    })
    

    如果要在聚合中使用:

     db.emp.aggregate([
         { 
            "$match": {
                "type" : { "$in": ["WebUser", "User"] },
                "city" : { "$in": ["Pune", "Mumbai"] }
            }
         },
         { "$group": { "_id": null, "ids": { "$push": "$empId" } } }
     ])
    

    或简单地使用distinct() 方法返回与上述查询匹配的不同empId 数组:

    var employeeIds = db.emp.distinct("empId", {
        "type" : { "$in": ["WebUser", "User"] },
        "city" : { "$in": ["Pune", "Mumbai"] }
    });
    

    【讨论】:

    • 以上查询作为“或”条件工作。我需要“和”。即结果仅在两个条件完全匹配时返回。
    【解决方案2】:

    如果您正在寻找 AND 运算符

    这个例子检查一个字段是否存在AND为空

    db.getCollection('TheCollection').find({
        $and: [
            {'the_key': { $exists: true }},
            {'the_key': null}
        ]
    })
    

    这个例子检查一个字段是否有 'value1' OR 'value2'

    db.getCollection('TheCollection').find({
        $or: [
            {'the_key': 'value1'},
            {`the_key': 'value2'}
        ]
    })
    

    仅检查 null 时,返回包含不存在的字段以及值为 null 的字段

    db.getCollection('TheCollection').find({'the_key': null})
    

    【讨论】:

    • -1 db.getCollection('TheCollection').find({ 'the_key': 'value1', 'the_key': 'value2' }) 将评估为 db.getCollection('TheCollection').find({ 'the_key': 'value2' }),因为 javascript 不允许具有两个键的对象使用相同的名称。此外,mongoDB 会将多个参数评估为AND 逻辑,而不是OR
    • 我以为我已经测试过了,但它仍然有效。我编辑了它。谢谢指出
    【解决方案3】:

    您可以使用 mongo db $or 运算符。

        db.emp.find({ $or: [
          { "type": "WebUser", "city": "Pune" },
          { "type": "user", "city": "Mumbai"}
        ]})
    

    您可以在数组中传递条件。

    更多参考see mongo docs

    【讨论】:

      【解决方案4】:
      1. 显示“StudName”中值为“Ajay Rathod”的文档。

        db.Student.find({name:"ajay rathod"})

        { "_id" : ObjectId("5fdd895cd2d5a20ee8cea0de"), "
        
      2. 仅检索学生姓名和成绩。

        db.Student.find({},{name:1,grade:1,_id:0})

        { "name" : "dhruv", "grade" : "A" }
        { "name" : "jay", "grade" : "B" }
        { "name" : "abhi", "grade" : "C" }
        { "name" : "aayush", "grade" : "A" }
        { "name" : "sukhdev", "grade" : "B" }
        { "name" : "dhruval", "grade" : "B" }
        { "name" : "ajay rathod", "grade" : "D" }
        

      查看更多查询:

      find-documents-with-multiple-conditions-mongodb

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多