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

Projection บนฟิลด์ซ้อนลึกเฉพาะใน MongoDB Aggregation

ใช้ $addFields ร่วม $objectToArray, $filter, $arrayToObject เพื่อกรองและฉายเฉพาะฟิลด์ซ้อนลึกที่ต้องการ

ตัวอย่างข้อมูลทดสอบ (ออบเจ็กต์ซ้อน 3 ชั้น)

> db.demo379.insertOne({
    "details1" : {
        "details2" : {
            "details3" : {
                "10" : "John", "50" : "Chris", "40" : "David", "30" : "Mike"
            }
        }
    }
});

แสดงข้อมูลทั้งหมด

> db.demo379.find().pretty();
{
    "_id" : ObjectId("5e5a94f82ae06a1609a00b10"),
    "details1" : {
        "details2" : {
            "details3" : { "10" : "John", "30" : "Mike", "40" : "David", "50" : "Chris" }
        }
    }
}

คำสั่ง Aggregation กรอง details3 เฉพาะ key 35-60

> db.demo379.aggregate([
    { "$addFields": {
        "details1.details2.details3": {
            "$arrayToObject": {
                "$filter": {
                    "input": { "$objectToArray": "$details1.details2.details3" },
                    "as": "out",
                    "cond": {
                        "$and": [
                            { "$gte": ["$$out.k", "35"] },
                            { "$lte": ["$$out.k", "60"] }
                        ]
                    }
                }
            }
        }
    }}
])

ผลลัพธ์ (เหลือ key 40, 50 เท่านั้น)

{
    "_id" : ObjectId("5e5a94f82ae06a1609a00b10"),
    "details1" : { "details2" : { "details3" : { "40" : "David", "50" : "Chris" } } }
}

ขั้นตอน:

  1. $objectToArray แปลง details3 เป็นอาร์เรย์ [{k:"10",v:"John"}, ...]
  2. $filter กรองเฉพาะที่ key (k) อยู่ระหว่าง 35-60
  3. $arrayToObject แปลงกลับเป็นออบเจ็กต์
  4. $addFields เขียนทับฟิลด์เดิม