0

出力を次のようにしたいとします。[{downVotes : 2}, {upvotes :3}, {totalReviews : 7}]合計レビューは$matchと一致しています。一部のユーザーは投票しません。mongoose aggregate:フィールド値の出力数と合計結果

レビューの1の例:

{ _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

私はちょうど私のデータに追加したレビューフィールドですが、あなたが必要とするカウントフィールドは** totalReviews **です。 –

+0

@jackblankフィールド 'reviewText'の存在によってカウントしたい場合は、この "reviewCount"を実行できます:{"$ sum":{"" $ cond ":[{" $ ifNull ":[" $ reviewText " false]}、1,0}} ' – RaR

関連する問題