多条件的MongoDB查询

24

我有多个文档的数据:

{
 "_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" } } }
 ])

上面的查询适用于第一个条件,但对于其他条件失败了。请帮帮我。

4个回答

34

对于第二个条件,你可以在查询中使用$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() 方法,以以下形式返回与上述查询匹配的唯一 empIds 数组:

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

5
以上查询条件是“或”条件。我需要“且”条件,即只有两个条件都完全匹配才返回结果。 - Amrut Gaikwad
逗号运算符在行为上隐式地表现为“与”操作符。 - Anurag

25

如果您正在寻找AND运算符

此示例检查字段是否存在并且为空

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

这个示例检查一个字段是否具有'value1' 或者 'value2'

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

仅进行空值检查时,返回结果会包含不存在的字段以及值为null的字段

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

3
-1 db.getCollection('TheCollection').find({ 'the_key': 'value1', 'the_key': 'value2' }) 的结果将会是 db.getCollection('TheCollection').find({ 'the_key': 'value2' }),因为 JavaScript 不允许一个对象有两个同名的键。此外,MongoDB 会将多个参数作为“与”逻辑而非“或”逻辑来评估。 - Steven de Salas
我以为我已经测试过了,而且它也工作了,但无论如何。我进行了编辑。感谢您指出。 - Julesezaar

11
你可以使用Mongo DB的$or运算符。
    db.emp.find({ $or: [
      { "type": "WebUser", "city": "Pune" },
      { "type": "user", "city": "Mumbai"}
    ]})

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

更多参考请查看mongo文档


0
  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" }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接