MongoDB-এ একটি ডকুমেন্টের ভেতরের অ্যারে সর্ট করে পুরো ডকুমেন্ট (সব ফিল্ডসহ) রিটার্ন করতে অ্যাগ্রিগেশন পাইপলাইনে $unwind, $sort, $group, এবং $project স্টেজ একসাথে ব্যবহার করা হয়।
নমুনা কালেকশন তৈরি
> db.demo252.insertOne({
"Values": [
{ "v1": 20, "v2": 30 },
{ "v1": 20, "v2": 20 },
{ "v1": 10, "v2": 7 }
]
});
{ "acknowledged": true, "insertedId": ObjectId("5e46c2761627c0c63e7dba78") }
ডকুমেন্ট দেখানো (সর্ট করার আগে)
> db.demo252.find();
আউটপুট:
{
"_id": ObjectId("5e46c2761627c0c63e7dba78"),
"Values": [
{ "v1": 20, "v2": 30 },
{ "v1": 20, "v2": 20 },
{ "v1": 10, "v2": 7 }
]
}
অ্যারে সর্ট এবং সব ফিল্ড প্রজেক্ট করার কোয়েরি
> db.demo252.aggregate([
{ $unwind: "$Values" },
{ $sort: { "Values.v2": 1, "Values.v1": 1 } },
{ $group: {
_id: { _id: "$_id" },
st: { $push: "$Values" }
}
},
{ $project: {
_id: "$_id._id",
Values: "$st"
}
}
]);
ফলাফল (v2 অ্যাসেন্ডিং, তারপর v1 অ্যাসেন্ডিং)
{
"_id": ObjectId("5e46c2761627c0c63e7dba78"),
"Values": [
{ "v1": 10, "v2": 7 },
{ "v1": 20, "v2": 20 },
{ "v1": 20, "v2": 30 }
]
}
ব্যাখ্যা:
$unwind: "$Values"- অ্যারের প্রতিটি এলিমেন্টকে আলাদা ডকুমেন্টে রূপান্তর (৩টি ডকুমেন্ট)।$sort-v2অ্যাসেন্ডিং, তারপরv1অ্যাসেন্ডিং অনুযায়ী সর্ট।$group- মূল_idদিয়ে আবার গ্রুপ করে,$pushদিয়ে সর্ট করা অ্যারে পুনর্গঠন।$project- আউটপুট ফরম্যাট ঠিক করে (_idএবংValuesফিল্ড)।
মূল অ্যারে অর্ডার: (20,30), (20,20), (10,7) → সর্টেড: (10,7), (20,20), (20,30)
সতর্কতা
- এই পদ্ধতি ডকুমেন্টের অন্যান্য ফিল্ড রাখে না (শুধু _id এবং Values)। সব ফিল্ড রাখতে
$firstবা$$ROOTব্যবহার করুন। - বড় অ্যারে वाले ডকুমেন্টের জন্য মেমরি ব্যবহার বেশি।
উন্নত পদ্ধতি: $$ROOT সংরক্ষণ
db.demo252.aggregate([
{ $unwind: "$Values" },
{ $sort: { "Values.v2": 1, "Values.v1": 1 } },
{ $group: {
_id: "$_id",
root: { $first: "$$ROOT" },
sortedValues: { $push: "$Values" }
}
},
{ $project: {
_id: 0,
Values: "$sortedValues",
// অন্যান্য ফিল্ড রুট থেকে
}
}
]);