การดึงข้อมูลจาก sub-documents ซ้อนหลายชั้นที่ตรงเงื่อนไข ใช้ $unwind แยกชั้นๆ แล้ว $match กรอง
> db.demo671.insertOne({
... "details": [
... {"id": "1"},
... {CountryName: "US", "details1": [{"id": "1"}, {"id": "2"}]},
... {CountryName: "UK", "details1": [{"id": "2"}, {"id": "1"}]},
... {CountryName: "AUS", "details1": [{"id": "1"}]}
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea3e5d004263e90dac943e0") }
แสดงข้อมูล:
> db.demo671.find();
คิวรีดึง CountryName ที่มี details1.id = "1"
> db.demo671.aggregate([ ... {$unwind: '$details'}, ... {$match: {'details.details1.id': '1'}}, ... {$project: {_id: 0, Country: '$details.CountryName'}} ... ]).pretty();ผลลัพธ์:
คำอธิบายขั้นตอน
- $unwind: '$details' - แยกอาร์เรย์ details ระดับ 1
- $match - กรองเฉพาะที่มี details.details1.id = "1" (MongoDB จะ unwind details1 อัตโนมัติใน match)
- $project - เลือกเฉพาะ CountryName เปลี่ยนชื่อเป็น Country
ข้อสังเกต
MongoDB จะ unwind อัตโนมัติ (implicit unwind) เมื่อ match ฟิลด์ลึกในอาร์เรย์ ทำให้ไม่ต้อง $unwind ทุกชั้นเอง
รูปแบบข้อมูลที่ซับซ้อนกว่า
หากต้องการเก็บรายละเอียดเพิ่ม ใช้
$addFieldsหรือ$projectดึงฟิลด์อื่นๆ มาด้วย