Mówiąc ogólnie, $project
opiera się na „ścieżce bezwzględnej” do właściwości pola w dokumencie po „prawej stronie”. Skróty, takie jak 1
są tylko tam, gdzie ten element jest faktycznie najwyższym poziomem dokumentu.
Musisz także mieć możliwość zachowywania pól, gdy $group
, więc tutaj używa się różnych operatorów grupujących, takich jak $first
i $addToSet
lub $push
aby zachować informacje, które wyciągasz z wewnętrznej tablicy. I musisz $unwind
również dwa razy, ponieważ łączysz „typy” w różnych dokumentach, a nie chcesz tylko $first
w tym przypadku.
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) {
});