你能帮我搞mongoDB聚合吗?以下是我想做的事情:
我有集合A
。来自A
的文档代表一个对象,如:
{
nameA: 'first',
items: [
'item1',
'item2',
'item3',
'item4'
]
}
我的收藏B
包含以下文件:
[
{
item: 'item3',
info: 'info1'
},
{
item: 'item3',
info: 'info2'
},
{
item: 'item3',
info: 'info3'
}
]
我处理大数据,所以最好在一个查询中完成。想象一下,我们已经拥有了集合A的所有数据。我想在集合B上构建一个查询以获得下一个结构结果:
{
'first'/*nameA*/: ['info1', 'info2', 'info3'],
....
}
如何通过MongoDB聚合实现所需的结果?
答案 0 :(得分:1)
正如Rahul Kumar在评论中提到的,你的设计更倾向于关系数据库模式设计,这使得设计高效的MongoDB变得非常困难。
但是,通过利用聚合框架的$lookup
阶段,仍然可以实现您正在寻找的功能,如下所示:
db.A.aggregate([
{
$unwind: {
path: "$items"
}
},
{
$lookup: {
from: "B",
localField: "items",
foreignField: "item",
as: "item_info"
}
},
{
$unwind: {
path: "$item_info"
}
},
{
$group: {
_id: "$nameA",
item_info: { $addToSet: "$item_info.info" }
}
}
]);
在第一个$unwind
阶段,您将items
数组规范化
collection A
以便能够将其输出传递给下一个
阶段
在$lookup
阶段,您在两个集合之间进行左连接
这是同一个数据库的一部分,在这种情况下用于获取
来自collection B
在第二个$unwind
阶段,您可以规范化您提取的数据
来自collection B
以展平包含该数组的数组
collection B
中映射到相应对象的对象
collection A
最后,在$group
阶段,您将所有条目分组
结果由nameA
设置并创建一个唯一项目信息数组
值。如果您希望所有重复出现
项目信息值,您可以替换$addToSet
累加器$push
。
以下是在您提供的集合上运行上述聚合管道的结果:
{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] }
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] }