ReactiveMongo Extensions: массовое обновление с использованием реактивных монго-расширений

Есть ли способ обновить массовые записи. Я пытаюсь обновить объект пользователя, используя следующий код:

.update($doc("_id" $in (usersIds: _*)), users, GetLastError(), false , true)

В приведенном выше коде я прохожу, users Список. в список пользователей я также добавляю новые свойства и изменяю состояние существующих свойств, но с этим утверждением записи не обновляются

Если я использую следующий код:

.update($doc("_id" $in (usersIds: _*)), $set("inviteStatus" $eq "Invited"), GetLastError(), false , true)

Запись успешно обновлена.

1 ответ

Из моего прочтения API, а также других ответов в этой области я не думаю, что такое массовое обновление, которое вы ищете, возможно через update метод.

Однако вы могли бы выполнить команду Raw (кредит: этот ответ), которая, если вы достаточно терпеливы, чтобы написать все $set выражения, безусловно, будет работать, и будет более эффективным, чем выполнение цикла на стороне клиента save() операции по одной:

Внимание: компилируется, но не проверено:

import reactivemongo.api.DB
import reactivemongo.bson._
import reactivemongo.core.commands.RawCommand

class BulkUpdater(db:DB) {

  def bulkUpdateUsers(users:List[User]) = {

    def singleUpdate(u:User) = BSONDocument (
      ("q" -> BSONDocument("_id" -> u._id)),
      ("u" -> BSONDocument("$set" -> BSONDocument(
        "firstName" -> u.firstName, 
        "secondName" -> u.secondName) // etc
    )))

  val commandBson = BSONDocument(
    "update" -> "users",
    "updates" -> BSONArray(users.map(singleUpdate)),
    "ordered" -> false,
    "writeConcern" -> BSONDocument( "w" -> "majority", "wtimeout" -> 5000)
  )

  db.command(RawCommand(commandBson))
}
Другие вопросы по тегам