在尝试使用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”之外的所有字段,这不是我想要在这里做的事情。