কম্পিউটার টিউটোরিয়াল

MongoDB-এ অ্যারে এলিমেন্টে নির্দিষ্ট ফিল্ড অনুপস্থিত থাকা ডকুমেন্ট খুঁজে বের করা

MongoDB-এ একটি অ্যারে ফিল্ডের এলিমেন্টগুলোর মধ্যে নির্দিষ্ট ফিল্ড অনুপস্থিত থাকা ডকুমেন্ট খুঁজে বের করতে $elemMatch অপারেটর ব্যবহার করা হয়। এটি অ্যারেতে কমপক্ষে একটি এলিমেন্ট শর্ত পূরণ করলে ডকুমেন্ট ম্যাচ করে।

নমুনা কালেকশন তৈরি

> db.demo239.insertOne({
  "Name": "Chris",
  "details": [
    { "DueDate": new ISODate("2019-01-21"), "ProductPrice": 1270 },
    { "DueDate": new ISODate("2020-02-12"), "ProductPrice": 2000 }
  ]
});
{ "acknowledged": true, "insertedId": ObjectId("5e441c6bf4cebbeaebec5157") }

> db.demo239.insertOne({
  "Name": "David",
  "details": [
    { "DueDate": new ISODate("2018-11-11"), "ProductPrice": 1450 },
    { "DueDate": new ISODate("2020-02-12") }
  ]
});
{ "acknowledged": true, "insertedId": ObjectId("5e441c6cf4cebbeaebec5158") }

ডকুমেন্টগুলো দেখানো

> db.demo239.find();

আউটপুট:

{ 
  "_id": ObjectId("5e441c6bf4cebbeaebec5157"), 
  "Name": "Chris", 
  "details": [ 
    { "DueDate": ISODate("2019-01-21T00:00:00Z"), "ProductPrice": 1270 }, 
    { "DueDate": ISODate("2020-02-12T00:00:00Z"), "ProductPrice": 2000 } 
  ] 
}
{ 
  "_id": ObjectId("5e441c6cf4cebbeaebec5158"), 
  "Name": "David", 
  "details": [ 
    { "DueDate": ISODate("2018-11-11T00:00:00Z"), "ProductPrice": 1450 }, 
    { "DueDate": ISODate("2020-02-12T00:00:00Z") } 
  ] 
}

ProductPrice ফিল্ড অনুপস্থিত এলিমেন্ট থাকা ডকুমেন্ট খুঁজে বের করা

> db.demo239.find({ 
  "details": { 
    "$elemMatch": { 
      "DueDate": { "$exists": true }, 
      "ProductPrice": { "$exists": false } 
    } 
  } 
})

ফলাফল

{ 
  "_id": ObjectId("5e441c6cf4cebbeaebec5158"), 
  "Name": "David", 
  "details": [ 
    { "DueDate": ISODate("2018-11-11T00:00:00Z"), "ProductPrice": 1450 }, 
    { "DueDate": ISODate("2020-02-12T00:00:00Z") } 
  ] 
}

ব্যাখ্যা:

  • $elemMatch - অ্যারেতে কমপক্ষে একটি এলিমেন্ট দুটি শর্ত পূরণ করলে ম্যাচ: (১) DueDate আছে, (২) ProductPrice নেই।
  • Chris-এর উভয় এলিমেন্টে ProductPrice আছে, তাই ম্যাচ করেনি।
  • David-এর দ্বিতীয় এলিমেন্টে ProductPrice নেই, DueDate আছে - তাই ম্যাচ করেছে।

$elemMatch ছাড়া (ভুল পদ্ধতি)

// এটি ভুল ফলাফল দেবে - আলাদা এলিমেন্ট থেকে শর্ত পূরণ করলেও ম্যাচ করবে
db.demo239.find({ 
  "details.DueDate": { $exists: true }, 
  "details.ProductPrice": { $exists: false } 
})

এটি Chris-এর ডকুমেন্টও রিটার্ন করবে (কারণ প্রথম এলিমেন্টে DueDate আছে, দ্বিতীয়ে ProductPrice নেই - কিন্তু আলাদা এলিমেন্ট)। $elemMatch একই এলিমেন্টে দুটি শর্ত পূরণ চায়।

  1. MongoDB-তে $elemMatch ব্যবহার করে অ্যারে ভ্যালু অনুযায়ী ডকুমেন্ট ফিল্টার করা

  2. MongoDB ডকুমেন্টের নির্দিষ্ট ফিল্ড থেকে অ্যারে এলিমেন্ট কাউন্ট করা

  3. MongoDB-এ অবজেক্টের অ্যারে থেকে নেস্টেড ডকুমেন্ট কোয়েরি করা ($elemMatch)

  4. MongoDB-এ অ্যারে কোয়েরি করে নির্দিষ্ট ভ্যালু ফেচ করা