Tengo un resultado de consulta de una consulta de agregación de mangosta que necesito seguir procesando o, en el mejor de los casos, hacerlo en la agregación misma.
La agregación se ve así
result = await TokenBalance.aggregate([ { $match: { $and: [ { ethervalue: { $gte: minBalance } }, { ethervalue: { $lte: maxBalance } } ] } }, { $limit:limit } ])Esto devuelve una matriz de objetos de este formato.
{ "_id": "61013d6dda7d7c0015af5ccf", "balances": [ { "address": "0x1fc3ddeb035310930a444c0fa59c01618d5902af", "symbol": "HBTC", "balance": 5.21419339e-10, "usdvalue": 0.000020969961637162402 }, { "address": "0x1fc3ddeb035310930a444c0fa59c01618d5902af", "symbol": "NSBT", "balance": 1.258566, "usdvalue": 27.427343477595258 }, { "address": "0x1fc3ddeb035310930a444c0fa59c01618d5902af", "symbol": "CRV", "balance": 517.985955847106, "usdvalue": 806.7017064052314 }, { "address": "0x1fc3ddeb035310930a444c0fa59c01618d5902af", "symbol": "USDT", "balance": 0.003469, "usdvalue": 0.003470159747979122 } ], "address": "0x1fc3ddeb035310930a444c0fa59c01618d5902af", "ethervalue": 0.7604598621232733, "createdAt": "2021-07-28T11:20:13.927Z", "updatedAt": "2021-07-28T11:20:13.927Z", "__v": 0 },Lo que necesito es que la propiedad "saldos" se procese como agrupada por símbolo y para cada uno de estos símbolos sume los campos de saldo y valor usd.
Preferiría que esto se hiciera en la agregación si es posible, pero parece que no puedo hacerlo bien, ni siquiera en nodos puros.
Quiero que el resultado sea así:
[ { symbol: USDC, balance: xxx, usdvalue: yyy }, { symbol: USDT, balance: zzz, usdvalue: jjj } ]Puede utilizar el siguiente enfoque,
$unwind para deconstruir la matriz de balances$group por symbol y sumar balance y usdvalue$addFields para cambiar el nombre del campo _id a symbol y eliminar el campo _id result = await TokenBalance.aggregate([ { $match: { $and: [ { ethervalue: { $gte: minBalance } }, { ethervalue: { $lte: maxBalance } } ] } }, { $unwind: "$balances" }, { $group: { _id: "$balances.symbol", balance: { $sum: "$balances.balance" }, usdvalue: { $sum: "$balances.usdvalue" } } }, { $addFields: { symbol: "$_id", _id: "$$REMOVE" } }, { $limit:limit } ])