Nếu bạn chỉ muốn chọn một số trường nhất định của một mảng để trả về thì bạn đang nói về việc "định hình lại" tài liệu. Đối với bất kỳ điều gì ngoài lựa chọn trường "cơ bản", điều này có nghĩa là sử dụng .aggregate()
dưới dạng phương thức thay vì .find()
.
Vì vậy, hai yêu cầu ở đây là $filter
trên nội dung mảng để "khớp" và trả về, cũng như $map
"các trường trả về" thực tế từ chính mảng:
User.aggregate([
{ "$match": { "children.name": "def" } },
{ "$project": {
"name": 1,
"children": {
"$map": {
"input": {
"$filter": {
"input": "$children",
"as": "c",
"cond": { "$eq": [ "$$c.name", "def" ] }
}
},
"as": "c",
"in": {
"age": "$$c.age",
"height": "$$c.height"
}
}
}
}}
])
Đây $filter
được sử dụng để giảm nội dung của mảng xuống chỉ những nội dung phù hợp với điều kiện. Là những người có cùng "name"
thuộc tính giá trị "def"
. Sau đó, giá trị này được chuyển làm "input"
tham số thành $map
.
$map
toán tử hoạt động giống như các đối tác ngôn ngữ khác ở chỗ nó "định hình lại mảng" để trả về thứ gì đó theo những gì bạn chỉ định trong "in"
tham số. Vì vậy, ở đây chúng tôi thực sự chỉ đặt tên rõ ràng cho các thuộc tính và sử dụng các phép gán biến ở đó cho phần tử mảng hiện tại đang được xử lý để chúng được trả về dưới dạng nội dung mảng "mới".
Kết quả tổng thể là một mảng, chứa:
- Chỉ các mục phù hợp với các điều kiện đã chỉ định.
- Chỉ các trường được chỉ định để trả về.