การ $unwind สองอาร์เรย์พร้อมกันต้องใช้ includeArrayIndex เพื่อเก็บ index แล้วค่อยกรอง (match) เฉพาะคู่ที่ index ตรงกัน
> db.demo515.insertOne({
... "details1": ["4700100004"],
... "details2": ["Not Given"],
... "Value1": ["56", "45", "35"],
... "Value2": ["35", "45", "56"]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e889e51987b6e0e9d18f590") }
แสดงข้อมูล:
> db.demo515.find();
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : [ "56", "45", "35" ], "Value2" : [ "35", "45", "56" ] }
คิวรี Unwind สองอาร์เรย์ Value1 และ Value2 แล้วจับคู่ตาม index
> db.demo515.aggregate([
... { $unwind: { path: "$Value1", includeArrayIndex: "index1" } },
... { $unwind: { path: "$Value2", includeArrayIndex: "index2" } },
... { $project: {
... _id: 1, details1: 1, details2: 1, Value1: 1, Value2: 1,
... valid: { $eq: ["$index1", "$index2"] }
... }},
... { $match: { valid: true } }
... ]);
ผลลัพธ์ - ได้คู่ที่ index ตรงกัน (0-0, 1-1, 2-2):
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "56", "Value2" : "35", "valid" : true }
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "45", "Value2" : "45", "valid" : true }
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "35", "Value2" : "56", "valid" : true }
คำอธิบาย
- $unwind + includeArrayIndex: แยกอาร์เรย์แต่ละอัน และเก็บ index ไว้ในฟิลด์ index1, index2
- $project + $eq: สร้างฟิลด์ valid ตรวจสอบว่า index1 == index2
- $match: กรองเฉพาะคู่ที่ valid = true (index ตรงกัน)
เทคนิคนี้ใช้เมื่อมีอาร์เรย์หลายตัวที่ "ตรงตำแหน่งกัน" เช่น คะแนนสอบวิชาต่างๆ ของนักเรียนคนเดียวกัน