Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Khớp nhiều tiêu chí trong mảng MongoDB với $elemMatch

Để tìm document có phần tử mảng thỏa mãn nhiều điều kiện cùng lúc, sử dụng toán tử $elemMatch trong stage $match của aggregate (hoặc trực tiếp trong find).

Tạo collection với mảng đối tượng lồng nhau

> 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") }

Xem dữ liệu

> 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 } ] }

Truy vấn aggregate với $elemMatch

Tìm document có ít nhất một phần tử trong EmployeeDetails thỏa mãn: Name="Chris" VÀ isMarried=false:

> db.demo84.aggregate([
...     {
...         "$match": {
...             "EmployeeDetails": {
...                 "$elemMatch": {
...                     "Name": "Chris",
...                     "isMarried": false
...                 }
...             }
...         }
...     }
... ]);

Kết quả

{ "_id" : ObjectId("5e2c0a3471bf0181ecc422a5"), "EmployeeDetails" : [ { "Name" : "John", "Salary" : 45000, "isMarried" : true }, { "Name" : "Chris", "Salary" : 50000, "isMarried" : false } ] }

Lưu ý: Nếu dùng truy vấn thông thường { "EmployeeDetails.Name": "Chris", "EmployeeDetails.isMarried": false }, MongoDB sẽ khớp nếu có một phần tử tên Chris và có một phần tử (có thể khác) isMarried=false. $elemMatch đảm bảo cùng một phần tử thỏa mãn tất cả điều kiện.