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))
}