Mongo子文档多字段查询

Mongo Query On Multiple Fields Of Sub-Document

假设我有这样一个集合:

{ "arr" : [ { "name" : "a", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "a", "num" : 2 } ] },
{ "arr" : [ { "name" : "b", "num" : 1 }, { "name" : "b", "num" : 2 } ] }

我想找到 arr 的所有文档,其中包含 name = "b" 和 num = 2.

的子文档

如果我这样查询:

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

它将 return 集合中的所有文档,因为它们每个都包含一个子文档,其 name 为 "b" 或 num 为 2。

我也试过这个:

db.collection.find({
    arr: [
        { "name": "b", "num": 2 }
    ]
});

它不会抛出任何错误,但不会 return 任何结果。

如何在 MongoDB 中查询多个子文档字段?

这实际上就是 $elemMatch 运算符的用途,尽管它经常被误用。它本质上是对数组的每个元素"within"执行查询条件。所有 MongoDB 参数都是 "and" 操作,除非另外明确调用:

db.collection.find({ "arr": { "$elemMatch": { "name": "b", "num": 2  } } })

如果您只需要匹配的字段而不是匹配的字段,您可能也想在这里 "project" 整个文档:

db.collection.find(
    { "arr": { "$elemMatch": { "name": "b", "num": 2  } } },
    { "arr.$": 1 }
)

最后解释为什么你的第二次尝试不起作用,这个查询:

db.collection.find({
    "arr": [
        { "name": "b", "num": 2 }
    ]
})

不匹配任何内容,因为没有实际文档 "arr" 包含与您的条件完全匹配的单个元素。

你的第一个例子失败了..:[=​​17=]

db.collection.find({
    $and: [
        { "arr.name": "b" },
        { "arr.num": 2 }
    ]
});

因为满足条件的数组元素有好几个,这不只是认为两个条件都适用于同一个元素。这就是 $elemMatch 添加的内容,当您需要多个条件来匹配时,这就是您使用它的地方。