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

ดึงฟิลด์จาก Sub-documents หลายชั้นที่ตรงเงื่อนไข MongoDB Aggregation

การดึงข้อมูลจาก 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();

ผลลัพธ์:


คำอธิบายขั้นตอน

  1. $unwind: '$details' - แยกอาร์เรย์ details ระดับ 1
  2. $match - กรองเฉพาะที่มี details.details1.id = "1" (MongoDB จะ unwind details1 อัตโนมัติใน match)
  3. $project - เลือกเฉพาะ CountryName เปลี่ยนชื่อเป็น Country

ข้อสังเกต

MongoDB จะ unwind อัตโนมัติ (implicit unwind) เมื่อ match ฟิลด์ลึกในอาร์เรย์ ทำให้ไม่ต้อง $unwind ทุกชั้นเอง

รูปแบบข้อมูลที่ซับซ้อนกว่า

หากต้องการเก็บรายละเอียดเพิ่ม ใช้ $addFields หรือ $project ดึงฟิลด์อื่นๆ มาด้วย