Toán tử $elemMatch khớp tài liệu có mảng chứa ít nhất một phần tử thỏa mãn tất cả tiêu chí chỉ định. Tạo collection:
> db.demo592.insertOne({
... "id":101,
... "details": [ { "Name": "Chris", "Value": "200" }, { "Name": "David", "Value": "800" } ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e930d8ffd2d90c177b5bcd6") }
> db.demo592.insertOne({
... "id":102,
... "details": [ { "Name": "Chris", "Value": "500" }, { "Name": "David", "Value": "900" } ]
... });
{ "acknowledged" : true, "insertedId" : ObjectId("5e930d90fd2d90c177b5bcd7") }
Hiển thị dữ liệu:
> db.demo592.find();
{ "_id" : ObjectId("5e930d8ffd2d90c177b5bcd6"), "id" : 101, "details" : [ { "Name" : "Chris", "Value" : "200" }, { "Name" : "David", "Value" : "800" } ] }
{ "_id" : ObjectId("5e930d90fd2d90c177b5bcd7"), "id" : 102, "details" : [ { "Name" : "Chris", "Value" : "500" }, { "Name" : "David", "Value" : "900" } ] }
Truy vấn: Tìm tài liệu CÓ Chris Value ≥ 500 VÀ David Value ≥ 600 (cùng một tài liệu):
> db.demo592.find({
... "$and": [
... { "details": { "$elemMatch": { "Name": "Chris", "Value": { "$gte": "500" } } } },
... { "details": { "$elemMatch": { "Name": "David", "Value": { "$gte": "600" } } } }
... ]
... });
Kết quả (chỉ id=102 thỏa mãn):
Tại sao cần $elemMatch? Nếu dùng
{"details.Name": "Chris", "details.Value": {$gte: "500"}}, MongoDB sẽ khớp nếu khác nhau phần tử thỏa mãn (Chris ở phần tử 1, Value ≥ 500 ở phần tử 2). $elemMatch yêu cầu cùng một phần tử thỏa mãn tất cả.