Necesito aplicar group by en un campo llamado material y sum aggregator en raiseGrnQuantity. Tanto este material como raiseGrnQuantity están en una matriz poDetails. He construido una tubería de agregación para dar una idea aproximada de lo que realmente estoy tratando de hacer:
var projectQry = [ { "$unwind": { path : '$poDetails', preserveNullAndEmptyArrays: true } }, { $match: { "trackNo": campaignId, "vendorNo": vendorNo, "poDetails.material": output[i].materialCode, "status": "Pending" } }, { $project: { "poDetails.raisedGrnQuantity": 1, "poDetails.material": 1 } } ];El resultado de esta canalización de agregación es:
[ { _id: 62de2e7f1ad8470012b9dc75, poDetails: { material: '300000114', raisedGrnQuantity: '20' } }, { _id: 62de30ea1ad8470012b9dc78, poDetails: { material: '300000114', raisedGrnQuantity: '15' } } ] [ { _id: 62de2e7f1ad8470012b9dc75, poDetails: { material: '910000029', raisedGrnQuantity: '10' } }, { _id: 62de30ea1ad8470012b9dc78, poDetails: { material: '910000029', raisedGrnQuantity: '5' } } ]Si nos damos cuenta, hay dos matrices diferentes en la salida porque tengo dos documentos coincidentes diferentes en la base de datos.
Ahora, lo que quiero hacer exactamente es aplicar el grupo por en el material y la agregación de la suma en raiseGrnQuantity para que tenga un resultado como el siguiente:
{ raisedGrnQuantity: '35' material: '300000114' }, { raisedGrnQuantity: '15' material: '910000029' }Intenté usar el siguiente grupo en la canalización, pero no está dando el resultado correcto. En lugar de la suma de raiseGrnQuantity, muestra 0.
$group: { _id: "$poDetails.material", raisedGrnQuantity: { $sum: "$poDetails.raisedGrnQuantity" } }Sospecho que el problema se debe a dos documentos coincidentes que hacen que la salida sea dos matrices diferentes.
El problema que tiene es que el tipo de "podDetail.raisedGrnQuantity" es una cadena, por lo que $sum lo ignora.
Todo lo que necesita hacer es convertirlo en un número usando $toInt , así:
{ $group: { _id: "$poDetails.material", raisedGrnQuantity: { $sum: { "$toInt": "$poDetails.raisedGrnQuantity" } } } }