2015-11-27 145 views
1

我收藏的這兩份文件是這樣的:

頭文件

{ 
"_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匹配attributionvalues和添加。

任何人有想法?

+0

你怎麼會在結果中的'_id'?這不是前兩個文件的總和。 –

+0

我很確定這在shell中是不可能的 - 你需要在你的應用程序中執行它。你也許可以編寫一個自定義的mapReduce函數,但是你也可以在你的應用程序中執行它。 –

+0

@DavidGrinberg _id無關緊要,我會通過我的應用程序添加它。我只使用shell來更快地嘗試一下。在我的應用程序中,我使用支持聚合框架的spring數據。我當然可以在我的應用程序中做到這一點,但通常在MongoDB中您會得到大量的結果,我認爲聚合框架將比在應用程序中迭代它們更快。 –

回答

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

非常感謝你,那正是我所期待的。 –