En gros ici, $project
s'appuie sur le "chemin absolu" de la propriété de champ dans le document sur le côté "droit". Raccourcis tels que 1
sont juste là où cet élément est en fait le niveau supérieur du document.
Vous devez également pouvoir conserver les champs lorsque vous $group
, c'est donc ici que vous utilisez divers opérateurs de regroupement tels que $first
et $addToSet
ou $push
pour conserver les informations que vous extrayez du tableau interne. Et vous devez $unwind
deux fois ici aussi puisque vous combinez des "types" à travers des documents, et vous ne voulez pas seulement le $first
dans ce cas.
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) {
});