使用 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 和保存的实体
我正在使用 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 和保存的实体