如何获得Mongoose / node的平均评分(具有对象数组的评级)

时间:2017-04-17 09:51:23

标签: node.js mongodb mongoose mongodb-query

我需要计算一篇文章的评分平均值,评分是在一个对象数组中

这是我的架构/模型:

module.exports = mongoose.model('Article', {
    title : String,
    text : String,
    star : { type: Number, default: 3.5}
    ...
});

var userSchema = mongoose.Schema({
     email        : String,
     password     : String,
     name         : String,
     rating       : {type : Array, default: []}
});
module.exports = mongoose.model('User', userSchema);

评级数组中的对象与{ "rate" : "X", "articleID" : "Y" }

类似

现在在这个功能中,我需要计算平均评分

function recalculateArticleRate(articleIDD) {
    console.log("Recalculate article rate");
    User.aggregate([
        { $match: { "rating.articleID" : articleIDD } },
        { $unwind: "$rating" },
        { $group : {_id : "$_id", avgRate : {  $avg : "$rating.rate" } } }
    ], function (err, result) {
        if (err) {
            console.log(err);
            return;
        }
        console.log(result);
    });
}

这是结果对象:

[ { _id: 58f519acfcb29003b572048b, avgRate: 3 },
{ _id: 58f5093159c45002f10ea7da, avgRate: 3 } ]

这样做我获得了所有用户评估的平均值,但我想要在rating.articleID = articleIDD时所有用户的平均评分。 我怎么能用Mongoose做到这一点?

1 个答案:

答案 0 :(得分:0)

function recalculateArticleRate(articleIDD) {
    User.aggregate([
        { $unwind: "$rating" },
        { $match: { "rating.articleID" : articleIDD } },
        { $group : {_id : null, avgRate : {  $avg : "$rating.rate" } } }
    ], function (err, result) {
        if (err) {
            console.log(err);
            return;
        }
    });
}

放开之前和_id = null(按照Veeram的建议)解决了我的问题!