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

Lọc nhiều phần tử mảng trong MongoDB với $elemMatch

Toán tử $elemMatch cho phép lọc document dựa trên việc mảng chứa phần tử thỏa mãn nhiều điều kiện cùng lúc.

Dữ liệu mẫu

> db.demo87.insertOne({
    id:101,
    "Details": [
        { "EmployeeName": "Chris", "Salary": 45000 },
        { "EmployeeName": "David", "Salary": 50000 }
    ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c113871bf0181ecc422ab") }
> db.demo87.insertOne({
    id:102,
    "Details": [
        { "EmployeeName": "Chris", "Salary": 65000 },
        { "EmployeeName": "Mike", "Salary": 100000 }
    ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c114371bf0181ecc422ac") }

Truy vấn $elemMatch

Tìm document có phần tử EmployeeName="Chris" VÀ Salary=65000:

> db.demo87.find({ Details: { $elemMatch: { "EmployeeName": 'Chris', "Salary": 65000 }}});

Kết quả

{ "_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [ { "EmployeeName" : "Chris", "Salary" : 65000 }, { "EmployeeName" : "Mike", "Salary" : 100000 } ] }

Tại sao cần $elemMatch?

Nếu dùng truy vấn thường: { "Details.EmployeeName": "Chris", "Details.Salary": 65000 }

  • Document 1: Chris(45000) + David(50000) → Khớp Name=Chris (phần tử 1) VÀ Salary=65000 (không có) → Không khớp
  • Document 2: Chris(65000) + Mike(100000) → Khớp cả hai → Khớp

Kết quả đúng, nhưng logic ngầm hiểu: có một phần tử thỏa Name=Chris VÀ có một phần tử (có thể khác) thỏa Salary=65000. $elemMatch đảm bảo cùng một phần tử thỏa cả hai.