โปรโมท Subfields ไป Top Level ด้วย $objectToArray และ $arrayToObject
บทความนี้สาธิตเทคนิคขั้นสูงใน MongoDB Aggregation: การนำ Subfields จากออบเจกต์ซ้อนมาเป็นฟิลด์ระดับบนสุด (Top-level fields) ในขั้นตอน Projection โดยไม่ต้องระบุชื่อฟิลด์ทุกตัว โดยใช้ $objectToArray, $concatArrays, และ $arrayToObject
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
> db.promoteSubfieldsDemo.insertOne({'s':10,'y':{'t':20,'u':30}});
{ "acknowledged": true, "insertedId": ObjectId("5e038004190a577c668b55d5") }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.promoteSubfieldsDemo.find().pretty();
ผลลัพธ์:
{ "_id": ObjectId("5e038004190a577c668b55d5"), "s": 10, "y": { "t": 20, "u": 30 } }
ขั้นตอนที่ 3: Aggregation Pipeline สำหรับโปรโมท Subfields
Pipeline:
$replaceRoot- แทนที่ Root document ใหม่newRootใช้$arrayToObjectเพื่อแปลงอาร์เรย์กลับเป็นออบเจกต์$concatArrays- รวมอาร์เรย์ 2 ชุด: 1) อาร์เรย์ของฟิลด์ระดับบนสุด[{ "k": "s", "v": "$s" }]2) ผลลัพธ์จาก$objectToArray: "$y"ที่แปลงออบเจกต์yเป็นอาร์เรย์ key-value
> db.promoteSubfieldsDemo.aggregate([
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": {
"$concatArrays": [
[{ "k": "s", "v": "$s" }],
{ "$objectToArray": "$y" }
]
}
}
}}
]);
ผลลัพธ์ที่ได้
{ "s": 10, "t": 20, "u": 30 }
สรุป: เทคนิคนี้มีประโยชน์เมื่อต้องการ Flatten โครงสร้างออบเจกต์ซ้อนให้เป็นฟิลด์แบน (Flat) โดยอัตโนมัติ โดยเฉพาะเมื่อไม่ทราบชื่อฟิลด์ล่วงหน้าหรือมีฟิลด์มากเกินไปที่จะระบุทีละตัวใน $project