Я пытаюсь внедрить систему оценки, и я изо всех сил пытаюсь разрешить только один рейтинг для каждого пользователя.Простой способ разрешить только один элемент для каждого пользователя в массиве схемы mongoose
Проще говоря, у меня есть массив оценок в моей схеме, содержащий «рейтер» и рейтинг, как таковой:
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
может быть альтернативой, однако мне не удалось использовать его для этого, поскольку это может позволить двум рейтингам с разными баллы от одного и того же пользователя.
Спасибо, это здорово. Гораздо лучше, чем мое предложение. – johnrapp