mongodb中具有相同ID的$sum数组

mongodb中具有相同ID的$sum数组,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我收藏的两个文档如下所示: db.conversion.counters.aggregate({ $match: { "_id" : {"$gte" : 1046 , "$lte" : 2055} } $group: { cvchc: {$sum: "$counervalues.chcounter"} cvbsc: {$sum: "$counervalues.bscounter"} } }); 第一

我收藏的两个文档如下所示:

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

{
 "_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
 }
}
第二份文件

{
 "_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
 }
}
现在,我想应用聚合框架以获得一个新文档,其结果如下:

结果

{
 "_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匹配它们并添加它们


任何人都有想法吗?

运行以下聚合管道,应该会得到所需的结果:

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

您是如何在结果中获得
\u id
的?这不是前两个文档的总和。我很确定这在shell中是不可能的-您需要在应用程序中这样做。您可能可以编写自定义mapReduce函数,但同样,您也可以在应用程序中编写。@DavidGrinberg如果_id不相关,我会通过应用程序添加它。我使用shell只是为了更快地尝试。在我的应用程序中,我使用支持聚合框架的spring数据。我当然可以在我的应用程序中这样做,但通常在mongodb中你会得到大量的结果,我认为聚合框架会比在应用程序中迭代更快。我想问的真正问题是你的
$group
是否会将所有内容映射到一个
\u id
?因为在您的查询中,
$group
阶段没有定义
\u id
。不管怎样,很确定这在纯蒙哥是不可能的,看我的第二个comment@DavidGrinberg谢谢我认为mapReduce是聚合框架的先驱非常感谢,这正是我想要的。