Я пишу общий метод обновления, чтобы упростить сохранение изменения класса case в mongodb. моя модель T
черта имеет следующую функцию:Удалить поле класса case перед сохранением в MongoDB
def update(id: BSONObjectID, t: T)(implicit writer: OFormat[T]): Future[WriteResult] = {
collection.update(Json.obj("_id" -> id), t)
}
, когда я звоню, он терпит неудачу со следующей ошибкой:
Caused by: reactivemongo.api.commands.UpdateWriteResult:
DatabaseException['The _id field cannot be changed from {_id: ObjectId('4ec58120cd6cad6afc000001')} to {_id: "4ec58120cd6cad6afc000001"}.' (code = 16837)]
который имеет смысл причина MongoDB не позволяет обновлять идентификатор документа даже несмотря на то, что он имеет такую же ценность.
Мне интересно, как я удалю _id из моего экземпляра case-класса, чтобы обновить его в mongodb. Я предполагаю, что я должен закодировать экземпляр, прежде чем он будет преобразован в BSON, но я не знаю, как это сделать. это мой пример случай класс:
case class User(
_id: BSONObjectID,
email: String
}
благодаря
Я предлагаю вам использовать 'findAndModify' вместо обновления. Удаление полей из классов case и построение новых классов с использованием отражения не выглядит хорошо (и не является потокобезопасным). – ipoteka
Вы можете предоставить пользовательскую запись, а не вывод идентификатора. – cchantep
У Mongo есть концепция 'upsert' (https://mongodb.github.io/casbah/tutorial.html#update), которая может пригодиться для вашего дела. – mfirry