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

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

การ $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 }

คำอธิบาย

  1. $unwind + includeArrayIndex: แยกอาร์เรย์แต่ละอัน และเก็บ index ไว้ในฟิลด์ index1, index2
  2. $project + $eq: สร้างฟิลด์ valid ตรวจสอบว่า index1 == index2
  3. $match: กรองเฉพาะคู่ที่ valid = true (index ตรงกัน)

เทคนิคนี้ใช้เมื่อมีอาร์เรย์หลายตัวที่ "ตรงตำแหน่งกัน" เช่น คะแนนสอบวิชาต่างๆ ของนักเรียนคนเดียวกัน