2017-04-20 66 views
1

我的數據集:

{ 
    "codepostal": 84000, 
    "siren": 520010234, 
    "type": "home" 
}, 
{ 
    "codepostal": 84000, 
    "siren": 0, 
    "type": "home" 
}, 
{ 
    "codepostal": 84000, 
    "siren": 45, 
    "type": "appt" 
} ... 

我的管道(總爲整數):

var pipeline = [ 
     { 
      $match: { codepostal: 84000 } 
     }, 
     { 
      $group: { 
       _id: { type: "$type" }, 
       count: { $sum: 1 } 
      } 
     }, 
     { 
      $project: { 
       percentage: { $multiply: ["$count", 100/total] } 
      } 
     }, 
     { 
      $sort: { _id: 1 } 
     } 
    ]; 

結果:

[ { _id: { type: 'appt' }, percentage: 66 }, 
    { _id: { type: 'home' }, percentage: 34 } ] 

預期結果是當「警笛」設置爲0或其他數字時計數。

計數警笛= 0 =>部分
計數警笛!= 0 =>親

[ { _id: { type: 'appt' }, totalPercent: 66, proPercent: 20, partPercent: 80}, 
    { _id: { type: 'home' }, totalPercent: 34, proPercent: 45, partPercent: 55 } ] 

非常感謝您的幫助!

+0

嗨,你有什麼話,以獲得期望的結果試過這麼遠? – dgiugg

回答

1

根據siren字段的值,您可以使用$cond獲取專業/零件文檔的0或1。然後很容易計算總計爲每種類型的文件:

[ 
    { 
     $match: { codepostal: 84000 } 
    }, 
    { 
     $group: { 
      _id: { type: "$type" }, 
      count: { $sum: 1 }, 
      countPro: { $sum: {$cond: [{$eq:["$siren",0]}, 0, 1]} }, 
      countPart: {$sum: {$cond: [{$eq:["$siren",0]}, 1, 0]} } 
     } 
    }, 

    { 
     $project: { 
      totalPercent: { $multiply: ["$count", 100/total] }, 
      proPercent: { $multiply: ["$countPro", {$divide: [100, "$count"]}] }, 
      partPercent: { $multiply: ["$countPart", {$divide: [100, "$count"]}] } 
     } 
    }, 

    { 
     $sort: { _id: 1 } 
    } 
] 

請注意,我用$除法計算相對於不同類型的文檔組中的計數PRO /一部分比例。

爲了您的樣本文件(總= 3)輸出將是:

[ 
    { 
     "_id" : { "type" : "appt" }, 
     "totalPercent" : 33.3333333333333, 
     "proPercent" : 100, 
     "partPercent" : 0 
    }, 
    { 
     "_id" : { "type" : "home" }, 
     "totalPercent" : 66.6666666666667, 
     "proPercent" : 50, 
     "partPercent" : 50 
    } 
] 
+1

完美!非常感謝 ! –