2016-03-09 79 views
3

我有一組文檔,其中包含不同項目的反饋列表。它看起來是這樣的:MongoDB:計算每個不同值有多少個?

{ 
    { 
    item: "item_1" 
    rating: "neutral" 
    comment: "some comment" 
    }, 
    { 
    item: "item_2" 
    rating: "good" 
    comment: "some comment" 
    }, 
    { 
    item: "item_1" 
    rating: "good" 
    comment: "some comment" 
    }, 
    { 
    item: "item_1" 
    rating: "bad" 
    comment: "some comment" 
    }, 
    { 
    item: "item_3" 
    rating: "good" 
    comment: "some comment" 
    }, 
} 

我想一個辦法,找出每個項目多少不同的等級得到。

所以輸出應該是這個樣子:

{ 
    { 
    item: "item_1" 
    good: 12 
    neutral: 10 
    bad: 67 
    }, 
    { 
    item: "item_2" 
    good: 2 
    neutral: 45 
    bad: 8 
    }, 
    { 
    item: "item_3" 
    good: 1 
    neutral: 31 
    bad: 10 
    } 

} 

這是我做了什麼

db.collection(collectionName).aggregate(
      [ 
      { 
       $group: 
       { 
        _id: "$item", 
        good_count: {$sum: {$eq: ["$rating", "Good"]}}, 
        neutral_count:{$sum: {$eq: ["$rating", "Neutral"]}}, 
        bad_count:{$sum: {$eq: ["$rating", "Bad"]}}, 
       } 
      } 
      ] 
) 

輸出的格式看起來正確的,但計數始終爲0 。

我想知道什麼是通過查看相同字段的不同值來總結事情的正確方法?

謝謝!

回答

1

你非常接近,但當然$eq剛剛返回true/false值,所以要作出這樣的數字,你需要$cond

db.collection(collectionName).aggregate([ 
    { "$group" : { 
     "_id": "$item", 
     "good_count": { 
      "$sum": { 
       "$cond": [ { "$eq": [ "$rating", "good" ] }, 1, 0] 
      } 
     }, 
     "neutral_count":{ 
      "$sum": { 
       "$cond": [ { "$eq": [ "$rating", "neutral" ] }, 1, 0 ] 
      } 
     }, 
     "bad_count": { 
      "$sum": { 
       "$cond": [ { "$eq": [ "$rating", "bad" ] }, 1, 0 ] 
      } 
     } 
    }} 
]) 

作爲「三元」運算符$cond需要一個邏輯條件,因爲它是第一個參數(IF),然後返回,其中評估是true(然後)第二個參數或第三個參數,其中false(否則)。這使得true/false分別返回到10以分別饋送到$sum

另外請注意,「案例」是$eq敏感。如果你已經varing情況,那麼你可能要在表達式$toLower

   "$cond": [ { "$eq": [ { "$toLower": "$rating" }, "bad" ] }, 1, 0 ] 

在一個稍微不同的說明,下面聚集通常是更加靈活,不同的可能值和運行周圍條件求和環而言性能:

db.collection(collectionName).aggregate([ 
    { "$group": { 
     "_id": { 
      "item": "$item", 
      "rating": { "$toLower": "$rating" } 
     }, 
     "count": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id.item", 
     "results": { 
      "$push": { 
       "rating": "$_id.rating", 
       "count": "$count" 
      } 
     } 
    }} 
]) 

這反而會給予輸出是這樣的:

{ 
    "_id": "item_1" 
    "results":[ 
     { "rating": "good", "count": 12 }, 
     { "rating": "neutral", "count": 10 } 
     { "rating": "bad", "count": 67 } 
    ] 
} 

這些信息都是相同的,但是您不必明確地匹配這些值,而且它的執行速度要快得多。

相關問題