แปลงอาร์เรย์เป็นออบเจกต์ (Map) โดยใช้คีย์จากฟิลด์ในเอกสาร
สามารถแปลงอาร์เรย์ของเอกสารให้กลายเป็นออบเจกต์เดียว (Map) โดยใช้ค่าของฟิลด์เฉพาะเป็นคีย์ (Key) และเอกสารทั้งชิ้นเป็นค่า (Value) ได้ด้วยการรวม $map และ $arrayToObject ใน Aggregation Pipeline
ตัวอย่างข้อมูลทดสอบ
> db.demo398.insertOne({
"details": [
{ "Name": "Chris", "Age": 22 }
]
});
แสดงข้อมูลก่อนแปลง
> db.demo398.find();
ผลลัพธ์:
{ "_id": ObjectId("5e5e8cedfac4d418a017856c"), "details": [ { "Name": "Chris", "Age": 22 } ] }
คำสั่ง Aggregation แปลงอาร์เรย์เป็น Map
> db.demo398.aggregate([
{
$addFields: {
details: {
$arrayToObject: {
$map: {
input: "$details",
as: "out",
in: {
k: "$$out.Name",
v: "$$out"
}
}
}
}
}
}
]);
ผลลัพธ์หลังแปลง
{ "_id": ObjectId("5e5e8cedfac4d418a017856c"), "details": { "Chris": { "Name": "Chris", "Age": 22 } } }
คำอธิบายขั้นตอน
- $map: วนลูปผ่านอาร์เรย์
$detailsสร้างอาร์เรย์ใหม่ที่แต่ละองค์ประกอบเป็นคู่{k: ..., v: ...} - k: "$$out.Name": ใช้ค่าฟิลด์ Name เป็นคีย์
- v: "$$out": ใช้เอกสารทั้งชิ้นเป็นค่า
- $arrayToObject: แปลงอาร์เรย์ของคู่ key-value ให้กลายเป็นออบเจกต์เดียว
- $addFields: แทนที่ฟิลด์ details เดิมด้วยผลลัพธ์ใหม่
เทคนิคนี้มีประโยชน์เมื่อต้องการเข้าถึงข้อมูลด้วยคีย์โดยตรงแทนที่จะต้องวนลูปค้นหาในอาร์เรย์