Как выполнить пакетное обновление документов на сервере в MongoDB, используя рассчитанные значения? - PullRequest
3 голосов
/ 16 мая 2011

У меня есть коллекция вещей, каждая вещь имеет несколько пользовательских отзывов, и у каждого обзора есть числовой (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}});
});

Но это решение на стороне клиента, которое неудовлетворительно ... Это не должно быть карта / уменьшение, но, вероятно, это путь?

1 Ответ

1 голос
/ 14 июня 2011

Используйте db.eval (your_JS_code_here).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...