如何仅在mongo shell查询中投影嵌套数组的匹配字段

ksp*_*ong 7 arrays mongodb

我对mongodb很新,我希望有一个简单的问题:

我有一个嵌套模式,其中我有一个数组的字段,其中该数组的每个项目本身都有一个数组字段.

例如:

> db.mytest.insert({
    name: 'a',
    top: [
      {x:1, y:2, nest: [{p:1, q:2}, {p:2, q:3}]},
      {x:2, y:3, nest: [{p:4, q:5}, {p:6, q:7}]}
    ]
  })
Run Code Online (Sandbox Code Playgroud)

我可以查询p的某些值就好了,甚至可以将我的结果限制为第一个匹配元素top:

> db.mytest.findOne({'top.nest': {$elemMatch: {p:6}}}, {'top.nest.$': 1})
{"_id":ObjectId(...), top: [{x:2, y: 3, nest: [{p:4, q:5}, {p:6, q:7}]}]}
Run Code Online (Sandbox Code Playgroud)

这让我想起我的问题:{'top.nest.$': 1}{'top.$': 1}我的投影文件都返回相同的结果.如何将搜索结果限制为仅包含第一个匹配元素nest

我是否需要第二遍传递这种查询方式的结果?

ksp*_*ong 6

好的,诀窍是聚合框架,特别是放松.

> db.mytest.aggregate({$unwind: '$top'},
                      {$unwind: '$top.nest'},
                      {$match: {'top.nest.p': 6}}
  )
Run Code Online (Sandbox Code Playgroud)

虽然在单个对象中有多个子匹配的情况下,这将返回多个结果而不是原始分组形式.不过,我想我可以把它$group放进管道.

虽然我发现的相关链接建议将模式重新设计为现在唯一的完整修复,所以这绝对比没有好.