0

Я пишу общий метод обновления, чтобы упростить сохранение изменения класса 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 
} 

благодаря

+0

Я предлагаю вам использовать 'findAndModify' вместо обновления. Удаление полей из классов case и построение новых классов с использованием отражения не выглядит хорошо (и не является потокобезопасным). – ipoteka

+0

Вы можете предоставить пользовательскую запись, а не вывод идентификатора. – cchantep

+0

У Mongo есть концепция 'upsert' (https://mongodb.github.io/casbah/tutorial.html#update), которая может пригодиться для вашего дела. – mfirry

ответ

0

Я согласен с Ипотекой. Я бы использовал команду findAndModify из реактивного монго. Существует пример gist here, который должен помочь.