Het is non-trivial
oplossing.
VEREISTEN
1 We moeten een extra veld toevoegen (laten we het level
noemen) ) die aangeeft waar het document zich binnen de hiërarchie bevindt.
|root 0
|-child A 1
|--child A_1 2
|-child B 1
2 We moeten define
eerder hiërarchiediepte (bijvoorbeeld:max 3)
BEPERKING
Om vanaf een specifiek niveau te filteren, moeten we root
wijzigen en children
$match waarden.
Zorg altijd voor hiërarchieniveau:
root - 0
children - 1
root - 1
children - 2
OPLOSSING
db.documents.aggregate([
{
$facet: {
root: [
{
$match: {
level: 0
}
}
],
children: [
{
$match: {
level: 1
}
},
{
$graphLookup: {
from: "documents",
startWith: "$_id",
connectFromField: "_id",
connectToField: "parentId",
maxDepth: 0,
as: "hierarchy"
}
},
{
$sort: {
_id: 1
}
}
]
}
},
{
$unwind: "$root"
},
{
$project: {
"root._id": 1,
"root.name": 1,
"root.level": 1,
"root.hierarchy": {
$filter: {
input: "$children",
as: "sub_level",
cond: {
$eq: [
"$$sub_level.parentId",
"$root._id"
]
}
}
}
}
},
{
$replaceRoot: {
newRoot: "$root"
}
}
])
MongoPlayground (max. diepte:3) | MongoPlayground (max. diepte:4)
UITLEG
-
Met
$facet
we definiëren niveaustructuur.root
alleen alle hoofddirectory's.children
bevat alle kinderen met niveau 1 + kinderen afstammelingen. -
Wij
$filter
(samenvoegen) root en kinderen doorparentId
-
Met
$project
en$replaceRoot
we geven de originele structuur terug.
LINKS
https://docs.mongodb.com/manual/reference/operator/ aggregatie/facet/
https://docs.mongodb.com/manual/ referentie/operator/aggregatie/filter/
https://docs.mongodb.com/manual/ reference/operator/aggregation/replaceRoot/