2015-10-29 100 views
1

我有這樣的文件:

{ 
    "platform":"android", 
    "install_date":20151029 
} 
  1. 平臺 - 可以從一個值的android | IOS |點燃| Facebook的。
  2. INSTALL_DATE - 有許多install_dates

也有許多領域。

目標:我正在計算每個平臺在特定日期的安裝次數。

所以我使用group by在聚合框架中,並通過平臺進行計數。文件應該像這樣的:

{ 
    "install_date":20151029, 
    "platform" : { 
    "android":1000, 
    "ios": 2000, 
    "facebook":1500 
    } 
} 

我有這樣做:

db.collection.aggregate([ 
    { 
     $group: { 
      _id: { platform: "$platform",install_date:"$install_date"}, 
      count: { "$sum": 1 } 
     } 
    }, 
    { 
     $group: { 
      _id: { install_date:"$_id.install_date"}, 
      platform: { $push : {platform :"$_id.platform", count:"$count" } } 
     } 
    }, 
    { 
    $project : { _id: 0, install_date: "$_id.install_date", platform: 1 } 
    }  
]) 

這給像文件:

{ 
    "platform": [ 
     { 
      "platform": "facebook", 
      "count": 1500 
     }, 
     { 
      "platform": "ios", 
      "count": 2000 
     }, 
     { 
      "platform": "android", 
      "count": 1000 
     } 
    ], 
    "install_date": 20151027 
} 

問題:

投影陣列單對象作爲「平臺」的$cond運營商在$group管道步驟評估基於平臺字段值計數的

+0

你是說你有一個「串」斜線'/'separateed?還是這些「平臺」字段的可能值?這是一種非常不尋常的方式。其次,「零」數據的基本問題在這之前已經被問過很多次了,所以你看了?您不應該試圖使數據庫返回不存在的信息。請在此處明確結果目標。我知道你要求每個日期的所有平臺,但是究竟有多少日期,以及最終目的是什麼。所有這些都可以更容易地呈現出正確的響應。 –

+0

@BlakesSeven:這些都是可能的值。有許多日期。它應該按日期進行分組並在該日期安裝設備。 –

回答

1

佔據優勢,像下面這樣:

db.collection.aggregate([  
    { 
     "$group": { 
      "_id": "$install_date",    
      "android_count": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$platform", "android" ] }, 1, 0 ] 
       } 
      }, 
      "ios_count": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$platform", "ios" ] }, 1, 0 ] 
       } 
      }, 
      "facebook_count": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$platform", "facebook" ] }, 1, 0 ] 
       } 
      }, 
      "kindle_count": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$platform", "kindle" ] }, 1, 0 ] 
       } 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, "install_date": "$_id",    
      "platform": { 
       "android": "$android_count", 
       "ios": "$ios_count", 
       "facebook": "$facebook_count", 
       "kindle": "$kindle_count" 
      } 
     } 
    } 
]) 

在上面,$cond接受邏輯條件作爲第一個參數(if),然後返回評估爲true的第二個參數(then)或第三個參數,其中false(else)。這使真/假返回到1和0分別送入$sum

因此,舉例來說,如果{ "$eq": [ "$platform", "facebook" ] },爲真,那麼表達式會{ $sum: 1 }否則將{ $sum: 0 }

+1

是的。這工作。 :) –

+0

1,0在每個條件結束時做了什麼? –

+0

'$ cond'因爲是第一個參數'(if)'而採用邏輯條件,然後返回評估爲true的第二個參數(then)或第三個參數爲false(else)。這使真/假返回到1和0分別饋送到'$ sum'。例如,如果'{「$ eq」:[「$ platform」,「facebook」]},'爲true,那麼表達式將計算爲'{$ sum:1}',否則它將是'{$ sum: 0}' – chridam