MongoDB-এ অ্যারেতে নেস্টেড অ্যারে (array inside array) স্লাইস করতে অ্যাগ্রিগেশন পাইপলাইনে $addFields, $map, এবং $slice অপারেটর একসাথে ব্যবহার করা হয়।
কলেকশন এবং ডকুমেন্ট তৈরি
> db.demo111.insertOne({
... "_id" : 101,
... "Name" : "Chris",
... "Details" : [
... {
... "_id" : 101,
... "Score" : 78,
... "Subjects" : [
... { "_id" : "10001", "SubjectName" : "MySQL" },
... { "_id" : "10003", "SubjectName" : "MongoDB" }
... ]
... },
... {
... "_id" : 102,
... "Score" : 87,
... "Subjects" : [
... { "_id" : "10004", "SubjectName" : "Java" }
... ]
... }
... ]
... });
{ "acknowledged" : true, "insertedId" : 101 }
সব ডকুমেন্ট দেখানো
> db.demo111.find();
আউটপুট:
{ "_id" : 101, "Name" : "Chris", "Details" : [ { "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" }, { "_id" : "10003", "SubjectName" : "MongoDB" } ] }, { "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] } ] }
অ্যারে স্লাইস করার কোয়ারী
$map দিয়ে Details অ্যারের প্রতিটি এলিমেন্ট প্রসেস করে, $slice: ["$$out.Subjects", 1] দিয়ে Subjects অ্যারের প্রথম ১টি এলিমেন্ট রাখা হয়েছে:
> db.demo111.aggregate([
... { "$addFields": {
... "Details": {
... "$map": {
... "input": "$Details",
... "as": "out",
... "in": {
... "_id": "$$out._id",
... "Score": "$$out.Score",
... "Subjects": { "$slice": [ "$$out.Subjects", 1 ] }
... }
... }
... }
... }}
... ]);
ফলাফল
{ "_id" : 101, "Name" : "Chris", "Details" : [ { "_id" : 101, "Score" : 78, "Subjects" : [ { "_id" : "10001", "SubjectName" : "MySQL" } ] }, { "_id" : 102, "Score" : 87, "Subjects" : [ { "_id" : "10004", "SubjectName" : "Java" } ] } ] }
ব্যাখ্যা:
- প্রথম Details এলিমেন্ট: Subjects ছিল ২টি (MySQL, MongoDB) → স্লাইস করে ১টি (MySQL)
- দ্বিতীয় Details এলিমেন্ট: Subjects ছিল ১টি (Java) → স্লাইস করে ১টি (Java)
$slice: [array, n]- প্রথম n এলিমেন্ট রাখে। n নেতিবাচক হলে শেষ থেকে n টি (যেমন -1 = শেষ ১টি)
$slice ভেরিয়েশন:
{$slice: ["$array", 2]}- প্রথম ২ এলিমেন্ট{$slice: ["$array", -2]}- শেষ ২ এলিমেন্ট{$slice: ["$array", 1, 3]}- ১ নম্বর إندেক্স থেকে ৩ এলিমেন্ট (skip 1, limit 3)
ব্যবহার ক্ষেত্র: পেজিনেশন (pagination), টপ-এন কোয়ারী, প্রিভিউ জেনারেশন, রেসপন্স সাইজ লিমিট।