Z velké části zde hovoříme o $project
spoléhá na "absolutní cestu" k vlastnosti pole v dokumentu na "pravé" straně. Zkratky jako 1
jsou pouze tam, kde je tento prvek ve skutečnosti nejvyšší úrovní dokumentu.
Také musíte být schopni zachovat pole, když $group
, takže zde používáte různé operátory seskupení, jako je $first
a $addToSet
nebo $push
k uchování informací, které stahujete z vnitřního pole. A musíte $unwind
dvakrát zde, protože kombinujete "typy" napříč dokumenty a nechcete pouze $first
v tomto případě.
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) {
});