2016-07-14 85 views
1

我有一個包含字段"votes": [{id: "bob", vote: "yes"}, id: "mary", vote: "no"}]的文檔的集合。我想,爲每個人的id,他們出現在多少個文件與投票yes按嵌入字段分組並計數

我到目前爲止試過的是這個,但它沒有正確的工作;取而代之的是,除了ID之外,它似乎是按票數分組的。

db.votecol.aggregate([ 
    {"$group": {"_id": {"id": "$votes.id"}, "voteCount": {"$sum": 1}}} 
]) 

回答

3

您需要首先使用$unwind操作時,它是在一個列表數據領域的應用,因爲它會爲每個上放鬆列表數據字段的每一個元素的新紀錄和應用。它基本上使數據平整,以便您可以將其作爲上一個管道中的單個文檔進行處理。

db.votecol.aggregate([ 
    { "$unwind": "$votes" }, 
    { 
     "$group": { 
      "_id": "$votes.id", 
      "voteCount": { "$sum": 1 } 
     } 
    } 
]) 

由於更新了自己的後續問題,您可以篩選要通過管道的文件來計算所「是」或「否」使用$match操作之前投票並在$unwind之後。對於獎勵積分,您可以使用$cond運營商在$group管道一步來評估基於嵌入式表決字段值計數的優勢:

db.votecol.aggregate([ 
    { "$match": { "votes.vote": { "$in": ["yes", "no"] } } }, 
    { "$unwind": "$votes" }, 
    { "$match": { "votes.vote": { "$in": ["yes", "no"] } } }, 
    { 
     "$group": { 
      "_id": "$votes.id", 
      "voteCount": { "$sum": 1 }, 
      "yesCount": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$votes.vote", "yes" ] }, 1, 0 ] 
       } 
      }, 
      "noCount": { 
       "$sum": { 
        "$cond": [ { "$eq": [ "$votes.vote", "no" ] }, 1, 0 ] 
       } 
      } 
     } 
    } 
]) 
+0

是否有可能使這個只能算票是是「是」還是「否」,但沒有其他任何東西? – Hatshepsut

+1

@哈特謝普蘇確實,請參閱上面的編輯。 – chridam

+0

放鬆之前和之後的比賽有什麼區別? – Hatshepsut