使用 ReactiveMongo 插入后获取 ID

Get ID after insert with ReactiveMongo

我正在使用 akka-http 和 ReactiveMongo 编写 Web 服务。 我遇到了我自己无法解决的问题。

我有办法

 def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]): Future[WriteResult] = {
    collection.insert(route)
  }

问题是 WriteResult 除了错误或 OK 状态外,不包含任何有用的信息。

能否请您解释一下如何在插入后获取插入的对象 ID。 我发现的所有示例都与 LastError 或 Play 的旧版本相关!框架。

这是 ReactiveMongo 做出的(相当普遍的)设计选择。

推荐的解决方案是使用 BSONObjectID.generate 自己提供一个 ID,而不是让数据库为您创建一个。

这是 ReactiveMongo 文档中的示例 http://reactivemongo.org/releases/0.11/documentation/tutorial/write-documents.html

val id = BSONObjectID.generate
val person = Person(
  id,
  "Stephane",
  "Godbillon",
  29)

val future = collection.insert(person)

future.onComplete {
  case Failure(e) => throw e
  case Success(lastError) => {
    println(s"successfully inserted document with id $id)
  }
}

我设法通过从保存方法返回元组来获取 ID 或任何其他字段,甚至整个对象。

def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]) = {
    collection.insert(route).map((_, route))
  }

我复制 Route 实体并在调用前分配生成的 ID saveRoute

route.copy(id = Some(BSONObjectID.generate().stringify))

这种方法允许我同时获得 WriteResult 和保存的实体