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

กรอง Sub-document ใน MongoDB ด้วย $unwind และ $match

เมื่อต้องการกรองเฉพาะ sub-document ในอาร์เรย์ที่ตรงเงื่อนไข ให้ใช้ $unwind แยกอาร์เรย์ แล้ว $match กรอง

> db.demo662.insertOne({
...   "details": [
...     {Name: "Chris", Marks: 35},
...     {Name: "Bob", Marks: 45},
...     {Name: "David", Marks: 30}
...   ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea1b2be24113ea5458c7d04") }

แสดงข้อมูล:

> db.demo662.find();

คิวรีกรองเฉพาะ Marks > 40

> db.demo662.aggregate({$unwind: "$details"}, {$match: {"details.Marks": {$gt: 40}}});

ผลลัพธ์ - ได้เฉพาะ Bob ที่ Marks = 45:


คำอธิบาย

  1. $unwind: "$details" - แยกอาร์เรย์ details ให้แต่ละออบเจกต์เป็นเอกสารแยกต่างหาก
  2. $match: {"details.Marks": {$gt: 40}} - กรองเอกสารที่ Marks > 40

หากต้องการรวมกลับเป็นอาร์เรย์เดิม

เพิ่ม $group ต่อท้าย:

db.demo662.aggregate([
  {$unwind: "$details"},
  {$match: {"details.Marks": {$gt: 40}}},
  {$group: {_id: "$_id", details: {$push: "$details"}}}
]);

จะได้เอกสารเดิมแต่ details มีเฉพาะรายการที่ผ่านเงื่อนไข