Nói rộng ra ở đây, $project
dựa vào "đường dẫn tuyệt đối" đến thuộc tính trường trong tài liệu ở phía "bên phải". Các phím tắt như 1
chỉ dành cho nơi phần tử đó thực sự là cấp cao nhất của tài liệu.
Ngoài ra, bạn cần có khả năng giữ lại các trường khi bạn $group
, vì vậy đây là nơi bạn sử dụng các toán tử nhóm khác nhau như $first
và $addToSet
hoặc $push
để giữ thông tin bạn đang chạy từ mảng bên trong. Và bạn phải $unwind
hai lần ở đây vì bạn đang kết hợp "loại" trên các tài liệu và bạn không muốn chỉ có $first
trong trường hợp này.
OrderModel.aggregate([
{ "$unwind": "$products" },
{ "$unwind": "$products.types" },
{ "$group": {
"_id": "$products.name",
"active": { "$first": "$products.active" },
"types": { "$addToSet": "$products.types" },
"quantity": { "$sum": 1 }
}},
{ "$project": {
"_id": 0,
"name": "$_id",
"active": 1,
"types": 1,
"quantity": 1
}}
],function(err,results) {
});