【发布时间】:2015-02-15 10:36:24
【问题描述】:
我正在尝试实施评分系统,但我正在努力以合理的方式只允许每个用户进行一次评分。
简单地说,我的架构中有一个评分数组,包含“评分者”和评分,如下所示:
var schema = new Schema({
//...
ratings: [{
by: {
type: Schema.Types.ObjectId
},
rating: {
type: Number,
min: 1,
max: 5,
validate: ratingValidator
}
}],
//...
});
var Model = mongoose.model('Model', schema);
当我收到请求时,如果用户尚未对该文档进行投票,我希望将用户评分添加到数组中,否则我希望更新评分(您不能给出多个评分)
一种方法是找到文档,“循环”评级数组并搜索用户。如果用户已经在数组中获得了评分,则更改评分,否则推送新评分。因此:
Model.findById(id)
.select('ratings')
.exec(function(err, doc) {
if(err) return next(err);
if(doc) {
var rated = false;
var ratings = doc.ratings;
for(var i = 0; i < ratings.length; i++) {
if(ratings[i].by === user.id) {
ratings[i].rating = rating;
rated = true;
break;
}
}
if(!rated) {
ratings.push({
by: user.id,
rating: rating
});
}
doc.markModified('ratings');
doc.save();
} else {
//Not found
}
});
有没有更简单的方法?让 mongodb 自动执行此操作的方法?
mongodb $addToSet 运算符可能是一个替代方案,但是我没有设法将其用于此目的,因为这可能允许来自同一用户的两个具有不同分数的评分。
【问题讨论】:
标签: node.js mongodb mongoose mongodb-query