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.