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

MongoDB: แปลง Array of Objects ให้เป็น Array of Embedded Documents ด้วย $map

ใช้ $addFields ร่วม $map ใน aggregation เพื่อแปลงโครงสร้างอาร์เรย์ และ $out เขียนทับคอลเลกชันเดิม สร้างคอลเลกชันตัวอย่าง:

> db.demo343.insertOne({
  _id: 101,
  UserName: "Chris",
  details: [ {"Name":"John"}, {"Name":"David"} ]
});
{ "acknowledged" : true, "insertedId" : 101 }

แสดงข้อมูล:

> db.demo343.find().pretty();

คิวรีแปลง details ให้แต่ละสมาชิกกลายเป็น object ที่มีฟิลด์ Name เก็บ object เดิม:

> db.demo343.aggregate([
  { $addFields: {
    details: {
      $map: {
        input: "$details",
        in: { Name: "$$this" }
      }
    }
  }},
  { $out: "demo343" }
])

แสดงข้อมูลหลังแปลง:

> db.demo343.find().pretty();

ผลลัพธ์ (Name กลายเป็น nested object):

{ "_id" : 101, "UserName" : "Chris", "details" : [ { "Name" : { "Name" : "John" } }, { "Name" : { "Name" : "David" } } ] }

คำอธิบาย

  • $map: วนลูปแต่ละสมาชิกใน details ($$this)
  • in: { Name: "$$this" }: สร้าง object ใหม่ที่มีฟิลด์ Name ค่าเป็น object เดิมทั้งชุด
  • $out: เขียนผลลัพธ์ทับคอลเลกชันเดิม (⚠️ ลบข้อมูลเดิมทิ้ง)

ข้อควรระวัง

$out จะ แทนที่คอลเลกชันทั้งหมด ควร backup หรือใช้คอลเลกชันใหม่ก่อน ใน production ควรใช้ $merge (MongoDB 4.2+) แทน