Javascript Mongodb$graphLookup构建层次结构
我有一个来自mongodbJavascript Mongodb$graphLookup构建层次结构,javascript,mongodb,mongoose,graphlookup,Javascript,Mongodb,Mongoose,Graphlookup,我有一个来自mongodb$graphLookup聚合的输出: db.getCollection('projects').aggregate([ { $lookup: { from: "projects", localField: "_id", foreignField: "parent", as: "childrens" } } ]) 我需要从javascript中的输出构建层次结构,或者如果可能的话,直接从查询
$graphLookup
聚合的输出:
db.getCollection('projects').aggregate([
{
$lookup: {
from: "projects",
localField: "_id",
foreignField: "parent",
as: "childrens"
}
}
])
我需要从javascript中的输出构建层次结构,或者如果可能的话,直接从查询中构建层次结构,因此最终输出应该如下所示:
{
"_id" : "1",
"name" : "Project1",
"parent" : null,
"childrens" : [
{
"_id" : "3",
"name" : "ProjectForId1",
"parent" : "1",
"childrens" : [
{
"_id" : "6",
"name" : "ProjectForId3",
"parent" : "3"
},
{
"_id" : "7",
"name" : "ProjectForId3",
"parent" : "3"
}
]
}
]
}
此外,如果有人有勇气在另一种情况下提供帮助,在这种情况下,将通过过滤id创建层次结构:
例如:对于\u id=“1”
而言,输出将与上述相同,但如果\u id
为3
,则最终输出应如下所示:
{
"_id" : "3",
"name" : "ProjectForId1",
"parent" : "1",
"childrens" : [
{
"_id" : "6",
"name" : "ProjectForId3",
"parent" : "3"
},
{
"_id" : "7",
"name" : "ProjectForId3",
"parent" : "3"
}
]
}
下面的答案和我过去的答案差不多,所以你们可以得到详细的解释
最后一个阶段应该是过滤,这样你可以在这里获得任何深度的数据。下面的解决方案与我过去的一个答案大致相同,因此你可以得到详细的解释
最后一个阶段应该是过滤,因此您可以在此处获得任何深度级别的数据。感谢您的回答,但不幸的是,您预期的结果并不正确。输出是
{u-id:“1”,“name:”Project1”,“parent:”null,“childrens:[{{u-id:”3”,“name:”ProjectForId1”,“parent:”1“}]}
,正如您可以看到的那样,{u-id的“6”和“7”没有显示为“3”的children@2009年,我假设您发布的JSON是一个输入,可能您需要将查找放在前面it@mikl请在我的帖子中找到我的解释,因为这里的平台告诉我,我超过了407个字符。。。感谢you@durduliu2009粘贴源数据时,这会发生很大变化。幸运的是,它与我以前的一个答案非常相似,因此您可以查看我修改过的帖子。@mikl首先我要感谢您的帮助,我非常感谢您最后的答案,但不幸的是,此聚合仍然存在一个小问题。。。我已经用一个新文档更新了我的评论,该文档的_id=8,parent=6,这个新文档“_id”:8似乎出现在“_id”6和7中,但它应该只出现在“_id”=6中。因此,上面更新了新的完整示例。再次感谢您的努力,如果最后一个问题您能帮助我,我将非常高兴听到您的回答,但不幸的是,您预期的结果并不好。输出是{u-id:“1”,“name:”Project1”,“parent:”null,“childrens:[{{u-id:”3”,“name:”ProjectForId1”,“parent:”1“}]}
,正如您可以看到的那样,{u-id的“6”和“7”没有显示为“3”的children@2009年,我假设您发布的JSON是一个输入,可能您需要将查找放在前面it@mikl请在我的帖子中找到我的解释,因为这里的平台告诉我,我超过了407个字符。。。感谢you@durduliu2009粘贴源数据时,这会发生很大变化。幸运的是,它与我以前的一个答案非常相似,因此您可以查看我修改过的帖子。@mikl首先我要感谢您的帮助,我非常感谢您最后的答案,但不幸的是,此聚合仍然存在一个小问题。。。我已经用一个新文档更新了我的评论,该文档的_id=8,parent=6,这个新文档“_id”:8似乎出现在“_id”6和7中,但它应该只出现在“_id”=6中。因此,上面更新了新的完整示例。再次感谢你的努力,如果你能帮我解决最后一个问题,我将非常高兴
{
"_id" : "3",
"name" : "ProjectForId1",
"parent" : "1",
"childrens" : [
{
"_id" : "6",
"name" : "ProjectForId3",
"parent" : "3"
},
{
"_id" : "7",
"name" : "ProjectForId3",
"parent" : "3"
}
]
}
db.projects.aggregate([
{
$graphLookup: {
from: "projects",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parent",
as: "children",
maxDepth: 4,
depthField: "level"
}
},
{
$unwind: "$children"
},
{
$sort: { "children.level": -1 }
},
{
$group: {
_id: "$_id",
children: { $push: "$children" }
}
},
{
$addFields: {
children: {
$reduce: {
input: "$children",
initialValue: {
currentLevel: -1,
currentLevelProjects: [],
previousLevelProjects: []
},
in: {
$let: {
vars: {
prev: {
$cond: [
{ $eq: [ "$$value.currentLevel", "$$this.level" ] },
"$$value.previousLevelProjects",
"$$value.currentLevelProjects"
]
},
current: {
$cond: [
{ $eq: [ "$$value.currentLevel", "$$this.level" ] },
"$$value.currentLevelProjects",
[]
]
}
},
in: {
currentLevel: "$$this.level",
previousLevelProjects: "$$prev",
currentLevelProjects: {
$concatArrays: [
"$$current",
[
{ $mergeObjects: [
"$$this",
{ children: { $filter: { input: "$$prev", as: "e", cond: { $eq: [ "$$e.parent", "$$this._id" ] } } } }
] }
]
]
}
}
}
}
}
}
}
},
{
$addFields: { children: "$children.currentLevelProjects" }
},
{
$match: {
_id: "1"
}
}
])