MongoDB में किसी फील्ड द्वारा दस्तावेज़ों को ग्रुप करने और दूसरे फील्ड के मान एकत्र करने के लिए, $group के साथ $addToSet/$push और $reduce/$concatArrays का उपयोग करें ताकि सरणी फ़्लैट हो सके।
उदाहरण: शौक और देश वाले दस्तावेज़
> db.demo374.insertOne({
"Name" : "Chris",
"HobbyDetails" : [ "Reading Book", "Playing Football" ],
"CountryName" : "US"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a04402ae06a1609a00b04") }
> db.demo374.insertOne({
"Name" : "Chris",
"HobbyDetails" : [ "Browsing Internet", "Playing Football" ],
"CountryName" : "US"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a04402ae06a1609a00b05") }
दस्तावेज़ देखना
> db.demo374.find();
आउटपुट: समान नाम/देश, अलग-अलग शौक सरणी वाले दो दस्तावेज़।
एग्रीगेशन: नाम द्वारा ग्रुप करें और शौक सरणी संयोजित करें
> db.demo374.aggregate([
{ $match: { "CountryName": "US" } },
{ $group: {
_id: "$Name",
HobbyDetails: { $addToSet: "$HobbyDetails" }
}},
{ $project: {
_id: 0,
Name: "$_id",
HobbyDetails: {
$reduce: {
input: "$HobbyDetails",
initialValue: [],
in: { $concatArrays: [ "$$value", "$$this" ] }
}
}
}}
]).pretty()
परिणाम
{ "Name" : "Chris", "HobbyDetails" : [ "Browsing Internet", "Playing Football", "Reading Book", "Playing Football" ] }
चरण व्याख्या
- $match: देश द्वारा फ़िल्टर।
- $group + $addToSet: नाम द्वारा ग्रुप करता है, अद्वितीय शौक सरणी एकत्र करता है (सरणी की सरणी)।
- $project + $reduce + $concatArrays: सरणी की सरणी को एकल सरणी में फ़्लैट करता है।
नोट
$addToSetसरणी स्तर पर डुप्लिकेट हटाता है; तत्व स्तर पर डुप्लिकेट (Playing Footballदो बार) बने रहते हैं। तत्व-स्तरीय विशिष्टता के लिए,$unwind→$groupसाथ$addToSetका उपयोग करें।- MongoDB 4.4+
$accumulatorया$functionका उपयोग कस्टम मर्ज के लिए कर सकता है।