เมื่อต้องการค้นหาเอกสารที่ 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"]: ตรวจสอบว่า fieldidอยู่ใน arraysubjectidหรือไม่$not: ย้อนกลับเงื่อนไข (เลือกเฉพาะที่ไม่อยู่ใน array)
ผลลัพธ์ (เหลือเฉพาะเอกสารที่ id=101)
[
{
"_id": ObjectId("5a934e000102030405000000"),
"id": "101",
"subjectid": ["102"]
}
]
เอกสารที่ id=102 ถูกยกเว้นเพราะ "102" อยู่ใน subjectid ของตัวเอง
การประยุกต์ใช้: เทคนิคนี้เหมาะสำหรับการกรองข้อมูลที่มีความสัมพันธ์อ้างอิงตัวเอง (self-referencing) เช่น โครงสร้างต้นไม้ หรือการป้องกัน circular reference