MongoDB-এ অ্যারে অবজেক্টের মধ্যে অ্যাট্রিবিউট তুলনা
একই ডকুমেন্টের অ্যারেতে থাকা বিভিন্ন অবজেক্টের ফিল্ড মান তুলনা করার জন্য অগ্রেশন পাইপলাইনে $expr, $let, $indexOfArray এবং $arrayElemAt ব্যবহার করা হয়।
উদাহরণ: নেস্টেড ডিটেইলস সহ ডকুমেন্ট তৈরি
> db.demo366.insertOne({ "Name" : "Chris", "details" : [ { "Id" : "John1", "value" : "test" }, { "Id" : "John2", "value" : 18 }, { "Id" : "John3", "value" : 20 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e57ddd92ae06a1609a00ae7") }
ডকুমেন্ট দেখানো
> db.demo366.find();
{ "_id" : ObjectId("5e57ddd92ae06a1609a00ae7"), "Name" : "Chris", "details" : [ { "Id" : "John1", "value" : "test" }, { "Id" : "John2", "value" : 18 }, { "Id" : "John3", "value" : 20 } ] }
তুলনা কুয়েরি: John2.value < John3.value কিনা চেক করা
> db.demo366.find({
"$expr":{
"$let":{
"vars":{
"john2":{"$arrayElemAt":["$details",{"$indexOfArray":["$details.Id","John2"]}]},
"john3":{"$arrayElemAt":["$details",{"$indexOfArray":["$details.Id","John3"]}]}
},
"in":{"$lt":["$$john2.value","$$john3.value"]}
}
}
})
ফলাফল
{ "_id" : ObjectId("5e57ddd92ae06a1609a00ae7"), "Name" : "Chris", "details" : [ { "Id" : "John1", "value" : "test" }, { "Id" : "John2", "value" : 18 }, { "Id" : "John3", "value" : 20 } ] }
পাইপলাইন ব্যাখ্যা
$indexOfArray:details.Idঅ্যারেতে "John2" এবং "John3" এর ইনডেক্স বের করে।$arrayElemAt: সেই ইনডেক্সের এলিমেন্ট (পুরো অবজেক্ট) বের করে।$let: ভেরিয়েবলjohn2এবংjohn3ডিক্লেয়ার করে।$lt:$$john2.value(১৮) <$$john3.value(২০) কিনা চেক করে।
সীমাবদ্ধতা: এই পদ্ধতিটি জটিল এবং ধীর। ডিজাইন পর্যায়ে সম্ভব হলে ডেটা স্ট্রাকচার পরিবর্তন করে কাজ করা ভালো।