MongoDB-এ সাবডকুমেন্ট অ্যারের ভেরিয়েবল ইনডেক্স (nth এলিমেন্ট) কোয়েরি করতে $let (ভেরিয়েবল ডিক্লেয়ার) এবং $expr (অগেটিগেশন এক্সপ্রেশন) ব্যবহার করা হয়। $arrayElemAt দিয়ে নির্দিষ্ট ইনডেক্সের এলিমেন্ট এক্সেস করা যায়।
নমুনা কালেকশন তৈরি
> db.demo72.insertOne({
StudentDetails: [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": "Bob", "Age": 20 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e29b4ad71bf0181ecc42269") }
ডকুমেন্ট দেখানো
> db.demo72.find().pretty();
আউটপুট:
{
"_id": ObjectId("5e29b4ad71bf0181ecc42269"),
"StudentDetails": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": "Bob", "Age": 20 }
]
}
nth এলিমেন্ট (ইনডেক্স ১) কোয়েরি করা
ইনডেক্স ১ (দ্বিতীয় এলিমেন্ট) এর Name ফিল্ড "David" কিনা চেক করা:
> db.demo72.find({
$expr: {
$let: {
vars: {
fst: { $arrayElemAt: [ "$StudentDetails", 1 ] }
},
in: { $eq: [ "$$fst.Name", "David" ] }
}
}
})
ফলাফল
{
"_id": ObjectId("5e29b4ad71bf0181ecc42269"),
"StudentDetails": [
{ "Name": "Chris", "Age": 21 },
{ "Name": "David", "Age": 23 },
{ "Name": "Bob", "Age": 20 }
]
}
ব্যাখ্যা:
$arrayElemAt: [ "$StudentDetails", 1 ]-StudentDetailsঅ্যারের ইনডেক্স ১ (দ্বিতীয় এলিমেন্ট) এক্সট্রাক্ট করে।$let- ভেরিয়েবলfstডিক্লেয়ার করে এক্সট্রাক্ট করা এলিমেন্ট ধরে রাখে।$expr- অ্যাগ্রিগেশন এক্সপ্রেশন কোয়েরি ল্যাঙ্গুয়েজে ব্যবহার করার অনুমতি দেয়।$eq: [ "$$fst.Name", "David" ]- ভেরিয়েবলের Name ফিল্ড "David" কিনা চেক করে।
ডাইনামিক ইনডেক্স (ফিল্ড থেকে ইনডেক্স নেওয়া)
যদি ইনডেক্স অন্য ফিল্ড থেকে আসে:
db.demo72.find({
$expr: {
$let: {
vars: {
idx: "$someIndexField",
elem: { $arrayElemAt: [ "$StudentDetails", "$$idx" ] }
},
in: { $eq: [ "$$elem.Name", "David" ] }
}
}
});
সতর্কতা
$expr ব্যবহার করা কোয়েরি ইন্ডেক্স ব্যবহার করতে পারে না (COLLSCAN হবে)। বড় ডেটাসেটের জন্য পারফরম্যান্স বিবেচনা করুন।