यह non-trivial
है समाधान।
आवश्यकताएं
1 हमें अतिरिक्त फ़ील्ड जोड़ने की आवश्यकता है (चलिए इसे level
कहते हैं) ) जो इंगित करता है कि पदानुक्रम के अंदर दस्तावेज़ कहाँ स्थित है।
|root 0
|-child A 1
|--child A_1 2
|-child B 1
2 हमें define
करने की आवश्यकता है पहले पदानुक्रम गहराई (उदाहरण के लिए:अधिकतम 3)
सीमा
विशिष्ट स्तर से फ़िल्टर करने के लिए, हमें root
. को संशोधित करने की आवश्यकता है और children
$मिलान मान।
हमेशा पदानुक्रम स्तर सुनिश्चित करें:
root - 0
children - 1
root - 1
children - 2
समाधान
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 (अधिकतम गहराई:3) | MongoPlayground (अधिकतम गहराई:4)
व्याख्या
-
$facet
. के साथ हम स्तर संरचना को परिभाषित करते हैं।root
केवल सभी रूट निर्देशिका।children
स्तर 1 + बच्चों के वंशज वाले सभी बच्चे शामिल हैं। -
हम
$filter
(मर्ज) रूट और बच्चेparentId
. द्वारा -
$project
. के साथ और$replaceRoot
हम मूल संरचना लौटाते हैं।
लिंक्स
https://docs.mongodb.com/manual/reference/operator/ एकत्रीकरण/पहलू/
https://docs.mongodb.com/manual/ संदर्भ/संचालक/एकत्रीकरण/फ़िल्टर/
https://docs.mongodb.com/manual/ संदर्भ/संचालक/एकत्रीकरण/प्रतिस्थापन रूट/