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

MongoDB में नेस्टेड ऐरे के सभी एलिमेंट्स शर्त पूरी करें ऐसे ऑब्जेक्ट फ़िल्टर करना

MongoDB एग्रीगेशन में $unwind और $group का उपयोग करके नेस्टेड ऐरे की सभी एलिमेंट्स शर्त जांचना

MongoDB में किसी दस्तावेज़ के नेस्टेड ऐरे के सभी एलिमेंट्स एक शर्त पूरी करते हैं यह जांचने के लिए, ऐरे को अनविंड करें, ग्रुप करके गिनती करें, फिर तुलना करें।

उदाहरण: संग्रह और दस्तावेज़ बनाना

> db.demo418.insertOne({
  "details":[
    {"CountryName":"US","Marks":45},
    {"CountryName":"US","Marks":56}
  ],
  "Name":"John"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e724324b912067e57771ae6") }

> db.demo418.insertOne({
  "details":[
    {"CountryName":"US","Marks":78},
    {"CountryName":"UK","Marks":97}
  ],
  "Name":"Mike"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e724325b912067e57771ae7") }

सभी दस्तावेज़ देखना

> db.demo418.find();

आउटपुट:

{ "_id" : ObjectId("5e724324b912067e57771ae6"), "details" : [ { "CountryName" : "US", "Marks" : 45 }, { "CountryName" : "US", "Marks" : 56 } ], "Name" : "John" }
{ "_id" : ObjectId("5e724325b912067e57771ae7"), "details" : [ { "CountryName" : "US", "Marks" : 78 }, { "CountryName" : "UK", "Marks" : 97 } ], "Name" : "Mike" }

सभी details एलिमेंट्स में CountryName == "US" वाले दस्तावेज़ फ़िल्टर करना

> db.demo418.aggregate([
  {$unwind:"$details"},
  { $group: {
    _id: '$_id',
    details : { $first: '$details' },
    alldetails: { $sum: 1 },
    alldetailsmatch: { $sum: { $cond: [ { $eq: [ '$details.CountryName', "US" ] }, 1, 0 ] } },
    Name: { $first: '$Name' }
  }},
  { $project: {
    _id: 1,
    Name: 1,
    details: 1,
    arrayValue: { $cond: [ { $eq: [ '$alldetails', '$alldetailsmatch' ] }, 1, 0 ] }
  }},
  { $match: { 'arrayValue' : 1 } }
])

आउटपुट:

{ "_id" : ObjectId("5e724324b912067e57771ae6"), "details" : { "CountryName" : "US", "Marks" : 45 }, "Name" : "John", "arrayValue" : 1 }

व्याख्या:

  1. $unwind: "$details" - ऐरे के प्रत्येक एलिमेंट के लिए अलग दस्तावेज़ बनाता है
  2. $group - मूल _id द्वारा पुनः ग्रुप करता है:
    • alldetails - कुल एलिमेंट्स की गिनती
    • alldetailsmatch - शर्त पूरी करने वाले एलिमेंट्स की गिनती
  3. $project - arrayValue फील्ड बनाता है: दोनों गिनती बराबर हैं तो 1
  4. $match - केवल arrayValue: 1 वाले दस्तावेज़ रखता है

सरल विकल्प (MongoDB 3.6+): $all ऑपरेटर या $not + $elemMatch

// सभी एलिमेंट्स US हैं (कोई गैर-US नहीं)
db.demo418.find({
  "details.CountryName": { $not: { $elemMatch: { $ne: "US" } } }
})

// या एग्रीगेशन में $allElementsTrue
db.demo418.aggregate([
  { $match: {
    $expr: {
      $allElementsTrue: {
        $map: { input: "$details", as: "d", in: { $eq: ["$$d.CountryName", "US"] } }
      }
    }
  }}
])
  1. - MongoDB क्वेरी: फील्ड वैल्यू ऐरे होने पर दस्तावेज़ों से नामों की विशिष्ट सूची प्राप्त करना

    इसके लिए $all का उपयोग करें। $all ऑपरेटर उन दस्तावेज़ों को चुनता है जहां फील्ड का मान एक ऐरे होता है जिसमें सभी निर्दिष्ट एलिमेंट्स होते हैं। नमूना डेटा बनाना db.demo642.insertOne({ _id:2, ListOfNames:[Robert,Chris] }); सभी दस्तावेज़ देखना db.demo642.find(); { ListOfNames : [ Robert, John ] } {

  1. - MongoDB में नेस्टेड सरणी को कैसे सॉर्ट करें?

    MongoDB में नेस्टेड सरणी को सॉर्ट करने के लिए, $sort का उपयोग करें। आइए दस्तावेज़ों के साथ एक संग्रह बनाएं: > db.demo505.insertOne( { details: [ { Name:Chris, Score:58 }, { Name:Bob, Score:45 }, { Name:John, Score:68 }, { Name:David, Score:46 } ] }); { ackn

  1. - MySQL क्वेरी में सरणी के तत्वों का मिलान कैसे करें?

    IN ऑपरेटर और HAVING COUNT का उपयोग करके सरणी मिलान आइए पहले एक टेबल बनाते हैं: CREATE TABLE DemoTable1523 ( Id INT, Value INT ); Query OK, 0 rows affected (0.76 sec) रिकॉर्ड्स डालना INSERT INTO DemoTable1523 VALUES(1, 99); Query OK, 1 row affected (0.10 sec) सभी रिकॉर्ड्स देखना SELECT