In gran parte parlando qui, $project
si basa sul "percorso assoluto" alla proprietà del campo nel documento sul lato "destra". Scorciatoie come 1
sono solo per il punto in cui quell'elemento è effettivamente il livello più alto del documento.
Inoltre devi essere in grado di conservare i campi quando $group
, quindi è qui che utilizzi vari operatori di raggruppamento come $first
e $addToSet
o $push
per mantenere le informazioni che stai estraendo dall'array interno. E devi $unwind
anche due volte qui poiché stai combinando "tipi" tra documenti e non vuoi solo il $first
in questo 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) {
});