我正在使用akka-http和ReactiveMongo编写Web服务。 我遇到了问题,我无法自己解决。
我有方法
def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]): Future[WriteResult] = {
collection.insert(route)
}
问题是WriteResult
除了错误或正常状态外,不包含任何有用的信息。
请您解释插入后如何获取插入的对象ID。
我发现的所有示例都与旧版本LastError
或Play!相关。框架。
答案 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
route.copy(id = Some(BSONObjectID.generate().stringify))
这种方法允许我同时获得WriteResult和保存的实体