1

在尝试使用scala和reactiveMongo插入mongoDB时,我正在尝试使用findAndUpdate来防止重复记录。

第一个函数接收一个文档并执行一个简单的插入查询,如果它失败并显示代码 11000(重复/唯一索引违规错误的代码),那么我正在调用它的 duplicateHandler 函数,如下所示:

  def duplicateHandler(item: Item): Future[Unit] = {
    collection.findAndUpdate(
      selector = Json.obj(
        "companyId" -> item.companyId,
        "documentId" -> item.docuemntId
        "status" -> "Deleted"
    ),
      update = item,
      fetchNewObject = true
    ) map { res =>
      res.result[Item] getOrElse (throw DuplicateException(Json.toJson(item.metadata).toString))
      ()
    } recover {
      case _ =>
        logger.error(s"DuplicateException for ${item.transactionId}")
        throw DuplicateException(Json.toJson(item.metadata).toString)
    }
  }

此代码完美运行,如果现有项目到达系统,并且其状态为“已删除”,则它将被函数接收的新项目覆盖。

但是,原始项目上存在一个字段,该字段标记它何时被删除(字段称为“dateDeleted”),新项目没有,我希望更新后的项目包含所有新字段+ “已删除”项目的原始字段。

我想使用类似的东西:

collection.findAndUpdate(
      selector = Json.obj(
        "companyId" -> item.companyId,
        "documentId" -> item.docuemntId
        "status" -> "Deleted"
    ),
      update = item.copy(dateDeleted = $dateDeleted),
      fetchNewObject = true
    )

其中 $dateDeleted 将是 findAndUpdate 查询中原始项目中字段的占位符。

我尝试为反应性 mongo 寻找这样的占位符,但没有找到类似的东西......

1 解决方案不是在 findAndUpdate 的“更新”参数上发送项目本身,但是我将不得不浏览除“dateDeleted”之外的所有字段,这不是我想要在这里做的事情。

4

0 回答 0