ใช้ forEach() + update() กลับลำดับอาร์เรย์ใน MongoDB Shell
MongoDB ไม่มี Built-in Operator สำหรับ Reverse Array โดยตรง แต่สามารถทำได้ด้วย JavaScript ใน Shell
ตัวอย่างข้อมูล
> db.reverseArrayDemo.insertOne({"Skills":["C","Java"]});
คำสั่ง Reverse Array
> db.reverseArrayDemo.find().forEach(function(myDocument) {
var arrayValue = [ myDocument.Skills[1], myDocument.Skills[0] ];
db.reverseArrayDemo.update(myDocument, { $set: { Skills: arrayValue } });
});
ผลลัพธ์: ["Java", "C"]
> db.reverseArrayDemo.find().pretty();
{ "_id" : ObjectId("5ccddf99dceb9a92e6aa1946"), "Skills" : [ "Java", "C" ] }
วิธีทั่วไปสำหรับ Array ขนาดไหนก็ได้ (Generic Reverse)
db.reverseArrayDemo.find().forEach(function(doc) {
var reversed = doc.Skills.slice().reverse(); // Copy + Reverse
db.reverseArrayDemo.updateOne(
{ _id: doc._id },
{ $set: { Skills: reversed } }
);
});
วิธีทันสมัย: Aggregation + $reverseArray (MongoDB 4.4+)
// View / Query เท่านั้น (ไม่ Update)
db.reverseArrayDemo.aggregate([
{ $project: { Skills: { $reverseArray: "$Skills" } } }
]);
// Update จริง (MongoDB 4.2+ Pipeline Update)
db.reverseArrayDemo.updateMany(
{},
[{ $set: { Skills: { $reverseArray: "$Skills" } } }]
);
ผลลัพธ์ $reverseArray
{ "Skills" : [ "Java", "C" ] }
เปรียบเทียบวิธี
| วิธี | Version | Update จริง | Performance | Generic |
|---|---|---|---|---|
| forEach + Manual Swap | All | ✅ | ช้า (N Round-trips) | ❌ Hardcoded Index |
| forEach + slice().reverse() | All | ✅ | ช้า | ✅ |
| Aggregation $reverseArray | 4.4+ | ❌ (View only) | เร็ว (Server) | ✅ |
| Update Pipeline $reverseArray | 4.2+ | ✅ | เร็ว (Server, Atomic) | ✅ |
แนะนำ
- MongoDB 4.2+: ใช้
updateMany([], [{ $set: { arr: { $reverseArray: "$arr" } }}]) - MongoDB 4.4+: ใช้
$reverseArrayใน Aggregation สำหรับ Query/View - เก่ากว่า: ใช้ forEach + slice().reverse()