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

Unwind อาร์เรย์สองตัวพร้อมกันใน MongoDB Aggregation

ใช้ $unwind หลายขั้นตอนต่อเนื่อง เพื่อแยกอาร์เรย์หลายตัว แล้ว $match + $expr + $eq จับคู่องค์ประกอบที่ตรงกัน

ตัวอย่างข้อมูลทดสอบ (มี Details1 และ Details2)

> db.demo387.insertOne({
    "Name" : "101",
    "Details1" : [
        {"Value":100, "Value1":50, "Value2":40},
        {"Value":200},
        {"Value":300}
    ],
    "Details" : [
        {"Value":100, "Value1":30, "Value2":26},
        {"Value":200},
        {"Value":300}
    ]
});

แสดงข้อมูล

> db.demo387.find().pretty();
{
    "_id" : ObjectId("5e5d197022064be7ab44e7f8"),
    "Name" : "101",
    "Details1" : [
        {"Value" : 100, "Value1" : 50, "Value2" : 40},
        {"Value" : 200}, {"Value" : 300}
    ],
    "Details" : [
        {"Value" : 100, "Value1" : 30, "Value2" : 26},
        {"Value" : 200}, {"Value" : 300}
    ]
}

คำสั่ง Aggregation Unwind ทั้งสองอาร์เรย์ แล้วจับคู่ Value ที่เท่ากัน

> db.demo387.aggregate([
    {"$unwind": "$Details1"},
    {"$unwind": "$Details"},
    {"$match": {"$expr": {"$eq": ["$Details1.Value", "$Details.Value"]}}}
])

ผลลัพธ์ (จับคู่ได้ 3 คู่: 100, 200, 300)

{
    "_id" : ObjectId("5e5d197022064be7ab44e7f8"),
    "Name" : "101",
    "Details1" : {"Value" : 100, "Value1" : 50, "Value2" : 40},
    "Details" : {"Value" : 100, "Value1" : 30, "Value2" : 26}
}
{
    "_id" : ObjectId("5e5d197022064be7ab44e7f8"),
    "Name" : "101",
    "Details1" : {"Value" : 200},
    "Details" : {"Value" : 200}
}
{
    "_id" : ObjectId("5e5d197022064be7ab44e7f8"),
    "Name" : "101",
    "Details1" : {"Value" : 300},
    "Details" : {"Value" : 300}
}

คำอธิบาย: $unwind สองครั้งสร้าง Cartesian Product (3x3=9 แถว) แล้ว $match กรองเฉพาะที่ Details1.Value = Details.Value เหลือ 3 แถว