ใช้ $or ร่วมกับ $exists เพื่อกรองข้อมูลตามการมีอยู่ของฟิลด์
บทความนี้สาธิตวิธีการใช้งานออปเจอเตอร์ $or ใน MongoDB ร่วมกับ $exists เพื่อดึงเอกสารที่มีฟิลด์เฉพาะอยู่ (exist) หรือไม่มีอยู่ (not exist)
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo185 และเพิ่มเอกสาร 3 รายการ ซึ่งบางรายการมีฟิลด์ details.Subjects.Name และบางรายการไม่มี
> db.demo185.insertOne({_id:101,details:{Name:"Chris",Score:78,Subjects:{"Name":"MySQL"}}});
{ "acknowledged": true, "insertedId": 101 }
> db.demo185.insertOne({_id:102,details:{Name:"Bob",Score:78}});
{ "acknowledged": true, "insertedId": 102 }
> db.demo185.insertOne({_id:103,details:{Name:"David",Score:78,Subjects:{"Name":"MongoDB"}}});
{ "acknowledged": true, "insertedId": 103 }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo185.find();
ผลลัพธ์:
{ "_id": 101, "details": { "Name": "Chris", "Score": 78, "Subjects": { "Name": "MySQL" } } }
{ "_id": 102, "details": { "Name": "Bob", "Score": 78 } }
{ "_id": 103, "details": { "Name": "David", "Score": 78, "Subjects": { "Name": "MongoDB" } } }
ขั้นตอนที่ 3: ใช้ $or ร่วมกับ $exists
คิวรี่ต่อไปนี้จะดึงเอกสารที่มีฟิลด์ details.Subjects.Name อยู่ (ใช้ $exists: true) - ตัวอย่างใช้ $or แบบซ้ำกันเพื่อสาธิตโครงสร้าง
> db.demo185.find({
"$or": [
{ "details.Subjects.Name": { "$exists": true } },
{ "details.Subjects.Name": { "$exists": true } }
]
})
ผลลัพธ์ที่ได้
{ "_id": 101, "details": { "Name": "Chris", "Score": 78, "Subjects": { "Name": "MySQL" } } }
{ "_id": 103, "details": { "Name": "David", "Score": 78, "Subjects": { "Name": "MongoDB" } } }
หมายเหตุ: ในตัวอย่างนี้ $or มีเงื่อนไขซ้ำกัน 2 เงื่อนไข ซึ่งในทางปฏิบัติควรใช้เงื่อนไขที่แตกต่างกัน เช่น ตรวจสอบฟิลด์ต่างๆ หรือรวมกับเงื่อนไขอื่นๆ