作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 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/
我是一名优秀的程序员,十分优秀!