具有多个条件的MongoDB查询

Amr*_*wad 3 mongoose mongodb

我有多个文件的数据:

{
 "_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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

condition 2:- {"type" : "WebUser", "city" : "Pune"} & {"type" : "User", "city" : "Mumbai"}
Run Code Online (Sandbox Code Playgroud)

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

    {
     "_id" : ObjectId("57b68dbbc19c0bd86d62e486"),
     "empId" : "1"
     "type" : "WebUser",
     "city" : "Pune"
    }
Run Code Online (Sandbox Code Playgroud)

当我跑第二个条件时:

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

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

目前我使用下面的聚合查询,

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

以上查询工作为第一个条件而对其他条件失败.请帮我.

小智 11

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

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

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

更多参考请参阅 mongo 文档


chr*_*dam 7

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

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

如果要在聚合中使用:

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

或者只是使用该distinct()方法返回与上述查询匹配的不同empIds数组:

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

  • 以上查询作为“或”条件工作。我需要“和”。即结果仅在两个条件完全匹配时返回。 (3认同)

Jul*_*aar 7

如果您正在寻找 AND 运算符

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

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

此示例检查字段是否具有“value1”“value2”

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

当只检查 null 时,返回包含不存在的字段和值为 null 的字段

db.getCollection('TheCollection').find({'the_key': null})
Run Code Online (Sandbox Code Playgroud)

  • -1 `db.getCollection('TheCollection').find({ 'the_key': 'value1', 'the_key': 'value2' })` 将计算为 `db.getCollection('TheCollection').find({ ' the_key': 'value2' })` 因为 javascript 不允许具有两个键的对象使用相同的名称。此外,mongoDB 会将多个参数评估为“AND”逻辑,而不是“OR”。 (3认同)