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

การแปลงอาร์เรย์เป็น Map ของเอกสารด้วย $map และ $arrayToObject ใน MongoDB

แปลงอาร์เรย์เป็นออบเจกต์ (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 } } }

คำอธิบายขั้นตอน

  1. $map: วนลูปผ่านอาร์เรย์ $details สร้างอาร์เรย์ใหม่ที่แต่ละองค์ประกอบเป็นคู่ {k: ..., v: ...}
  2. k: "$$out.Name": ใช้ค่าฟิลด์ Name เป็นคีย์
  3. v: "$$out": ใช้เอกสารทั้งชิ้นเป็นค่า
  4. $arrayToObject: แปลงอาร์เรย์ของคู่ key-value ให้กลายเป็นออบเจกต์เดียว
  5. $addFields: แทนที่ฟิลด์ details เดิมด้วยผลลัพธ์ใหม่

เทคนิคนี้มีประโยชน์เมื่อต้องการเข้าถึงข้อมูลด้วยคีย์โดยตรงแทนที่จะต้องวนลูปค้นหาในอาร์เรย์