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

ค้นหาเอกสาร MongoDB ที่ Array ตรงกันทุกค่า (Exact Array Match) ด้วย $all

บทความนี้สาธิตการใช้ 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 } } } }
  ]
});