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

MongoDB $elemMatch trong projection để lọc phần tử mảng

Khác với $elemMatch trong query (lọc tài liệu), $elemMatch trong projection dùng để chỉ trả về phần tử đầu tiên trong mảng thoả mãn điều kiện, thay vì trả về toàn bộ mảng.

Dữ liệu mẫu

> db.demo313.insertOne({"_id":100,"details":[{"Name":"Chris","Age":24}]});
{ "acknowledged" : true, "insertedId" : 100 }
> db.demo313.insertOne({"_id":101,"details":[{"Name":"David","Age":22}]});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo313.insertOne({"_id":102,"details":[{"Name":"Mike","Age":25}]});
{ "acknowledged" : true, "insertedId" : 102 }

Xem dữ liệu

> db.demo313.find();
{ "_id" : 100, "details" : [ { "Name" : "Chris", "Age" : 24 } ] }
{ "_id" : 101, "details" : [ { "Name" : "David", "Age" : 22 } ] }
{ "_id" : ObjectId("5e4d685b5d93261e4bc9ea4c"), "details" : [ { "Name" : "Mike", "Age" : 25 } ] }

Projection: Chỉ trả về phần tử Age=22 trong details của _id=101

db.demo313.find({_id:101},{details: { $elemMatch: { Age: 22 } } } );

Kết quả

{ "_id" : 101, "details" : [ { "Name" : "David", "Age" : 22 } ] }

Ứng dụng: Rất hữu ích khi mảng lớn (ví dụ comments, logs) và bạn chỉ cần phần tử khớp điều kiện cụ thể. Lưu ý: $elemMatch projection chỉ trả về một phần tử đầu tiên khớp. Nếu cần nhiều phần tử, dùng aggregation $filter.