使用elemMatch进行MongoDB嵌套数组数据的查询

9

我有一个包含嵌套数组数据的文档。我曾无助地尝试使用$elemMatch过滤数据,但我无法弄清楚为什么它不起作用。

{
'id' : 1,
'name' : 'test',
'modules' : [
    {
        name: 'foo',
        mandatory: false,
        group: [
            {
                name: g1
            }]
    },
    {
        name: 'bar',
        mandatory: false,
        group: [
            {
                name: g2
            }]
    }]
}

我尝试使用以下查询:

db.test.find(
{
  modules: {
            $elemMatch: {
                 name: "foo",
            }
  }
}

但是它一直返回所有的模块。如果我使用 mandatory: true,则不会返回任何内容,这似乎表明它起作用了。你有什么想法我做错了什么吗?谢谢!

查询很容易,但更新呢? - Pavel Nikolov
1个回答

18

您的查询只是返回所有包含元素modulesname == 'foo'的文档。要使用$elemMatch来过滤输出,您需要将其用于find调用的投影参数中,而不是查询的一部分:

db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
为了将这两个概念结合起来,您可以使用$引用查询匹配的数组元素的索引:
db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})

无论哪种方式都会返回:

{
  "_id": ObjectId("..."),
  "modules": [
    {
      "name": "foo",
      "mandatory": false,
      "group": [
        {
          "name": "g1"
        }
      ]
    }
  ]
}

如果您需要输出包括其他字段,请将它们添加到投影对象中(例如:name: 1)。


18
可以使用elemMatch链式调用吗?例如,同时基于名称和“group”列表进行过滤? - Phil

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