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)
您在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 的投影阶段。
| 归档时间: |
|
| 查看次数: |
2840 次 |
| 最近记录: |