插入ReactiveMongo后获取ID

时间:2016-09-06 16:12:37

标签: scala reactivemongo

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

我有方法

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

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

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

2 个答案:

答案 0 :(得分:6)

这是ReactiveMongo制作的(相当常见的)设计选择。

建议的解决方案是使用BSONObjectID.generate自己提供ID,而不是让db为您创建一个。

以下是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)
  }
}

答案 1 :(得分:1)

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

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

我复制Route实体并在调用saveRoute

之前分配基因ID
route.copy(id = Some(BSONObjectID.generate().stringify))

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