我有一个带有记录的余额
{
"_id" : "uezyuLx4jjfvcqMXN",
"amount" : "10",
"createdBy" : "AGuT6zQtSojvozbbg"
}
{
"_id" : "dCC8GrNdEjym3ryua",
"amount" : "10",
"createdBy" : "AGuT6zQtSojvozbbg"
}
我试图计算金额总和:
db.balance.aggregate([{$group:{_id:"$createdBy",total:{ $sum: "$amount"}}}])
预期产出:
{createdBy:AGuT6zQtSojvozbbg , total:20}
实际输出:
{ "_id" : "AGuT6zQtSojvozbbg", "total" : 0 }
答案 0 :(得分:2)
您在amount
字段中有字符串值。来自$sum的文档:
计算并返回 numeric 值的总和。 $ sum忽略 非数字值。
返回零是预期的行为:
如果所有操作数都是非数字的,则$ sum返回0.
您应该将字段值从字符串转换为数字:
db.balance.find({amount: {$type:"string"}}).forEach(function(doc) {
var amountInt = new NumberInt(doc.amount);
db.balance.update({_id: doc._id}, {$set: {amount: amountInt}});
});
之后您的查询将正常工作。您需要添加的唯一内容是将_id字段重命名为createdBy的投影阶段。