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

Phi*_*hil 8 mongodb

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

{
'id' : 1,
'name' : 'test',
'modules' : [
    {
        name: 'foo',
        mandatory: false,
        group: [
            {
                name: g1
            }]
    },
    {
        name: 'bar',
        mandatory: false,
        group: [
            {
                name: g2
            }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用此查询:

db.test.find(
{
  modules: {
            $elemMatch: {
                 name: "foo",
            }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它不断返回所有模块.如果我使用mandatory: true它返回任何东西,这似乎表明它的工作原理.知道我做错了什么吗?谢谢!

Joh*_*yHK 17

您的查询只是返回包含modules元素的所有文档name == 'foo'.要用于$elemMatch过滤输出,您需要在find调用的projection参数中使用它而不是查询的一部分:

db.test.find({}, {modules: {$elemMatch: {name: 'foo'}}})
Run Code Online (Sandbox Code Playgroud)

要组合这两个概念,可以引用查询中匹配的数组元素的索引$:

db.test.find({modules: {$elemMatch: {name: 'foo'}}}, {'modules.$': 1})
Run Code Online (Sandbox Code Playgroud)

无论哪种方式返回:

{
  "_id": ObjectId("..."),
  "modules": [
    {
      "name": "foo",
      "mandatory": false,
      "group": [
        {
          "name": "g1"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是否可以链接'elemMatch`?例如,要过滤名称上的"组"列表吗? (17认同)