mongoose aggregate:字段值和总结果的输出计数

时间:2016-12-10 21:39:50

标签: javascript node.js mongodb mongoose aggregation-framework

我希望输出类似于:[{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 } ]之类的投票类型的分离请帮助我达到最终所需的格式。

1 个答案:

答案 0 :(得分: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
}