บทความนี้สาธิตการใช้ Operator $all เพื่อค้นหาเอกสารที่ Array Field มีค่า ครบทุกค่า ที่ระบุใน Query (Order ไม่สำคัญ แต่ต้องมีทั้งหมด)
สร้างข้อมูลตัวอย่าง
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["C++","Java","MongoDB"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69a5f57806ebf1256f12e") }
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["MySQL","Java","MongoDB"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69ac057806ebf1256f12f") }
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["C#","Python","MongoDB"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69ad457806ebf1256f130") }
> db.findDocumentExactlySameInArrayDemo.insertOne({"TechnicalSubjects":["MySQL","C","MongoDB"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd69adf57806ebf1256f131") }
แสดงข้อมูลทั้งหมด
> db.findDocumentExactlySameInArrayDemo.find().pretty();
{
"_id" : ObjectId("5cd69a5f57806ebf1256f12e"),
"TechnicalSubjects" : [ "C++", "Java", "MongoDB" ]
}
{
"_id" : ObjectId("5cd69ac057806ebf1256f12f"),
"TechnicalSubjects" : [ "MySQL", "Java", "MongoDB" ]
}
{
"_id" : ObjectId("5cd69ad457806ebf1256f130"),
"TechnicalSubjects" : [ "C#", "Python", "MongoDB" ]
}
{
"_id" : ObjectId("5cd69adf57806ebf1256f131"),
"TechnicalSubjects" : [ "MySQL", "C", "MongoDB" ]
}
ค้นหาเอกสารที่ TechnicalSubjects มี "MySQL", "Java", "MongoDB" ครบทั้ง 3
> db.findDocumentExactlySameInArrayDemo.find({
"TechnicalSubjects": { $all: ["MySQL","Java","MongoDB"] }
});
ผลลัพธ์ (พบ 1 Document)
{ "_id" : ObjectId("5cd69ac057806ebf1256f12f"), "TechnicalSubjects" : [ "MySQL", "Java", "MongoDB" ] }
ความแตกต่าง $all vs $in
| Operator | ความหมาย | ตัวอย่าง |
|---|---|---|
$all | ต้องมี ทุกค่า ใน Array ที่ระบุ | { tags: { $all: ["A","B"] } } → ต้องมี A และ B |
$in | ต้องมี อย่างน้อย 1 ค่า ใน Array ที่ระบุ | { tags: { $in: ["A","B"] } } → มี A หรือ B (หรือทั้งคู่) |
รายละเอียด $all
- Order ของ Element ใน Array ไม่สำคัญ
- Array ใน Document อาจมี Element เพิ่มเติมกว่า Query ได้ (Superset)
- ใช้ได้กับ Array of Scalar และ Array of Objects (ด้วย Dot Notation)
ตัวอย่าง: $all กับ Array of Objects
// หา Order ที่มีทั้ง Product A และ Product B
db.orders.find({
"items.productId": { $all: ["PROD_A", "PROD_B"] }
});
ตัวอย่าง: $all กับ $elemMatch (เงื่อนไขซับซ้อน)
// หา Document ที่มี Item ราคา > 100 และ Item จำนวน > 5 (ใน Item เดียวกัน)
db.orders.find({
$and: [
{ "items": { $elemMatch: { price: { $gt: 100 } } } },
{ "items": { $elemMatch: { qty: { $gt: 5 } } } }
]
});