A continuación se muestra mi estructura mongodb:
[{ _id: '111', items: [{ productId: '123' }] }, { _id: '222', items: [{ productId: '123' }, { productId: '456' }] }, { _id: '333', items: [{ productId: '123' }, { productId: '456' }, { productId: '789' }] }] Y espero agrupar y contar productId para que el resultado sea:
[{ productId: '123', count: 3 }, { productId: '456', count: 2 }, { productId: '789', count: 1 }] Bueno, intenté usar aggregation como esta, pero creo que me equivoqué:
const aggregatorOpts = [{ $group: { _id: "$items.productId", count: { $sum: 1 } } }] Model.aggregate(aggregatorOpts).exec()Obtuve:
result [ { _id: [ '123' ], count: 1 }, { _id: [ '123', '456' ], count: 1 }, { _id: [ '123', '456', '789' ], count: 1 } ]Cualquier ayuda con respecto a cómo hacer la agregación probablemente sea apreciada y, por favor, no asuma ningún cambio en el modelo.
¡Gracias por adelantado!
$unwind la matriz de elementos antes de agrupar:
const aggregatorOpts = [{ $unwind: "$items" }, { $group: { _id: "$items.productId", count: { $sum: 1 } } } ] Model.aggregate(aggregatorOpts).exec()lo que da :
{ "_id" : "789", "count" : 1 } { "_id" : "456", "count" : 2 } { "_id" : "123", "count" : 3 }Prueba este.
Model.aggregate([ { $group: { _id: '$items.productId', points: {$count: '$items'} } } ]);Esto debería funcionar.