对不同集合元素中的唯一属性求和

时间:2015-05-25 18:00:13

标签: mongodb mongodb-query

我是MongoDB的新手。希望我使用正确的术语来表达我的问题。

我有以下系列:

Data collection
{
   "name":"ABC",
  "resourceId":"i-1234",
  "volumeId":"v-1234",
  "data":"11/6/2013 12AM",
  "cost": 0.5
},
{
  "name":"ABC",
  "resourceId":"v-1234",
  "volumeId":"",
  "data":"11/6/2013 2AM",
  "cost": 1.5
}

我想查询集合,以便volumeId与其他条目resourceId匹配,然后一起总结相应的resourceId费用。

因此,在这种情况下,费用为2.0。 基本上我想将一个条目的volumeId与另一个条目的resourceId匹配,如果匹配则将成本相加。

我希望我已正确解释了我的问题。任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

尝试此聚合查询:

db.col.aggregate([
    {
        $project: {
                      resourceId: 1, 
                      volumeId: 1, 
                      cost: 1, 
                      match: {
                                 $cond: [
                                           {$eq: ["$volumeId", ""]}, 
                                           "$resourceId", 
                                           "$volumeId"
                                        ]
                             }
                   }
    }, 
    {
        $group: {
                    _id: '$match', 
                    cost: {$sum: '$cost'},
                    resId: {
                              $addToSet: {
                                            $cond: [
                                                      {$eq: ['$match', '$resourceId']}, 
                                                      null, 
                                                      '$resourceId'
                                                   ]
                                         }
                           }
                }
    }, 
    {$unwind: '$resId'},
    {$match: {
                resId: {
                          $ne: null
                       }
              }
    },
    {
        $project: {
                      resourseId: '$resId', 
                      cost: 1, 
                      _id: 0
                  }
    }
])

您将获得以下内容:

{ "cost" : 2, "resourseId" : "i-1234" }

假设the statement I wrote in the comment为真。