Match เอกสารที่อาร์เรย์มีสมาชิก เพียงค่าเดียว และตรงกับที่กำหนด
ใช้คิวรีแบบตรงตัว (Exact Match) กับอาร์เรย์: { arrayField: [ "exactValue" ] } จะหาเอกสารที่อาร์เรย์มี สมาชิกเดียว และค่านั้นตรงตามที่ระบุ
ตัวอย่างข้อมูล
> db.arrayContainOnlySpecificFieldDemo.insertOne({
"StudentName": "John",
"StudentAge": 21,
"StudentTechnicalSubject": ["C", "Java", "MongoDB"]
});
> db.arrayContainOnlySpecificFieldDemo.insertOne({
"StudentName": "Carol",
"StudentAge": 23,
"StudentTechnicalSubject": ["MongoDB"]
});
คิวรี: หาผู้ที่เรียนเฉพาะ MongoDB (อาร์เรย์มีแค่ "MongoDB" ตัวเดียว)
> db.arrayContainOnlySpecificFieldDemo.find({
"StudentTechnicalSubject": ["MongoDB"]
}).pretty();
ผลลัพธ์
{ "_id" : ObjectId("5cc49237ac184d684e3fa26b"),
"StudentName" : "Carol",
"StudentAge" : 23,
"StudentTechnicalSubject" : [ "MongoDB" ] }
ความแตกต่างของคิวรีอาร์เรย์
| คิวรี | ความหมาย | Match กรณี Carol | Match กรณี John |
|---|---|---|---|
{ arr: ["MongoDB"] } | อาร์เรย์มีสมาชิกเดียวคือ "MongoDB" | ✅ | ❌ |
{ arr: "MongoDB" } | อาร์เรย์มี "MongoDB" อยู่ (อาจมีค่าอื่นปน) | ✅ | ✅ |
{ arr: { $all: ["MongoDB"] } } | เหมือนข้างต้น (Explicit) | ✅ | ✅ |
{ arr: { $size: 1, $elemMatch: { $eq: "MongoDB" } } } | อาร์เรย์ขนาด 1 และค่านั้นคือ "MongoDB" | ✅ | ❌ |
สรุป
- ใช้
{ field: ["value"] }สำหรับ Exact Array Match (ขนาด 1 และค่าตรง) - ใช้
{ field: "value" }สำหรับ Contains (มีค่านั้นอยู่ในอาร์เรย์) - ใช้
$size+$elemMatchสำหรับควบคุมขนาดและค่าแยกกัน