En términos generales aquí, $project
se basa en la "ruta absoluta" a la propiedad de campo en el documento en el lado "derecho". Atajos como 1
son solo para donde ese elemento es en realidad el nivel superior del documento.
También debe poder retener campos cuando $group
, así que aquí es donde usa varios operadores de agrupación como $first
y $addToSet
o $push
para mantener la información que está extrayendo de la matriz interna. Y debe $unwind
dos veces aquí también, ya que está combinando "tipos" entre documentos, y no desea solo $first
en este 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) {
});