2016-08-11 17 views
1

執行復雜查詢我想在這個模式進行查詢:如何在MongoDB中

{ 
    "name" : "xxx", 
    "guests" : [ 
     { 
      "category" : "category 1", 
      "arrived" : false 
     }, 
     { 
      "category" : "category 2", 
      "arrived" : false 
     }, 
     { 
      "category" : "category 1", 
      "arrived" : true 
     }, 
     { 
      "category" : "category 2", 
      "arrived" : true 
     } 
    ] 
} 

我想要得到某個名字,與客人的比例列表抵達各個類別。

對於上面的例子,我想收到的文件:

{ 
    name : "xxx", 
    results : [ 
     { 
       category : "category 1", 
       arrived : 50 (percent) 
     }, 
     { 
       category : "category 2", 
       arrived : 50 (percent) 
     }, 
    ] 

有沒有辦法用一個單一的MongoDB查詢做到這一點?另外,我應該在客戶端還是服務器端進行這種計算?

+0

解決,你應該做的計算,在一般情況下,複雜的計算應該在客戶端的MongoDB的完成應該是一個大的,愚蠢的數據存儲這確實幾乎沒有處理。它只是存儲和檢索數據。你應該尊重這個目標,儘量避免強迫MongoDB做任何可以在客戶端進行的計算,除非你願意承擔嚴重的性能處罰。即使是「平凡的」任務,例如尋找平均值或求和字段,通常也應該推送給客戶。 – chridam

回答

4

您可以使用聚合。這裏有一個例子:

[ 
    { 
     $match: {name:"xxx"} 
    }, 
    { 
     $unwind: "$guests" 
    }, 
    { 
     $group: { 
      _id:"$guests.category", 
      guests_arrived: { 
       $sum: { $cond: [ {$eq:["$guests.arrived",true]}, 1, 0 ] } 
      }, 
      guests_total: { 
       $sum: 1 
      } 
     } 
    }, 
    { 
     $project:{ 
      _id: false, 
      category: "$_id", 
      guests_arrived:true, 
      guests_total:true, 
      "percent": { 
       $multiply: [ 
        100, 
        {$divide: ["$guests_arrived","$guests_total"]} 
       ] 

      } 
     } 
    } 
] 

聚集流水線階段的說明使用:

$匹配,因爲你想要的結果只針對特定

$放鬆嘉賓數組,以便我們可以在下一階段對其成員執行聚合函數

$組類別以$總和總客人,誰已經抵達的客人數量 $電導率/ $ EQ用於評估抵達和只添加到guests_arrived if reached = true

$ project其主要目的是根據總值計算百分比,g uests_arrivedguests_total,從前一階段

+0

謝謝你做到了! 你能解釋一下你所做的工作嗎? – user1941348