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:
$inMatch ถ้ามี อย่างน้อย 1 ค่า,$allต้องมี ทุกค่า - สำหรับ Array ของ Primitive Values (String/Number):
db.col.find({ tags: { $all: ["mongodb", "database"] } }) - ใช้ Index ได้ (Multi-key Index) แต่ต้อง Scan ทุก Element ที่ Match ค่าแรก