Mongo查询子文档的多个字段

时间:2015-01-13 04:00:21

标签: mongodb mongodb-query

假设我有这样的集合:

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

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

我也试过这个:

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

不会丢失任何错误,但不会返回任何结果。

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

1 个答案:

答案 0 :(得分:30)

这实际上是$elemMatch运算符的用途,即使它经常被误用。它基本上对每个元素执行查询条件"在"数组。所有MongoDB参数都是"和"操作除非另有明确说明:

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

你可能也想"项目"如果您只期望匹配的字段而不是 整个文件:

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

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

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

不匹配任何东西,因为没有实际文件在哪里" arr"包含与您的条件完全匹配的单一元素。

你的第一个例子失败了..:

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

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