У меня есть коллекция вещей, каждая вещь имеет несколько пользовательских отзывов, и у каждого обзора есть числовой (1-5) рейтинг. Я хотел бы периодически запускать пакетное задание, которое будет вычислять средний рейтинг для каждой «вещи» на основе индивидуальных оценок в отзывах пользователей этой вещи, а затем снова сохранит «вещь» с этим новым рейтингом. Я бы хотел, чтобы это происходило на сервере без необходимости загружать и загружать каждый документ.
Другими словами, я ищу решение, которое будет перебирать все вещи в моей коллекции, суммировать оценки по отзывам пользователей, затем делить эту сумму на количество оценок (таким образом получая среднее значение) и сохранять это среднее свойство каждого документа.
Я пытался сначала подойти к этому с картой / уменьшением, что-то вроде:
function () {
var rating = 0;
for (var i = 0; i < this.Reviews.length; i++) {
rating += this.Reviews[i].Rating;
}
rating = rating / this.Reviews.length;
emit(this._id, rating);
}
function(key, values) {
return null;
}
Рейтинги, похоже, рассчитаны правильно, но я не смог вызвать db.things.update () внутри первой или второй функции. Я смог обновить рейтинги, используя полученную таблицу следующим образом:
db.reduced.find().forEach(function(thing) {
db.things.update({_id: thing._id},{$set:{Rating:thing.value}});
});
Но это решение на стороне клиента, которое неудовлетворительно ... Это не должно быть карта / уменьшение, но, вероятно, это путь?