2016-09-06 16 views
5

私はakka-httpとReactiveMongoでWebサービスを書いています。 私は自分で解決できない問題に直面しました。ReactiveMongoで挿入した後にIDを取得

私は方法

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

を持っている問題は、エラーまたはOK状態以外の任意の有用な情報をWriteResult含まれていないです。

挿入後にオブジェクトIDを挿入する方法を教えてください。 私が見つけたすべての例は、古いバージョンLastErrorまたはPlay!フレームワーク。

答えて

1

ReactiveMongoのドキュメントからの例です。

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

は、私はこのアプローチは非私はあなたがまだ持っている必要があり、この場合には両方、WriteResult、保存されたエンティティ

5

これは、ReactiveMongoが行った(かなり一般的な)デザインの選択です。

推奨する解決策は、BSONObjectID.generateを使用して自分でidを指定し、db createを使用するのではなく、

は、ここで私は保存方法からタプルを返すことで、IDや他の分野、あるいは全体のオブジェクトを取得するために管理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) 
    } 
} 
+0

を取得することができます前に、saveRoute

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

を呼び出すRouteエンティティをコピーして、genereted IDを割り当てIDを取得するために空の結果。 –

+0

@ green-creeperどういう意味ですか? –

+0

成功した場合、このオブジェクトを取得する 'DefaultWriteResult(ok = true、n = 1、writeErrors = List()、writeConcernError = None、code = None、errmsg = None)' ObjectIdは存在しない –

関連する問題