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

MongoDB: ค้นหาและคืนค่า Sub-document ตามเงื่อนไขด้วย Aggregate

ใช้ $match หาเอกสารหลัก แล้ว $addFields ร่วม $filter เพื่อคืนค่าเฉพาะ sub-documents ที่ตรงเงื่อนไข สร้างคอลเลกชันตัวอย่าง:

> db.demo345.insertOne({
  "UserName" : "Robert",
  "UserDetails" : [
    {"isMarried" : false, "CountryName":"US"},
    {"isMarried" : true, "CountryName":"UK"},
    {"isMarried" : false, "CountryName":"AUS"}
  ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5404fdf8647eb59e5620ac") }

แสดงข้อมูล:

> db.demo345.find();

คิวรีหา UserName="Robert" แล้วกรอง UserDetails ที่ isMarried = true:

> db.demo345.aggregate([
  { $match: { UserName: "Robert" } },
  { $addFields: {
    UserDetails: {
      $filter: {
        input: "$UserDetails",
        cond: { $eq: ["$$this.isMarried", true] }
      }
    }
  }}
])

ผลลัพธ์ (เหลือเฉพาะ UK ที่ isMarried=true):

{ "_id" : ObjectId("5e5404fdf8647eb59e5620ac"), "UserName" : "Robert", "UserDetails" : [ { "isMarried" : true, "CountryName" : "UK" } ] }

จุดสำคัญ

  • $match ก่อน: ลดเอกสารลงเหลือ 1 ตัว (ใช้ index ได้)
  • $filter: สร้างอาร์เรย์ใหม่ที่มีเฉพาะสมาชิกผ่านเงื่อนไข
  • $$this: อ้างอิง sub-document ปัจจุบันใน UserDetails
  • เอกสารต้นฉบับไม่เปลี่ยนแปลง (aggregation เป็น read-only)
  • หากต้องการอัปเดตจริง ใช้ updateOne() ร่วม $set และ $filter ใน update pipeline (MongoDB 4.2+)