2017-05-22 88 views
1

我需要做到以下幾點:組數據按類別和日期總按日期

  1. 集團按日期,然後upvotes和downvotes
  2. 集團按類別,然後聚集具有總數的總數通過每天upvotes所有類別和所有類別的downvote的給予好評的總數和向下個別日期的票來完成。

這裏是我的代碼:

db.collection.aggregate([{ 
           $unwind: '$votes' 
          }, { 
           $match: { 
            'category_id': array[i] 
           } 
          }, { 
           $group: { 
            _id:'$votes.date', 
            "category_id": { 
             $first: "$category_id" 
            }, 
            up_vote: { 
             $sum: { 
              $cond: [{ 
               '$gt': ['$votes.score', 0] 
              }, "$votes.score", 0] 
             } 
            }, 
            down_vote: { 
             $sum: { 
              $cond: [{ 
               '$lt': ['$votes.score', 0] 
              }, "$votes.score", 0] 
             } 
            } 
           } 
          }, { 
           "$group": { 
            "_id": "$_id", 
            "categories": { 
             "$push": { 
              "category_id": "$category_id", 
              "up_vote ": "$up_vote", 
              "down_vote": "$down_vote" 
             } 
            }, 
            "total_up_vote": { 
             $sum: { 
              $cond: [{ 
               '$lt': ['$votes.score', 0] 
              }, "$votes.score", 0] 
             } 
            }, 
            "total_down_vote": { 
             "$sum": "$down_vote" 
            } 
           } 
          }{ 
           "$unwind": "$categories" 
          }, 
          { 
           "$project": { 
            "category_id": "$categories.category_id", 
            "down_vote": "$categories.down_vote", 
            "down_vote_Percentage": { 
             "$multiply": [{ "$divide": [ "$categories.down_vote", "$total_down_vote" ] }, 
              100 
             ] 
            }, 
            "up_vote": "$categories.up_vote", 
            "up_vote_Percentage": { 
             "$multiply": [{ "$divide": [ "$categories.down_vote", "$total_total_up_vote" ] }, 
              100 
             ] 
            } 
           } 

          } 
          ], function(err, results) { 
     res.send(result) 
     }) 

這是我的數據庫結構:

"_id" : ObjectId("590f1ab8a45e6eb418be32cd"), 
     "category_id" : "singer", 
     "celebrity_id" : ObjectId("591e71884e743d8015fd1ae0"), 
     "user_id" : "591e81277bd0b65c141e64be", 
     "votes" : [ 
       { 
         "date" : "2017/4/7", 
         "score" : -1 
       }, 
       { 
         "date" : "2017/4/19", 
         "score" : -1 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("59204135dab356f410d1b8a6"), 
     "category_id" : "actor", 
     "celebrity_id" : ObjectId("591e80e47bd0b65c141e64bc"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : 1 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("5920415cdab356f410d1b8a7"), 
     "category_id" : "actor", 
     "celebrity_id" : ObjectId("591e81177bd0b65c141e64bd"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : 1 
       } 
     ] 
} 
+1

這是可怕的措辭,而不是呈現該太好。我想你指的是總在給定日期upvotes和每類downvotes的,和每個日總量的類別的百分比是多少? –

回答

2

你想是這樣的:

db.collection.aggregate([ 
    { "$unwind": "$votes" }, 
    { "$group": { 
    "_id": { 
     "date": "$votes.date", 
     "category_id": "$category_id", 
    }, 
    "upvote": { 
     "$sum": { 
     "$cond": [ { "$gt": [ "$votes.score", 0 ] }, 1, 0 ] 
     } 
    }, 
    "downvote": { 
     "$sum": { 
     "$cond": [ { "$lt": [ "$votes.score", 0 ] }, 1, 0 ] 
     } 
    } 
    }}, 
    { "$group": { 
    "_id": "$_id.date", 
    "categories": { 
     "$push": { 
     "category": "$_id.category_id", 
     "upvote": "$upvote", 
     "downvote": "$downvote" 
     } 
    }, 
    "total_upvote": { "$sum": "$upvote" }, 
    "total_downvote": { "$sum": "$downvote" } 
    }}, 
    { "$unwind": "$categories" }, 
    { "$project": { 
    "category": "$categories.category", 
    "upvote": "$categories.upvote", 
    "upvote_percent": { 
     "$multiply": [ 
     { "$divide": [ 
      "$categories.upvote", 
      { "$cond": [{ "$eq": [ "$total_upvote", 0 ]}, 1, "$total_upvote" ] } 
     ]}, 
     100 
     ] 
    }, 
    "downvote": "$categories.downvote", 
    "downvote_percent": { 
     "$multiply": [ 
     { "$divide": [ 
      "$categories.downvote", 
      { "$cond": [{ "$eq": [ "$total_downvote", 0 ]}, 1, "$total_downvote" ] } 
     ]}, 
     100 
     ] 
    } 
    }} 
]) 

記住,作爲一個「管道」,每個階段的文檔視圖等同於前一階段輸出文檔的方式。


源數據

{ 
     "_id" : ObjectId("590f1ab8a45e6eb418be32cd"), 
     "category_id" : "singer", 
     "celebrity_id" : ObjectId("591e71884e743d8015fd1ae0"), 
     "user_id" : "591e81277bd0b65c141e64be", 
     "votes" : [ 
       { 
         "date" : "2017/4/7", 
         "score" : -1 
       }, 
       { 
         "date" : "2017/4/19", 
         "score" : -1 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("59204135dab356f410d1b8a6"), 
     "category_id" : "actor", 
     "celebrity_id" : ObjectId("591e80e47bd0b65c141e64bc"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : 1 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("5920415cdab356f410d1b8a7"), 
     "category_id" : "actor", 
     "celebrity_id" : ObjectId("591e81177bd0b65c141e64bd"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : 1 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("5923c7fdbcc8728a67bcc653"), 
     "category_id" : "actor", 
     "celebrity_id" : ObjectId("591e81177bd0b65c141e64bd"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : -11 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("5923d1b9bcc8728a67bcc655"), 
     "category_id" : "blip", 
     "celebrity_id" : ObjectId("591e81177bd0b65c141e64bd"), 
     "user_id" : "591974b64abd73701dc7c4aa", 
     "votes" : [ 
       { 
         "date" : "2017/4/20", 
         "score" : -11 
       } 
     ] 
} 

輸出

{ 
     "_id" : "2017/4/19", 
     "category" : "singer", 
     "upvote" : 0, 
     "upvote_percent" : 0, 
     "downvote" : 1, 
     "downvote_percent" : 100 
} 
{ 
     "_id" : "2017/4/7", 
     "category" : "singer", 
     "upvote" : 0, 
     "upvote_percent" : 0, 
     "downvote" : 1, 
     "downvote_percent" : 100 
} 
{ 
     "_id" : "2017/4/20", 
     "category" : "blip", 
     "upvote" : 0, 
     "upvote_percent" : 0, 
     "downvote" : 1, 
     "downvote_percent" : 50 
} 
{ 
     "_id" : "2017/4/20", 
     "category" : "actor", 
     "upvote" : 2, 
     "upvote_percent" : 100, 
     "downvote" : 1, 
     "downvote_percent" : 50 
} 
+1

@Niel倫恩:upvote_percentage沒有返回。使整個響應顯示爲空,當我檢查,我來到沒有問題同total_upvote,如果我總down_vote更換那麼它顯示了一定的成效 – Bhrungarajni

+0

@ RakshithaT.R我在這裏發現了邏輯錯誤。有我的錯字,它確實需要是在百分比考慮當天的總票數。修正,並增加了一個簡短的樣本數據,並輸出 –

+0

我想個人總up_vote和down_vote不是總兩者都喜歡在你以前的代碼中提到:'total_upvote:{$金額:$給予好評}','total_downvote:{$總和: $ downvote}' – Bhrungarajni