ใน MongoDB การค้นหาค่าที่ตรงกันแม่นยำ (Exact Match) สามารถทำได้โดยใช้ operator $exists ร่วมกับเงื่อนไขการเปรียบเทียบค่า เนื้อหานี้จะสาธิตวิธีการค้นหาเอกสารที่มีค่า "Chris" ในฟิลด์ ListOfName โดยเฉพาะเอกสารที่เก็บค่าเป็น String เดียว ไม่ใช่ Array
ตัวอย่างข้อมูลทดสอบ
สร้าง Collection ชื่อ demo290 และเพิ่มเอกสาร 2 รายการ:
> db.demo290.insertOne({"ListOfName":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4c0c9e5d93261e4bc9ea2d") }
> db.demo290.insertOne({"ListOfName":["Chris","David"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4c0cb05d93261e4bc9ea2e") }
แสดงข้อมูลทั้งหมดใน Collection
> db.demo290.find();
ผลลัพธ์:
{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }
{ "_id" : ObjectId("5e4c0cb05d93261e4bc9ea2e"), "ListOfName" : [ "Chris", "David" ] }
Query สำหรับ Exact Match
ใช้ $and ร่วมกับ $exists: false ตรวจสอบว่าไม่มี Index ที่ 0 (คือไม่ใช่ Array) และค่าเท่ากับ "Chris":
> db.demo290.find({$and: [{'ListOfName.0': {$exists: false}}, {"ListOfName": 'Chris'}]});
ผลลัพธ์จะได้เฉพาะเอกสารที่เก็บค่า "Chris" เป็น String เดียว:
{ "_id" : ObjectId("5e4c0c9e5d93261e4bc9ea2d"), "ListOfName" : "Chris" }
คำอธิบายเพิ่มเติม
'ListOfName.0': {$exists: false}- ตรวจสอบว่าไม่มี Element ตำแหน่งที่ 0 (Meaning ไม่ใช่ Array)"ListOfName": 'Chris'- เปรียบเทียบค่าให้ตรงกับ "Chris"- วิธีนี้เหมาะสำหรับกรณีที่ฟิลด์อาจเก็บได้ทั้ง String และ Array