Может ли MongoDB выполнить одну и ту же операцию для многих документов, не запрашивая каждый? - PullRequest
2 голосов
/ 01 февраля 2012

Я ищу способ обновить каждый документ в коллекции под названием "posts".

Посты периодически обновляются с популярностью (популярностью по всему сайту) и силой (предполагаемой релевантностью для конкретного пользователя), каждая из разных источников. Что мне нужно сделать, это умножить популярность и силу каждого поста, чтобы получить третье поле, релевантность. Релевантность используется для сортировки сообщений.

class Post
  include Mongoid::Document

  field :popularity
  field :strength
  field :relevance
  ...

Текущая реализация выглядит следующим образом:

1) Я отображаю / сокращаю до отдельной коллекции, в которой хранится идентификатор сообщения и вычисленная релевантность.

2) Я обновляю каждый пост отдельно с карты, уменьшаю результаты.

Это огромное количество отдельных запросов на обновление, и кажется глупым сопоставлять каждое сообщение с его собственным результатом (1-к-1) только для повторного обновления сообщения. Можно ли умножить на месте или сделать какую-то карту на месте?

1 Ответ

0 голосов
/ 01 февраля 2012

Можно ли умножить на месте или сделать какую-то карту на месте?

Нет.

Идеальным вариантом здесь будет иметь карту/ Уменьшить обновление сообщения непосредственно после его завершения.К сожалению, M / R не имеет такой возможности.Теоретически, вы могли бы выпускать обновления со стадии «финализации», но это приведет к краху в изолированной среде.

Однако, если все, что вы делаете, - это простое умножение, тогда вам не нужно M /R вообще.Вы можете просто запустить большой цикл for или подключить событие save для обновления :relevance при обновлении :popularity или :strength.

MongoDB не имеет триггеров,поэтому он не может сделать это автоматически.Но вы используете бизнес-уровень, который является точным местом для размещения такой логики.

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