2016-12-10 123 views
0

我想要輸出類似於:[{downVotes : 2}, {upvotes :3}, {totalReviews : 7}]總評論是匹配$match的評論。有些用戶不投票。貓鼬聚合:字段值和總結果的輸出計數

的評論之一的例子:

{ _id: 584b5d633ac18451ddc4b2c6, 
    companyName: 'napacabs.com', 
    shortId: 'B1MrpR_Qe', 
    updatedAt: Sat Dec 10 2016 16:18:29 GMT-0500 (Eastern Standard Time), 
    anonId: 584b5d39f371067019df86e9, 
    myUpdate: Fri Dec 09 2016 20:43:50 GMT-0500 (Eastern Standard Time), 
    statements: [ [Object], [Object] ], 
    vote: 'down', 
    reviewText: 'Another B1MrpR_Qe', 
    __v: 0, 
    createdAt: Fri Dec 09 2016 20:41:50 GMT-0500 (Eastern Standard Time), 
    usefulness: { useful: [], useless: [] }, 
    usefulnessResults: { useful: 0, useless: 0 }, 
    createdString: 'Fr, December 9th 16, 8:41:50 pm', 
    momented: '20 hours ago', 
    updatedString: 'Sa, December 10th 16, 4:18:20 pm' } 

可能有7條。投票字段值根據用戶如何投票而變化。

我能夠通過投票進行分組,但我不知道如何在不依賴投票值的情況下獲得總評價。

另外我想在語句字段上做一些其他聚合,例如從對象和聚合中獲取值。所以我需要了解如何返回並進行其他聚合步驟,而不是將其全部歸爲更少的元素。

var sendDataToReviewForPage = function(nameOfCompany){ 
    return Review.aggregate([ 
      {$match : {companyName : nameOfCompany}}, 
      // {$unwind : "$createdString"}, 
      {$group : {_id : "$vote", type : {$push : "$vote"}}}, 
      {$project : {size : { $size : "$type" }}} 
    ]); 
}; 

我知道上面的代碼不產生我想要的結果,但我得到了投票類型的分離我有類似[ { _id: 'down', size: 1 }, { _id: 'up', size: 1 } ]請幫我最終想要的格式。

回答

0

這裏是你的問題的解決方案與一些虛擬數據。

數據

{ 「票」: 「下」, 「公司」: 「ABC」, 「檢討」:1 } { 「票」: 「下」, 「檢討」:2, 「公司」: 「XYZ」 } { 「票」: 「上」, 「檢討」:3, 「公司」: 「XYZ」 } { 「票」 : 「向上」, 「檢討」:5, 「公司」: 「ABC」 } { 「票」: 「上」, 「檢討」:5, 「公司」: 「ABC」 } { 「票」: 「上」, 「檢討」:5, 「公司」: 「ABC」 } { 「票」: 「下」, 「檢討」:5, 「公司」 :「xyz」 }

以下是我的查詢以返回您的預期輸出。

db.getCollection('votes').aggregate([ 
    {$match : { "company" : "abc"}}, 
    { 
     $group :{ 
      _id : "null", 
      "downVotes" : { $sum : { $cond : [ { $eq : ["$votes" , "down"] }, 1 ,0 ] } }, 
      "upVotes" : { $sum : { $cond : [ { $eq : ["$votes" , "up"] }, 1 ,0 ] } }, 
      "totalReviews":{ $sum : "$review"}    
     } 
    } 
]) 

上述查詢的輸出是:

{ 
    "_id" : "null", 
    "downVotes" : 1, 
    "upVotes" : 3, 
    "totalReviews" : 16 
} 
+0

我看你怎麼做,但我的數據沒有評論欄。所以我想知道是否有不同的方式。 –

+0

我剛剛在我的數據中添加了review field,但在totalReviews **中需要哪些字段。 –

+0

@jackblank如果你想通過字段'reviewText'的存在來計算,你可以這樣做''reviewCount':{「$ sum」:{「$ cond」:[{「$ ifNull」:[「$ reviewText」, }},1,0]}' – RaR