Você pode usar o pipeline de agregação para adicionar campos calculados a um resultado. Existem alguns exemplos abaixo usando o
mongo
shell, mas a sintaxe no auxiliar de Aggregate()
do Mongoose É similar. Por exemplo, para calcular somas (por documento do usuário), você pode usar o
$add
expressão
em um $project
estágio
:db.user.aggregate(
// Limit to relevant documents and potentially take advantage of an index
{ $match: {
user_id: "foo"
}},
{ $project: {
user_id: 1,
total: { $add: ["$user_totaldocs", "$user_totalthings"] }
}}
)
Para calcular os totais em vários documentos, você precisa usar um
$group
estágio
com um $sum
acumulador
, por exemplo:db.user.aggregate(
{ $group: {
_id: null,
total: { $sum: { $add: ["$user_totaldocs", "$user_totalthings"] } },
totaldocs: { $sum: "$user_totaldocs" },
totalthings: { $sum: "$user_totalthings" }
}}
)
Você pode querer apenas um
total
campo; Eu adicionei em totaldocs
e totalthings
como exemplos de cálculo de vários campos. Um grupo
_id
de null
irá combinar valores de todos os documentos passados para o $group
stage, mas você também pode usar outros critérios aqui (como agrupar por user_id
).