mongodb sum 查询返回零

ket*_*rni 4 mongodb aggregation-framework

我有一个带记录 的收款余额

{  
 "_id" : "uezyuLx4jjfvcqMXN",   
  "amount" : "10",   
"createdBy" : "AGuT6zQtSojvozbbg"   
}
{  
 "_id" : "dCC8GrNdEjym3ryua",   
"amount" : "10",  
"createdBy" : "AGuT6zQtSojvozbbg"  
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算金额总和:

db.balance.aggregate([{$group:{_id:"$createdBy",total:{ $sum: "$amount"}}}])
Run Code Online (Sandbox Code Playgroud)

预期输出:

{createdBy:AGuT6zQtSojvozbbg , total:20}
Run Code Online (Sandbox Code Playgroud)

实际输出:

{ "_id" : "AGuT6zQtSojvozbbg", "total" : 0 }
Run Code Online (Sandbox Code Playgroud)

Ser*_*kiy 5

您在amount字段中有字符串值。来自$sum 的文档:

计算并返回数值的总和。$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}});
});
Run Code Online (Sandbox Code Playgroud)

之后,您的查询将正常工作。您唯一需要添加的是将 _id 字段重命名为 createdBy 的投影阶段。