ใช้ $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+) แทน