gpt4 book ai didi

mongodb - $aggregation 和 $lookup 在同一个集合中 - mongodb

转载 作者:IT老高 更新时间:2023-10-28 13:25:11 26 4
gpt4 key购买 nike

结构差不多;

[   
{id: 1, name: "alex" , children: [2, 4, 5]},
{id: 2, name: "felix", children: []},
{id: 3, name: "kelly", children: []},
{id: 4, name: "hannah", children: []},
{id: 5, name: "sonny", children: [6]},
{id: 6, name: "vincenzo", children: []}
]

children 数组不为空时,我想用名称替换 children id。

所以查询的结果应该是;

[   {id: 1, name: "alex" , children: ["felix", "hannah" , "sonny"]}
{id: 5, name: "sonny", children: ["vincenzo"]}
]

我做了什么来实现这个目标;

db.list.aggregate([
{$lookup: { from: "list", localField: "id", foreignField: "children", as: "children" }},
{$project: {"_id" : 0, "name" : 1, "children.name" : 1}},
])

用它的 parent 填充 child ,这不是我想要的:)

{ "name" : "alex", "parent" : [ ] }
{ "name" : "felix", "parent" : [ { "name" : "alex" } ] }
{ "name" : "kelly", "parent" : [ ] }
{ "name" : "hannah", "parent" : [ { "name" : "alex" } ] }
{ "name" : "sonny", "parent" : [ { "name" : "alex" } ] }
{ "name" : "vincenzo", "parent" : [ { "name" : "sonny" } ] }

我误会了什么?

最佳答案

在使用 $lookup 阶段之前,您应该对子数组使用 $unwind,然后对子数组使用 $lookup。在 $lookup 阶段之后,您需要使用 $group 来获取具有 name 而不是 id

你可以试试:

db.list.aggregate([
{$unwind:"$children"},
{$lookup: {
from: "list",
localField: "children",
foreignField: "id",
as: "childrenInfo"
}
},
{$group:{
_id:"$_id",
children:{$addToSet:{$arrayElemAt:["$childrenInfo.name",0]}},
name:{$first:"$name"}
}
}
]);

// can use $push instead of $addToSet if name can be duplicate

为什么使用 $group

例如:你的第一份文件

{id: 1, name: "alex" , children: [2, 4, 5]}

$unwind 之后,您的文档将如下所示

{id: 1, name: "alex" , children: 2},
{id: 1, name: "alex" , children: 4},
{id: 1, name: "alex" , children: 5}

$lookup

之后
{id: 1, name: "alex" , children: 2,
"childrenInfo" : [
{
"id" : 2,
"name" : "felix",
"children" : []
}
]},
//....

然后在$group

之后
 {id: 1, name: "alex" , children: ["felix", "hannah" , "sonny"]}

关于mongodb - $aggregation 和 $lookup 在同一个集合中 - mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com