如何在聚合mongodb中使用多种条件

时间:2013-11-21 07:01:25

标签: mongodb aggregation-framework

我有一个交易集合:

{
  _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

4 个答案:

答案 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_smsamount

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" }
        }
    }
])