【问题标题】:mongoose aggregate: output count of field value and total resultsmongoose 聚合:字段值和总结果的输出计数
【发布时间】:2017-04-26 02:57:27
【问题描述】:

我希望输出类似于:[{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 } ] 的东西,请帮助我获得最终所需的格式。

【问题讨论】:

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


    【解决方案1】:

    这里是一些虚拟数据的问题的解决方案。

    数据

    { “投票”:“否决”, “公司”:“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
    }
    

    【讨论】:

    • 我知道你是怎么做的,但我的数据没有评论字段。所以我想知道是否有不同的方法。
    • 我刚刚在数据中添加的评论字段,但是您需要在 totalReviews 中的计数字段。
    • @jackblank 如果你想通过字段'reviewText'的存在来计数,你可以这样做"reviewCount": { "$sum": { "$cond": [ { "$ifNull": ["$reviewText", false] }, 1, 0 ] }
    • 我认为 _id 字段将一直存在,因为每条评论都必须有一个 id,而 totalReviews 将是评论的计数。
    • @jackblank 然后你只需添加这个 "totalReviews":{ $sum : 1} 并且输出将是 { "_id" : "null", " downVotes" : 1, "upVotes" : 3, "totalReviews" : 4 }
    猜你喜欢
    • 2015-05-18
    • 1970-01-01
    • 2017-01-20
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多