MongoDB-এ অ্যারের সকল এলিমেন্ট নির্দিষ্ট শর্ত (যেমন: ৪৫-এর বেশি) পূরণ করলে ডকুমেন্ট বের করতে সরাসরি ক্যোয়ারি ব্যবহার করা যাবে না, কারণ MongoDB ডিফল্টভাবে অ্যারেতে কোনো একটি এলিমেন্ট শর্ত পূরণ করলে ডকুমেন্টটি ফেরত দেয়।
উদাহরণ
বিভিন্ন স্কোর সহ ডকুমেন্ট তৈরি করুন:
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[89,43,32,45]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd9e9f9b50a6c6dd317adb3") }
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[32,33,34,40]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd9ea13b50a6c6dd317adb4") }
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[45,56,66,69]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd9ea25b50a6c6dd317adb5") }
> db.arrayElementsNotGreaterThanDemo.insertOne({"Scores":[46,66,77,88]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd9ea3cb50a6c6dd317adb6") }
সকল ডকুমেন্ট দেখুন:
> db.arrayElementsNotGreaterThanDemo.find().pretty();
আউটপুট:
{ "_id" : ObjectId("5cd9e9f9b50a6c6dd317adb3"), "Scores" : [ 89, 43, 32, 45 ] }
{ "_id" : ObjectId("5cd9ea13b50a6c6dd317adb4"), "Scores" : [ 32, 33, 34, 40 ] }
{ "_id" : ObjectId("5cd9ea25b50a6c6dd317adb5"), "Scores" : [ 45, 56, 66, 69 ] }
{ "_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"), "Scores" : [ 46, 66, 77, 88 ] }
$gt: 45 ক্যোয়ারি চালানোর ফলাফল (ভুল ধারণা)
> db.arrayElementsNotGreaterThanDemo.find({Scores: {$gt: 45}});
আউটপুট:
{ "_id" : ObjectId("5cd9e9f9b50a6c6dd317adb3"), "Scores" : [ 89, 43, 32, 45 ] }
{ "_id" : ObjectId("5cd9ea25b50a6c6dd317adb5"), "Scores" : [ 45, 56, 66, 69 ] }
{ "_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"), "Scores" : [ 46, 66, 77, 88 ] }
সমস্যা: প্রথম এবং তৃতীয় ডকুমেন্টে ৪৫-এর নিচের মান রয়েছে (৪৩, ৩২, ৪৫), কিন্তু এগুলো ফলাফলে এসেছে। কারণ MongoDB অ্যারেতে কোনো একটি এলিমেন্ট শর্ত পূরণ করলে ডকুমেন্টটি ফেরত দেয়।
সঠিক সমাধান: $not + $elemMatch + $lte
অ্যারের কোনো এলিমেন্টই ৪৫ বা তার নিচে নেই — অর্থাৎ সকল এলিমেন্ট ৪৫-এর বেশি:
> db.arrayElementsNotGreaterThanDemo.find({
Scores: {
$not: {
$elemMatch: { $lte: 45 }
}
}
});
সঠিক আউটপুট:
{ "_id" : ObjectId("5cd9ea3cb50a6c6dd317adb6"), "Scores" : [ 46, 66, 77, 88 ] }
ব্যাখ্যা: শুধু চতুর্থ ডকুমেন্টের সকল এলিমেন্ট ৪৫-এর বেশি।
নোট: MongoDB ৩.৬+ এ $all এবং $elemMatch কম্বিনেশনও ব্যবহার করা যায়, কিন্তু উপরের পদ্ধতিটি সবচেয়ে সরল এবং কার্যকর।