Най-общо казано тук, $project
разчита на "абсолютния път" към свойството на полето в документа от "дясната" страна. Преки пътища като 1
са само за мястото, където този елемент всъщност е най-горното ниво на документа.
Също така трябва да можете да запазвате полета, когато $group
, така че тук използвате различни оператори за групиране като $first
и $addToSet
или $push
за да запазите информацията, която изтегляте от вътрешния масив. И трябва да $unwind
два пъти и тук, тъй като комбинирате „типове“ в документи и не искате само $first
в този случай.
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) {
});