在存储到 MongoDB 之前删除案例类字段

Posted

技术标签:

【中文标题】在存储到 MongoDB 之前删除案例类字段【英文标题】:Remove case class field before storing to MongoDB 【发布时间】:2015-07-11 09:55:06 【问题描述】:

我正在编写一个通用更新方法来简化将案例类更改保存到 mongodb。我的模型T trait 具有以下功能:

  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,即使它的值相同。

我想知道如何从我的案例类实例中删除 _id 以在 mongodb 中更新它。我想我必须在将实例转换为 BSON 之前对其进行元组处理,但我不知道该怎么做。这是我的示例案例类:

case class User(
  _id: BSONObjectID,
  email: String

谢谢

【问题讨论】:

我建议你使用findAndModify而不是更新。从案例类中删除字段并使用反射构建新类看起来不太好(而且不是线程安全的)。 您可以提供自定义写入,而不是输出 ID。 Mongo 有 upsert (mongodb.github.io/casbah/tutorial.html#update) 的概念,这对您的情况可能会派上用场。 【参考方案1】:

我同意ipoteka。我会使用响应式 mongo 中的 findAndModify 命令。有一个示例要点here 应该有所帮助。

【讨论】:

以上是关于在存储到 MongoDB 之前删除案例类字段的主要内容,如果未能解决你的问题,请参考以下文章

数据库mongodb和mysql的对比

将数组中对象的字段添加到同一数组中对象的另一个字段MongoDB

Mongodb一览

MongoDB入门学习

全网最全95道MongoDB面试题1万字详细解析

Data Base mongodb高版本与低版本的区别