Mongodb Intentando que los campos seleccionados regresen del agregado

Estoy teniendo problemas con mi función agregada. Estoy tratando de obtener los pedidos más comunes de la base de datos de los usuarios, pero solo estoy devolviendo el nombre y el recuento. He intentado usar el operador del $project pero parece que no puedo hacer que devuelva otra cosa que no sea lo que está en la statement del $group .

Aquí está mi función agregada actual:

 OrderModel.aggregate( {$unwind: "$products"}, {$match: { customerID: customerID }}, {$group: { _id: "$products.name", count: {$sum:1}}}, {$project: {name: "$_id", _id:0, count:1, active:1}}, {$sort: {"count" : -1}}, {$limit: 25 }) 

Esto solo produce una salida de la siguiente manera {"count":10, "name": foo"} mientras que quiero devolver todo el objeto; documentos incrustados y todo. ¿Alguna idea de dónde me voy mal?

Edición: documento de ejemplo agregado y salida esperada

Documento:

 { "charge": {}, "captured": true, "refunds": [ ], "balance_transaction": "txn_104Ics4QFdqlbCVHAdV1G2Hb", "failure_message": null, "failure_code": null, "amount_refunded": 0, "customer": "cus_4IZMPAIkEdiiW0", "invoice": null, "dispute": null, "statement_description": null, "receipt_email": null }, "total": 13.2, "userToken": "cus_4IZMPAIkEdiiW0", "customerID": "10152430176375255", "_id": "53ad927ff0cb43215821c649", "__v": 0, "updated": 20140701082928810, "created": 20140627154919216, "messageReceived": false, "ready": true, "active": false, "currency": "GBP", "products": [ { "name": "Foo", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false, "price": 13.2 } ] } ] } ] } 

Gastos esperados:

 [ { "name": "Foo", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false } ] }, { "variants": [ { "name": "Something else", "isDefault": false } ] } ], "quantity": 10 }, { "name": "Another product", "active": true, "types": [ { "variants": [ { "name": "Bar", "isDefault": false } ] } ], "quantity": 7 } 

]

¡Gracias!

Hablando en gran parte aquí, $project basa en la “ruta absoluta” a la propiedad del campo en el documento en el lado “derecho”. Los accesos directos como 1 son solo para los puntos en los que el elemento es el nivel superior del documento.

También debe poder retener los campos cuando $group , por lo 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 también debe $unwind dos veces aquí, ya que está combinando “tipos” en todos los documentos, y en este caso no quiere solo el $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) { });