MongoDB में किसी फील्ड (उदाहरण के लिए Id1) द्वारा दस्तावेज़ों को ग्रुप करने और केवल उन ग्रुप्स को ढूंढने के लिए जिनके दस्तावेज़ सामूहिक रूप से दूसरे फील्ड (उदाहरण के लिए Id2) के कई मानों को कवर करते हैं, $group के साथ $push और $match के साथ $all + $elemMatch का उपयोग करें।
उदाहरण: Id1, Name, Id2 वाले दस्तावेज़
> db.demo393.insertOne({ Id1:"1", Name:"Chris", Id2:"100" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e804") }
> db.demo393.insertOne({ Id1:"1", Name:"Chris", Id2:"101" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e805") }
> db.demo393.insertOne({ Id1:"3", Name:"Chris", Id2:"100" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e806") }
> db.demo393.insertOne({ Id1:"3", Name:"Mike", Id2:"101" });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5e6dd522064be7ab44e807") }
दस्तावेज़ देखना
> db.demo393.find();
आउटपुट: चार दस्तावेज़।
एग्रीगेशन: Name="Chris" वाले ग्रुप्स ढूंढें जिनमें Id2 के 100 और 101 दोनों हों
> db.demo393.aggregate([
{ $match: { "Name": "Chris" } },
{ $group: {
_id: "$Id1",
docs: { $push: "$$ROOT" },
count: { $sum: 1 }
}},
{ $match: {
count: { $gt: 1 },
docs: {
$all: [
{ $elemMatch: { "Id2": "100" } },
{ $elemMatch: { "Id2": "101" } }
]
}
}}
]);
परिणाम
{
"_id" : "1",
"docs" : [
{ "_id" : ObjectId("5e5e6dd522064be7ab44e804"), "Id1" : "1", "Name" : "Chris", "Id2" : "100" },
{ "_id" : ObjectId("5e5e6dd522064be7ab44e805"), "Id1" : "1", "Name" : "Chris", "Id2" : "101" }
],
"count" : 2
}
चरण व्याख्या
- $match (Name): "Chris" वाले दस्तावेज़ों तक सीमित करता है।
- $group (Id1 द्वारा): प्रत्येक Id1 के लिए सभी दस्तावेज़
docsमें एकत्र करता है और उनकी गणना करता है। - $match (ग्रुप फ़िल्टर): रखता है ग्रुप जहां:
count > 1(एक से अधिक दस्तावेज़)।docsसरणी में दोनों एक दस्तावेज़Id2="100"के साथ और एकId2="101"के साथ हो ($all+$elemMatch)।
व्याख्या
- Id1="1" के पास Id2=100 और 101 दोनों के साथ दस्तावेज़ हैं → शामिल।
- Id1="3" के पास केवल Id2=100 है (Chris के लिए) → बाहर क्योंकि Id2=101 गायब है। <ली>यह पैटर्न "सेट कवरेज" क्वेरी के लिए उपयोगी है: ग्रुप ढूंढें जो सामूहिक रूप से आवश्यक मानों के सेट को संतुष्ट करते हैं।ली>
प्रदर्शन
बड़े डेटासेट के लिए, Name और Id1 पर इंडेक्स बनाने पर विचार करें। एग्रीगेशन मेमोरी में ग्रुप करता है (100MB लिमिट जब तक allowDiskUse: true न हो)।