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

时间:2014-12-13 17:32:47

标签: 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}]}
    ]
  })

我可以查询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}]}]}

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

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

1 个答案:

答案 0 :(得分:6)

好的,诀窍是aggregation framework, specifically unwind

> db.mytest.aggregate({$unwind: '$top'},
                      {$unwind: '$top.nest'},
                      {$match: {'top.nest.p': 6}}
  )

虽然如果我在一个对象中有多个子匹配,这将返回多个结果而不是原始分组形式。我想我可以将$group放入管道中。

虽然我发现的相关链接建议将架构重新设计为现在唯一的完整解决方案,所以这绝对比没有好。