在mongodb中使用相同ID的$ sum数组

时间:2015-11-27 15:24:14

标签: mongodb mongodb-query aggregation-framework

我的收藏中的两个文件如下:

第一份文件

{
 "_id" : 2055,
 "counervalues" : {
     "chcounter" : 3
     "bscounter" : 10 
  }
 "attributionvalues" :[
 {
     "id" : 1
     "conversionvalue" : 85.0
     "conversioncounter" : 6300.0
 }, 
 {
     "id" : 2
     "conversionvalue" : 25.0
     "conversioncounter" : 600
 }
}

第二份文件

{
 "_id" : 1046,
 "counervalues" : {
     "chcounter" : 23
     "bscounter" : 46 
  }
 "attributionvalues" :[
 {
     "id" : 1
     "conversionvalue" : 15.0
     "conversioncounter" : 275.0     
 }, 
 {
     "id" : 2
     "conversionvalue" : 65.0
     "conversioncounter" : 12000.0
 }
}

现在我想应用聚合框架以获得一个结果如下的新文档:

结果

{
 "_id" : 3005,
 "counervalues" : {
     "chcounter" : 26
     "bscounter" : 56 
  }
 "attributionvalues" :[
 {
     "id" : 1
     "conversionvalue" : 100.0
     "conversioncounter" : 6575.0     
 }, 
 {
     "id" : 2
     "conversionvalue" : 90.0
     "conversioncounter" : 12600.0
 }
}

我这样开始聚集:

db.conversion.counters.aggregate({
    $match:
    {
        "_id" : {"$gte" : 1046 , "$lte" : 2055}
    }
    $group:
    {
        cvchc: {$sum: "$counervalues.chcounter"}
        cvbsc: {$sum: "$counervalues.bscounter"}
    }
});

但我无法根据其ID匹配归因值并添加它们。

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

运行以下聚合管道,应该给你想要的结果:

db.conversion.aggregate([
    { "$match": {  "_id" : { "$gte" : 1046 , "$lte" : 2055 } } },
    { "$unwind": "$attributionvalues" },
    {
        "$group": {
            "_id": "$attributionvalues.id",
            "cvchc": { "$sum": "$counervalues.chcounter" },
            "cvbsc": { "$sum": "$counervalues.bscounter" },
            "avcv": { "$sum": "$attributionvalues.conversionvalue" },
            "avcc": { "$sum": "$attributionvalues.conversioncounter" }
        }
    },
    {
        "$group": {
            "_id": null,
            "chcounter": { "$first": "$cvchc" },
            "bscounter" : { "$first": "$cvbsc" },
            "attributionvalues": { 
                "$push": {
                    "id": "$_id",
                    "conversionvalue": "$avcv" ,
                    "conversioncounter": "$avcc" 
                }
            }        
        }
    },
    {
        "$project": {
            "counervalues": {
                "chcounter": "$chcounter",
                "bscounter": "$bscounter"
            },
            "attributionvalues": 1
        }
    } 
])