เมื่อต้องการค้นหาเอกสารที่ array field มี element ตรงกับหลายเงื่อนไขพร้อมกัน (เช่น ชื่อ Chris และโสด) ให้ใช้ $elemMatch ภายใน $match ของ aggregate pipeline
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.demo84.insertOne({
... "EmployeeDetails": [
... {Name: 'John', Salary:45000, isMarried: true},
... {Name: 'Chris', Salary:50000, isMarried: false}
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c0a3471bf0181ecc422a5") }
> db.demo84.insertOne({
... "EmployeeDetails": [
... {Name: 'Sam', Salary:56000, isMarried: false},
... {Name: 'Bob', Salary:50000, isMarried: false}
... ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c0a4071bf0181ecc422a6") }
แสดงข้อมูลทั้งหมด
> db.demo84.find();
ผลลัพธ์:
{ "_id" : ObjectId("5e2c0a3471bf0181ecc422a5"), "EmployeeDetails" : [
{ "Name" : "John", "Salary" : 45000, "isMarried" : true },
{ "Name" : "Chris", "Salary" : 50000, "isMarried" : false }
]}
{ "_id" : ObjectId("5e2c0a4071bf0181ecc422a6"), "EmployeeDetails" : [
{ "Name" : "Sam", "Salary" : 56000, "isMarried" : false },
{ "Name" : "Bob", "Salary" : 50000, "isMarried" : false }
]}
Query จับคู่หลายเงื่อนไขใน Array
> db.demo84.aggregate([
... {
... "$match": {
... "EmployeeDetails": {
... "$elemMatch": {
... "Name": "Chris",
... "isMarried": false
... }
... }
... }
... }
... ]);
คำอธิบาย:
$elemMatch: จับคู่ element เดียวใน array ที่ตรงกับ ทุกเงื่อนไข ที่ระบุพร้อมกัน- ต่างจากการ query ธรรมดาที่อาจจับคู่ element คนละตัวกันได้
ผลลัพธ์
{ "_id" : ObjectId("5e2c0a3471bf0181ecc422a5"), "EmployeeDetails" : [
{ "Name" : "John", "Salary" : 45000, "isMarried" : true },
{ "Name" : "Chris", "Salary" : 50000, "isMarried" : false }
]}
ได้เฉพาะเอกสารแรก เพราะมี element ที่ Name="Chris" และ isMarried=false พร้อมกัน ในขณะที่เอกสารที่สองไม่มี Chris
หมายเหตุสำคัญ: หากใช้ query ธรรมดา {"EmployeeDetails.Name": "Chris", "EmployeeDetails.isMarried": false} อาจได้ผลลัพธ์ผิดเพราะ MongoDB อาจจับคู่ Name จาก element ตัวหนึ่ง และ isMarried จาก element อีกตัวหนึ่ง