MongoDB এগ্রিগেশনে $addFields, $map, $out ব্যবহার করে অ্যারে স্ট্রাকচার রিশেপ (Reshape) করা
MongoDB-এ একটি অ্যারে-র এলিমেন্টগুলোকে নতুন স্ট্রাকচার্ড অবজেক্ট-এ রূপান্তর করতে (যেমন স্ট্রিং অ্যারে কে অবজেক্ট অ্যারে-তে) $map অপারেটর ব্যবহার করা হয়। $out দিয়ে ফলাফলটি আবার কালেকশনে লিখা যায়।
১. কালেকশন ও নমুনা ডেটা তৈরি
> db.demo343.insertOne({
_id: 101,
UserName: "Chris",
details: [ {"Name":"John"}, {"Name":"David"} ]
});
{ "acknowledged" : true, "insertedId" : 101 }
২. আপডেটের আগে ডকুমেন্ট
> db.demo343.find().pretty();
আউটপুট:
{ "_id" : 101, "UserName" : "Chris", "details" : [ { "Name" : "John" }, { "Name" : "David" } ] }
৩. এগ্রিগেশন কোয়েরি: details অ্যারে-র প্রতিটি এলিমেন্টকে {Name: } ফরম্যাটে রূপান্তর
> db.demo343.aggregate([
{ $addFields: {
details: { $map: {
input: "$details",
in: { Name: "$$this" }
}}
}},
{ $out: "demo343" }
])
ব্যাখ্যা:
$map- details অ্যারে-র প্রতিটি এলিমেন্ট ($$this) প্রসেস করে।in: { Name: "$$this" }- পুরো এলিমেন্টকেNameফিল্ডের ভেতরে রাখে।$out: "demo343"- ফলাফলটি একই কালেকশনে ওভাররাইট করে লিখে (সাবধানতা: মূল ডেটা হারাতে পারে)।
৪. রূপান্তরিত ডকুমেন্ট
> db.demo343.find().pretty();
আউটপুট:
{ "_id" : 101, "UserName" : "Chris", "details" : [ { "Name" : { "Name" : "John" } }, { "Name" : { "Name" : "David" } } ] }
এখন প্রতিটি এলিমেন্ট হলো {Name: {Name: "John"}} - অর্থাৎ নেস্টেড লেভেল বেড়ে গেছে। টাইটেল অনুযায়ী ObjectId অ্যারে-কে এম্বেডেড ডকুমেন্ট-এ রূপান্তর করতে হলে in: { ObjectIdField: "$$this" } ফরম্যাট ব্যবহার করতাম।