2017-12-01 4 views
0

を書いていないが、DBは、これは何回も呼ばれているにもかかわらず、作成されることは決してありません:MongoのScalaの非同期クライアントは、このコードを使用して新しいScalaの非同期ドライバとアップサートしようとして

override def insertOrUpdateOne(user: UserNew): Future[Unit] = { 
    users.replaceOne(equal("_id", user._id), user) 
    .toFuture 
    .map(_ =>()) 
} 

のmongoクライアントは罰金作成し、コレクションを作成します実際にはdbは作成されません(最初の書き込みで発生するはずです)。私は、casbahを使用し、同期的に動作している他のコードを持っています。

usersは、私からの構文的な砂糖のないモンゴーのコレクションです。

toFutureサブスクリプション(書き込みをトリガーする必要がありますか?)が、まだ動作しません。私はいくつかのコレクションをカスバと混同しています.1つは非同期クライアントに、もう1つは非同期で動作します。

アイデア?

+0

'insertOrUpdateOne'メソッドはどのように呼び出されていますか?未来は別のスレッドが作成されたときに非同期で実行され始めます。新しいレコードにアクセスする前に未来が完了するのを待っていますか? –

+0

私はそれを作成して行く '未来'を待つことはありません。 'insertOrUpdate'の後に何もする必要はありません。同期の一貫性は必要ありません。私が 'findOne'を実行すると、' .map'で処理して、実際に取得されたデータが返ってくると処理するので、非同期でも処理します。これは、writeが決して引き起こされないこと、そしてObservableとサブスクリプション( 'toFuture' afaikによって処理されるはずです)を直接使用しているわけではないので、私は何がトリガーされるのか不思議です。私が 'replaceOne'を実行するとき、私はそれを待つ必要がなくても起こることを期待しています。 – pferrel

+0

ああ、でも@Chris Cあなたが書き込みが起こらないことをどのように知っているかを尋ねるなら、私はシェルを使用します。 – pferrel

答えて

0

それは、ドキュメント内

override def insertOrUpdateOne(user: UserNew): Future[Unit] = { 
    users.replaceOne(equal("_id", user._id), user, UpdateOptions().upsert(true)) 
    .toFuture 
    .map(_ =>()) 
} 

何もないはずですが、私は、コードを読んだとき、私はfalseにアップサートそれをデフォルト設定を参照してください。

これにより、Observablesubscribeのものとコールバックの設定をすべて無視できます。 Scalaの慣用句で結果を処理するだけsomeFuture.map()これは、UsersDao非Mongo固有のコードをインタフェースにします。これにより、UsersDaoImplのすべてのコードでMongo固有のものを扱うことができ、Implを注入できるようになり、実行時の選択を約Implにすることができます。 Mongoは、依存コードを気にすることなく、あるいはImplについて知っていなくても置き換えることができます。

関連する問題