我有一个交易集合:
{
_id:ObjecId("5286f7c1f873cc89108b6898"),
type:"sms",
amount:NumberInt(1000),
input_vendor:"a"
},
{
_id:ObjecId("5286f7c1f873cc89108b6898"),
type:"sms",
amount:NumberInt(2000),
input_vendor:"a"
},
{
_id:ObjecId("5286f7c1f873cc89108b6898"),
type:"sms",
amount:NumberInt(5000),
input_vendor:"b"
}
我想在mongo中使用聚合来计算总sms,以及每个sms类型的总量,请帮助我。 结果为:
total_sms_a:2
amount_sms_a:3000
total_sms_b:1,
amount_sms_b:500
答案 0 :(得分:1)
您在事务集合中出错:_id字段对于集合中的所有文档都是uniq。选择另一个字段以识别与一个号码相关的短信。
db.transactions.aggregate( {$group : "$aggregation_id", "total_sms" : { $sum : 1 }, "amount_sms" : { $sum : "$amount" } }})
结果:
"result" : [
{
"_id" : "your_aggregation_id",
"total" : 2,
"amount" : 3000
}
],
"ok" : 1
您真的需要在结果字段的名称中添加后缀吗?
答案 1 :(得分:0)
$group = array(
'_id':null,
'total_sms_mobi'=>array(
'$sum'=>array('$cond'=>array(array('$and'=>array(array('$eq'=>array('$type','sms')),array('$eq'=>array('$input_vendor','a')))),'$amount',0)
)
),
)
它对我有用。
答案 2 :(得分:0)
您必须$ GroupBy null
并计数total_sms
和amount
db.transactions.aggregate([
{
$group : {
_id : null,
"total_sms" : { $sum : 1 },
"amount_sms" : { $sum : "$amount" }
}
}
])
答案 3 :(得分:0)
您必须按“ $ input_vendor”分组,总和+1以计算总短信,总和“ $ amount”以得到总金额。这将为您计算每个input_vendor的总和。
db.transactions.aggregate([
{
"$group": {
"_id": "$input_vendor",
"total_sms": { "$sum": 1 },
"amount_sms": { "$sum": "$amount" }
}
}
])
如果您的文档具有其他“ $ type”值,则还必须在该组之前添加匹配阶段,如下所示:
db.transactions.aggregate([
{
"$match": {
"type": "sms"
}
},
{
"$group": {
"_id": "$input_vendor",
"total_sms": { "$sum": 1 },
"amount_sms": { "$sum": "$amount" }
}
}
])