ใช้ $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 แถว