Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

กลับลำดับอาร์เรย์ (Reverse Array) ใน MongoDB

ใช้ 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" ] }

เปรียบเทียบวิธี

วิธีVersionUpdate จริงPerformanceGeneric
forEach + Manual SwapAll✅ช้า (N Round-trips)❌ Hardcoded Index
forEach + slice().reverse()All✅ช้า✅
Aggregation $reverseArray4.4+❌ (View only)เร็ว (Server)✅
Update Pipeline $reverseArray4.2+✅เร็ว (Server, Atomic)✅

แนะนำ

  • MongoDB 4.2+: ใช้ updateMany([], [{ $set: { arr: { $reverseArray: "$arr" } }}])
  • MongoDB 4.4+: ใช้ $reverseArray ใน Aggregation สำหรับ Query/View
  • เก่ากว่า: ใช้ forEach + slice().reverse()