Falando basicamente aqui,
$project
depende do "caminho absoluto" para a propriedade do campo no documento no lado "direito". Atalhos como 1
são apenas para onde esse elemento é realmente o nível superior do documento. Além disso, você precisa ser capaz de reter campos quando
$group
, então é aqui que você usa vários operadores de agrupamento, como $first
e $addToSet
ou $push
para manter as informações que você está extraindo do array interno. E você deve $unwind
duas vezes aqui também, pois você está combinando "tipos" em documentos e não deseja apenas o $first
nesse caso. 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) {
});