ใช้ $all หาเอกสารที่อาร์เรย์มี ทุกค่า ที่ระบุ
เมื่อต้องการหาเอกสารที่อาร์เรย์ฟิลด์มีสมาชิกครบทุกค่าที่กำหนด (เหมือน AND Logic) ใช้โอเปอเรเตอร์ $all
ตัวอย่างข้อมูล: วิชาที่นักเรียนชอบ
> db.andQueryDemo.insertOne({"StudentName":"Carol Taylor","FavouriteSubject":["C","Java","MongoDB","MySQL"]});
> db.andQueryDemo.insertOne({"StudentName":"David Miller","FavouriteSubject":["C++","Java","MongoDB","SQL Server"]});
> db.andQueryDemo.insertOne({"StudentName":"Carol Taylor","FavouriteSubject":["Python","PL/SQL"]});
คิวรี: หานักเรียนที่ชอบ ทั้ง Java และ MongoDB
> db.andQueryDemo.find({FavouriteSubject:{$all:["Java","MongoDB"]}}).pretty();
ผลลัพธ์
{ "StudentName" : "Carol Taylor", "FavouriteSubject" : [ "C", "Java", "MongoDB", "MySQL" ] }
{ "StudentName" : "David Miller", "FavouriteSubject" : [ "C++", "Java", "MongoDB", "SQL Server" ] }
ความแตกต่าง $all vs $in
| โอเปอเรเตอร์ | ความหมาย | ตัวอย่าง Match |
|---|---|---|
$all: ["A","B"] | ต้องมี ทั้ง A และ B (AND) | ["A","B"], ["B","A","C"], ["A","X","B"] |
$in: ["A","B"] | มี อย่างน้อย 1 ใน A หรือ B (OR) | ["A"], ["B"], ["A","B"], ["A","C"] |
รายละเอียดเพิ่มเติม
$allใช้ Index ได้ (Multi-key Index)- ลำดับในอาร์เรย์ไม่สำคัญ
- ค่าซ้ำในอาร์เรย์ Query ไม่ส่งผล (ถือว่า 1 ค่า)
- รองรับ Object/Sub-document ได้ เช่น
{ $all: [ { "name": "A" }, { "name": "B" } ] }