ในการรับเฉพาะฟิลด์เฉพาะในเอกสารอาร์เรย์ที่ซ้อนกัน ให้ใช้ $filter พร้อมกับ $project ให้เราสร้างคอลเลกชันที่มีเอกสาร -
> db.demo342.insertOne({ ... "Id": "101", ... "details1" : { ... "details2" : [ ... { ... "details3" : [ ... { ... "Name": "Mike", ... "CountryName" : "US" ... }, ... { ... "Name": "David", ... "CountryName" : "AUS" ... }, ... { ... "Name": "Bob", ... "CountryName" : "UK" ... } ... ] ... } ... ] ... } ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e53ef99f8647eb59e5620a9") }
แสดงเอกสารทั้งหมดจากคอลเล็กชันโดยใช้วิธี find() -
> db.demo342.find();
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "Id" : "101", "details1" : { "details2" : [ { "details3" : [ { "Name" : "Mike", "CountryName" : "US" }, { "Name" : "David", "CountryName" : "AUS" }, { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }
ต่อไปนี้เป็นแบบสอบถามเพื่อรับเฉพาะฟิลด์เฉพาะในเอกสารอาร์เรย์ที่ซ้อนกัน -
> db.demo342.aggregate([ ... { "$project": { ... "details1": { ... "details2": { ... "$filter": { ... "input": { ... "$map": { ... "input": "$details1.details2", ... "in": { ... "details3": { ... "$filter": { ... "input": "$$this.details3", ... "cond": { "$eq": ["$$this.Name", "Bob"] } ... } ... } ... } ... } ... }, ... "cond": { "$ne": ["$$this.details3", []] } ... } ... } ... } ... }} ... ])
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "_id" : ObjectId("5e53ef99f8647eb59e5620a9"), "details1" : { "details2" : [ { "details3" : [ { "Name" : "Bob", "CountryName" : "UK" } ] } ] } }