sql >> データベース >  >> NoSQL >> MongoDB

play2アプリケーションでネストされたreactivemongo呼び出しをどのように構成する必要がありますか?

    私はmongoDBの専門家でもReactiveMongoの専門家でもありませんが、標準のSQLデータベースを使用するのと同じ方法でNoSQLデータベースを使用しようとしているようです。 mongoDBは非同期であることに注意してください。これは、操作が将来実行される可能性があることを意味します。これが、挿入/更新操作が影響を受けるドキュメントを返さない理由です。あなたの質問について:

    おそらくmongoDB db.collection.update()を確認する必要があります。 メソッドを作成し、upsertで呼び出します パラメータはtrueです。余裕があれば、データベースにすでに存在する場合はドキュメントを更新するか、そうでない場合は挿入します。この場合も、この操作では影響を受けるドキュメントは返されませんが、最後のエラー reactivemongo.api.collections.GenericCollection#update<を参照してください。 / a> Future[LastError]を返します 。

    繰り返しになりますが、挿入/更新されたドキュメントは返されません。影響を受けたドキュメント全体を本当に返す必要がある場合は、一致するドキュメントを取得するために別のクエリを実行する必要があります。

    私はおそらくあなたのコードをこのように書き直します(エラー/失敗の処理なしで):

    def dostuff() = Action {
        implicit request =>
            form.bindFromRequest.fold(
                errors => BadRequest(views.html.invite(errors)),
                form => {
                    val objectsReadyForSave = createObjects(form.companyId, form.companyName, sms_pattern.findAllIn(form.phoneNumbers).toSet)
                    Async {
                        val operations = for {
                            data <- objectsReadyForSave
                        } yield collection.update(BSONDocument("cId" -> data.cId.get, "userId" -> data.userId.get), data, upsert = true)
    
                        Future.sequence(operations).map {
                            lastErrors =>
                                Ok("Documents probably inserted/updated!")
                        }
                    }
                }
            )
    }
    

    Scala Futuresも参照してください: http://docs.scala-lang.org/ Overviews / core / futures.html

    これは本当に便利です!;)



    1. Mongo Javaドライバーを使用したDB.eval()

    2. MongoDBシェルとサーバーが一致しません

    3. mongodbのバックアップは自動的に作成されますか?

    4. $groupステージの後に指定せずにすべてのフィールドを返す方法