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

Truy vấn MongoDB khớp tài liệu chứa mảng với $elemMatch

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ả.