निम्नलिखित पाइपलाइन आपके लिए काम करेगी:
var pipeline = [
{
"$project": {
"title": 1, "body": 1,
"post_id": { "$ifNull": [ "$_post", "$_id" ] }
}
},
{
"$group": {
"_id": "$post_id",
"title": { "$first": "$title" },
"body": { "$first": "$body" },
"comments": {
"$push": {
"_id": "$_id",
"_post": "$post_id",
"body": "$body"
}
}
}
},
{
"$project": {
"title": 1, "body": 1,
"comments": {
"$setDifference": [
{
"$map": {
"input": "$comments",
"as": "el",
"in": {
"$cond": [
{ "$ne": [ "$$el._id", "$$el._post" ] },
"$$el",
false
]
}
}
},
[false]
]
}
}
}
];
Post.aggregate(pipeline, function (err, result) {
if (err) { /* handle error */ };
console.log(result);
});
पाइपलाइन इस तरह से संरचित है कि आपका पहला कदम, $project
ऑपरेटर चरण, फ़ील्ड को प्रोजेक्ट करना है post_id
अगले पाइपलाइन चरण में कुंजी द्वारा समूह के रूप में उपयोग किया जाना है। चूंकि आपकी स्कीमा पदानुक्रमित है, इसलिए आपको माता-पिता/रूट दस्तावेज़ों के लिए इस फ़ील्ड की आवश्यकता होगी। $ifNull
यदि दस्तावेज़ में फ़ील्ड मौजूद नहीं है, तो ऑपरेटर कोलेस ऑपरेटर के रूप में कार्य करेगा और प्रतिस्थापन मूल्य वापस कर देगा।
अगला पाइपलाइन चरण, $समूह
पाइपलाइन चरण डेटा को संसाधित करने के लिए समूहबद्ध करने का प्रयास करता है। $group
पाइपलाइन ऑपरेटर SQL के ग्रुप बाय क्लॉज के समान है। SQL में, हम GROUP BY का उपयोग तब तक नहीं कर सकते जब तक कि हम किसी एकत्रीकरण फ़ंक्शन का उपयोग नहीं करते। उसी तरह, हमें MongoDB में भी एकत्रीकरण फ़ंक्शन का उपयोग करना होगा। इस मामले में आपको $पुश
टिप्पणी सरणी बनाने के लिए ऑपरेटर। फिर अन्य फ़ील्ड $पहले
ऑपरेटर।
अंतिम चरण में टिप्पणी सरणी को फिट करना शामिल है ताकि आप दस्तावेज़ को पोस्ट विवरण के साथ हटा दें, जो निश्चित रूप से टिप्पणी प्रकार का नहीं है। इसे <के ज़रिए संभव बनाया गया है कोड>$सेटडिफरेंस
और $map
ऑपरेटरों। $map
ऑपरेटर संक्षेप में एक नया सरणी फ़ील्ड बनाता है जो एक सरणी के प्रत्येक तत्व के लिए एक उप-अभिव्यक्ति में मूल्यांकन किए गए तर्क के परिणामस्वरूप मान रखता है। $setDifference
ऑपरेटर तब तत्वों के साथ एक सेट देता है जो पहले सेट में दिखाई देता है लेकिन दूसरे सेट में नहीं; यानी पहले के सापेक्ष दूसरे सेट का एक सापेक्ष पूरक करता है। इस मामले में यह अंतिम टिप्पणियों
. लौटाएगा सरणी जिसमें _id
. के माध्यम से मूल दस्तावेज़ों से संबंधित तत्व नहीं हैं संपत्ति।