私はmongoDBの専門家でもReactiveMongoの専門家でもありませんが、標準のSQLデータベースを使用するのと同じ方法でNoSQLデータベースを使用しようとしているようです。 mongoDBは非同期であることに注意してください。これは、操作が将来実行される可能性があることを意味します。これが、挿入/更新操作が影響を受けるドキュメントを返さない理由です。あなたの質問について:
おそらくmongoDBupsert
で呼び出します パラメータは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
これは本当に便利です!;)