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

MongoDB: Project ฟิลด์เฉพาะในอาร์เรย์ด้วย $filter ใน $project

ใช้ $project ร่วม $filter ใน aggregation เพื่อคืนค่าเฉพาะสมาชิกในอาร์เรย์ที่ตรงเงื่อนไข สร้างคอลเลกชันตัวอย่าง:

> db.demo355.insertOne({"id":101,"details":[{"Name":"Chris",isMarried:1},{"Name":"David",isMarried:0},{"Name":"Mike",isMarried:1}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e568928f8647eb59e5620c5") }

แสดงข้อมูล:

> db.demo355.find().pretty();

คิวรี project เฉพาะสมาชิกที่ isMarried = 1:

> db.demo355.aggregate([
  { $project: {
    details: {
      $filter: {
        input: "$details",
        as: "out",
        cond: { $eq: ["$$out.isMarried", 1] }
      }
    }
  }}
])

ผลลัพธ์ (เหลือ Chris และ Mike):

{ "_id" : ObjectId("5e568928f8647eb59e5620c5"), "details" : [ { "Name" : "Chris", "isMarried" : 1 }, { "Name" : "Mike", "isMarried" : 1 } ] }

คำอธิบาย

  • $filter: สร้างอาร์เรย์ใหม่จาก input โดยเก็บเฉพาะที่ cond = true
  • as: "out": ตั้งชื่อตัวแปรสำหรับสมาชิกปัจจุบัน (default คือ $$this)
  • cond: เงื่อนไข boolean expression
  • ต่างจาก $match ที่กรองเอกสาร $filter กรอง สมาชิกในอาร์เรย์

ตัวเลือกเพิ่มเติม

  • limit (MongoDB 4.4+): จำกัดจำนวนผลลัพธ์
  • ใช้ร่วม $map เพื่อ transform สมาชิกพร้อมกัน
  • MongoDB 5.0+: $filter รองรับ as optional (ใช้ $$this โดย default)