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

标签 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 的第一个匹配元素?

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

最佳答案

好的,诀窍是 aggregation framework, specifically unwind .

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

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

虽然我发现的相关链接建议将架构重新设计作为目前唯一完整的修复,所以这绝对比没有好。

关于arrays - 如何在mongo shell查询中仅投影嵌套数组的匹配字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461690/

相关文章:

arrays - Powershell根据属性将用户对象数组拆分为两个数组

php - current() 函数是否保证以指向数组第一个元素的内部指针开始?

node.js - 如何在 Mongoose 中的其他字段上创建可选字段?

mongodb - 在 Golang 和 MongoDB 中将路由拆分为单独的包

javascript - 是否可以在不超过调用堆栈的情况下展平一个 700 000 个条目的数组?

python - Psycopg2 --- 插入数组

arrays - 更新嵌套数组 Mongoose

php - mongo php 驱动程序扩展在 cli 中加载,而不是在 OSX 中加载 apache

mongodb - 从字符串值中删除空格(前导和尾随)

c# - 在 MVC 中使用 Json.NET 自动将 mongodb ObjectId 重新调整为字符串