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

MongoDB $all Operator ค้นหา Array ที่มี Element ครบทุกค่าที่กำหนด

Operator $all ใน MongoDB ใช้ Match เอกสารที่ Field เป็น Array และมี Element ครบทุกค่า ที่ระบุใน Array Condition (Order ไม่สำคัญ) เนื้อหานี้สาธิตการค้นหาเอกสารที่ ClientDetails มีทั้ง "Mike" และ "Sam"

ตัวอย่างข้อมูลทดสอบ

> db.demo163.insertOne({
  "ClientDetails": [
    {"ClientName": "Chris"},
    {"ClientName": "David"}
  ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3686d49e4f06af551997c5") }

> db.demo163.insertOne({
  "ClientDetails": [
    {"ClientName": "Mike"},
    {"ClientName": "Sam"}
  ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3686d59e4f06af551997c6") }

> db.demo163.insertOne({
  "ClientDetails": [
    {"ClientName": "Robert"},
    {"ClientName": "Sam"}
  ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3686d59e4f06af551997c7") }

แสดงข้อมูลทั้งหมด

> db.demo163.find();
{
  "_id" : ObjectId("5e3686d49e4f06af551997c5"),
  "ClientDetails" : [ { "ClientName" : "Chris" }, { "ClientName" : "David" } ]
}
{
  "_id" : ObjectId("5e3686d59e4f06af551997c6"),
  "ClientDetails" : [ { "ClientName" : "Mike" }, { "ClientName" : "Sam" } ]
}
{
  "_id" : ObjectId("5e3686d59e4f06af551997c7"),
  "ClientDetails" : [ { "ClientName" : "Robert" }, { "ClientName" : "Sam" } ]
}

Query ใช้ $all

> db.demo163.find({
  "ClientDetails": { $all: [ {"ClientName": "Mike"}, {"ClientName": "Sam"} ] }
});

ผลลัพธ์ (Match เพียง Doc ที่ 2)

{
  "_id" : ObjectId("5e3686d59e4f06af551997c6"),
  "ClientDetails" : [ { "ClientName" : "Mike" }, { "ClientName" : "Sam" } ]
}

คำอธิบายสำคัญ

  • $all ต้องการให้ Array Field มี Element Match ทุก Object ใน Array Condition
  • Doc ที่ 3 มี "Sam" แต่ไม่มี "Mike" → ไม่ Match
  • Doc ที่ 1 มี "Chris", "David" → ไม่ Match
  • ต่างจาก $in: $in Match ถ้ามี อย่างน้อย 1 ค่า, $all ต้องมี ทุกค่า
  • สำหรับ Array ของ Primitive Values (String/Number):
    db.col.find({ tags: { $all: ["mongodb", "database"] } })
  • ใช้ Index ได้ (Multi-key Index) แต่ต้อง Scan ทุก Element ที่ Match ค่าแรก