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

MongoDB Query: ยกเว้นเอกสารที่ ID ตรงกับค่าใน Array Field

เมื่อต้องการค้นหาเอกสารที่ field id ไม่อยู่ใน array subjectid ของเอกสารเดียวกัน สามารถใช้ $expr ร่วมกับ $not และ $in ได้ ตัวอย่างนี้สาธิตวิธีการทำแบบนี้

ข้อมูลตัวอย่าง

[
  {
    id: "101",
    subjectid: ["102"]
  },
  {
    id: "102",
    subjectid: ["102"]
  }
]

แสดงข้อมูลทั้งหมด

db.collection.find()

ผลลัพธ์:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "id": "101",
    "subjectid": ["102"]
  },
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "id": "102",
    "subjectid": ["102"]
  }
]

Query ยกเว้นเอกสารที่ id อยู่ใน subjectid

db.collection.find({
  $expr: {
    $not: {
      $in: [
        "$id",
        "$subjectid"
      ]
    }
  }
})

คำอธิบาย:

  • $expr: อนุญาตให้ใช้ aggregation expressions ภายใน query
  • $in: ["$id", "$subjectid"]: ตรวจสอบว่า field id อยู่ใน array subjectid หรือไม่
  • $not: ย้อนกลับเงื่อนไข (เลือกเฉพาะที่ไม่อยู่ใน array)

ผลลัพธ์ (เหลือเฉพาะเอกสารที่ id=101)

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "id": "101",
    "subjectid": ["102"]
  }
]

เอกสารที่ id=102 ถูกยกเว้นเพราะ "102" อยู่ใน subjectid ของตัวเอง

การประยุกต์ใช้: เทคนิคนี้เหมาะสำหรับการกรองข้อมูลที่มีความสัมพันธ์อ้างอิงตัวเอง (self-referencing) เช่น โครงสร้างต้นไม้ หรือการป้องกัน circular reference