Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MongoDB

MongoDB में किसी फील्ड के विरुद्ध दस्तावेज़ों के इंटरसेक्शन को सामूहिक रूप से कैसे मिलान करें?

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
}

चरण व्याख्या

  1. $match (Name): "Chris" वाले दस्तावेज़ों तक सीमित करता है।
  2. $group (Id1 द्वारा): प्रत्येक Id1 के लिए सभी दस्तावेज़ docs में एकत्र करता है और उनकी गणना करता है।
  3. $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 न हो)।

  1. - MongoDB में एम्बेडेड दस्तावेजों को क्वेरी करें

    MongoDB में एम्बेडेड दस्तावेजों को क्वेरी करने के लिए, aggregate() का उपयोग करें। आइए दस्तावेजों के साथ एक कलेक्शन बनाते हैं: > db.demo705.insertOne( { _id:101, Information: [ { StudentName:Chris, StudentAge:21 }, { StudentName:David, StudentAge:23 },

  1. - MongoDB क्वेरी: ऐरे फील्ड वाले दस्तावेजों को मैच करें

    ऐरे फील्ड वाले दस्तावेजों को मैच करने के लिए, $elemMatch ऑपरेटर का उपयोग करें। आइए दस्तावेजों के साथ एक कलेक्शन बनाते हैं: > db.demo592.insertOne({ id:101, details: [ { Name: Chris, Value: 200 }, { Name: David, Value: 800 } ] }); { acknowledged : true, insertedId : Ob

  1. - MongoDB क्वेरी: फॉर्मूला के साथ कलेक्शन में प्रत्येक डॉक्यूमेंट के प्रत्येक फील्ड को अपडेट करें

    कलेक्शन में प्रत्येक डॉक्यूमेंट के प्रत्येक फील्ड को फॉर्मूला के साथ अपडेट करने के लिए MongoDB update() का उपयोग करें। आइए एक कलेक्शन बनाते हैं: > db.demo749.insertOne({details:[{ id:1,a:10},{id:2,a:5},{id:3,a:20}]}); { acknowledged : true, insertedId : ObjectId(5eae6fb0a930c785c834e565) } find(