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

ค้นหาเอกสารที่อาร์เรย์มีเพียงค่าเดียวที่ระบุใน MongoDB

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 กรณี CarolMatch กรณี 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 สำหรับควบคุมขนาดและค่าแยกกัน