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

Mongodb 对不同集合元素中的唯一属性求和,mongodb,mongodb-query,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",

我对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进行匹配,如果匹配,则计算成本总和


我希望我已经正确地解释了我的问题。感谢您的帮助。谢谢

尝试此聚合查询:

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

假设这是真的。

据我所知,您想按资源id对文档进行分组,其中卷id=资源id,对于每个组的总成本?@ari是否会有另一个文档,卷id等于
I-1234
?我的意思是,如果一个文档具有
volumeId
,那么另一个文档是否可能将第一个文档的
resourceId
作为其
volumeId?
@AntonPutau,是的。我想按
resourceId
volumeId
=
resourceId
中的文档进行分组。请注意,存在多个
资源ID:“i-1234”
@n9code不会有另一个
volumeId
等于
i-1234
的文档,也不会有与
resourceId
的任何关联。那么,这句话是真的吗?如果一个文档的
volumeId
非空,那么就不存在其他文档的
volumeId
值为第一个文档的
resourceId
?检查我的答案,看看它是否有效。这绝对是一个很大的帮助!非常感谢。但是,如果我想例如输出
{“cost”:2,“resourceid”:“I-1234”}
而不是
v-1234
签出更新,我不确定如何修改此选项。有点黑,但在你的条件下工作。