2017-04-17 31 views
0

我需要計算一個物品的等級平均,並且評級是對象如何讓貓鼬/節點評級平均值(隨着評級對象的數組)

這裏的數組是我的架構/模型:

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" }

現在,在這個函數I需要計算評級平均

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 } ] 

這樣做,我得到的所有用戶evalutation的平均水平,但我希望所有用戶在rating.articleID = articleIDD的評分的平均值。 我如何用貓鼬做到這一點?

+1

[MongoDB - 計算對象的嵌套數組屬性的平均值]的可能重複(http://stackoverflow.com/questions/34159487/mongodb-calculating-average-of-nested-array-of-objects-attributes) – Veeram

+0

用'{$ group:{_id:null,avgRate:{$ avg:「$ rating.rate」}}}替換您的小組賽段。 – Veeram

回答

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推薦)解決了我的問題!