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

การจับคู่หลายเงื่อนไขภายใน Array ด้วย MongoDB

เมื่อต้องการค้นหาเอกสารที่ 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 อีกตัวหนึ่ง