Nie jestem ekspertem w mongoDB ani w ReactiveMongo, ale wygląda na to, że próbujesz używać bazy danych NoSQL w taki sam sposób, jak używasz standardowych baz SQL. Należy zauważyć, że mongoDB jest asynchroniczna, co oznacza, że operacje mogą być wykonywane w przyszłości, dlatego operacje wstawiania/aktualizacji nie zwracają dokumentów, których dotyczy problem. Jeśli chodzi o Twoje pytania:
Powinieneś prawdopodobnie spojrzeć na mongoDB db.collection.update()
i wywołaj ją za pomocą upsert
parametr jako prawdziwy. Jeśli możesz sobie na to pozwolić, zaktualizuje dokumenty, jeśli już istnieją w bazie danych, lub wstawi je w inny sposób. Ponownie, ta operacja nie zwraca dokumentów, których dotyczy problem, ale możesz sprawdzić, ile dokumentów zostało dotkniętych, otwierając ostatni błąd
. Zobacz reactivemongo.api.collections.GenericCollection#update który zwraca Future[LastError]
.
Ponownie wstawione/zaktualizowane dokumenty nie będą zwracane. Jeśli naprawdę musisz zwrócić cały dokument, którego dotyczy problem, musisz wykonać kolejne zapytanie, aby pobrać pasujące dokumenty.
Prawdopodobnie przepisałbym twój kod w ten sposób (bez obsługi błędów/awarii):
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!")
}
}
}
)
}
Zobacz także Kontrakty terminowe Scala:http://docs.scala-lang.org/ przeglądy/core/futures.html
To jest naprawdę przydatne!;)