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

การโปรโมท Subfields ไปเป็นฟิลด์ระดับบนสุดใน Projection โดยไม่ต้องระบุทุกคีย์

โปรโมท 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:

  1. $replaceRoot - แทนที่ Root document ใหม่
  2. newRoot ใช้ $arrayToObject เพื่อแปลงอาร์เรย์กลับเป็นออบเจกต์
  3. $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