तुरंत दिखाई नहीं देता लेकिन संभव है। यहां आपको अपने शीर्ष स्तर के दस्तावेज़ को बिना डुप्लिकेट किए टिप्पणियों की सरणी के साथ संयोजित करने की आवश्यकता है। यहां सामग्री को पहले दो सरणियों के रूप में एकवचन सरणी में शामिल करने का तरीका दिया गया है, फिर $अनविंड करें
सामग्री को समूहीकृत करने के लिए:
db.collection.aggregate([
{ "$group": {
"_id": "$_id",
"author": {
"$addToSet": {
"id": "$_id",
"author": "$author",
"votes": "$votes"
}
},
"comments": { "$first": "$comments" }
}},
{ "$project": {
"combined": { "$setUnion": [ "$author", "$comments" ] }
}},
{ "$unwind": "$combined" },
{ "$group": {
"_id": "$combined.author",
"votes": { "$sum": "$combined.votes" }
}},
{ "$sort": { "votes": -1 } }
])
जो आउटपुट देता है:
{ "_id" : "Jesse", "votes" : 148 }
{ "_id" : "Mirek", "votes" : 135 }
{ "_id" : "Leszke", "votes" : 13 }
यहां तक कि पहले $group
मंच और एक संयुक्त सरणी को एक अलग तरीके से बनाना:
db.collection.aggregate([
{ "$project": {
"combined": {
"$setUnion": [
{ "$map": {
"input": { "$literal": ["A"] },
"as": "el",
"in": {
"author": "$author",
"votes": "$votes"
}
}},
"$comments"
]
}
}},
{ "$unwind": "$combined" },
{ "$group": {
"_id": "$combined.author",
"votes": { "$sum": "$combined.votes" }
}},
{ "$sort": { "votes": -1 } }
])
वे ऑपरेटर का उपयोग करते हैं जैसे $setUnion
और यहां तक कि $map
जिसे MongoDB 2.6 के रूप में पेश किया गया था। यह इसे आसान बनाता है, लेकिन यह अभी भी पुराने संस्करणों में किया जा सकता है जिनमें उन ऑपरेटरों की कमी है, जो समान सिद्धांतों का पालन करते हैं:
db.collection.aggregate([
{ "$project": {
"author": 1,
"votes": 1,
"comments": 1,
"type": { "$const": ["A","B"] }
}},
{ "$unwind": "$type" },
{ "$unwind": "$comments" },
{ "$group": {
"_id": {
"$cond": [
{ "$eq": [ "$type", "A" ] },
{
"id": "$_id",
"author": "$author",
"votes": "$votes"
},
"$comments"
]
}
}},
{ "$group": {
"_id": "$_id.author",
"votes": { "$sum": "$_id.votes" }
}},
{ "$sort": { "votes": -1 } }
])
$const
अनिर्दिष्ट है लेकिन मोंगोडीबी के सभी संस्करणों में मौजूद है जहां एकत्रीकरण ढांचा मौजूद है (2.2 से)। MongoDB 2.6 पेश किया गया $literal
जो अनिवार्य रूप से एक ही अंतर्निहित कोड से जुड़ता है। इसका उपयोग यहां दो मामलों में किया गया है ताकि या तो एक सरणी के लिए एक टेम्पलेट तत्व प्रदान किया जा सके, या दो क्रियाओं के बीच "बाइनरी विकल्प" प्रदान करने के लिए एक सरणी को खोलने के लिए शुरू किया जा सके।