Non sono un esperto di mongoDB né di ReactiveMongo, ma sembra che tu stia cercando di utilizzare un database NoSQL nello stesso modo in cui useresti i database SQL standard. Nota che mongoDB è asincrono, il che significa che le operazioni potrebbero essere eseguite in futuro, ecco perché le operazioni di inserimento/aggiornamento non restituiscono i documenti interessati. Per quanto riguarda le tue domande:
Probabilmente dovresti dare un'occhiata a mongoDB db.collection.update()
metodo e chiamalo con il upsert
parametro come vero. Se te lo puoi permettere, questo aggiornerà i documenti se esistono già nel database o li inserirà in altro modo. Anche in questo caso, questa operazione non restituisce i documenti interessati ma è possibile verificare quanti documenti sono stati interessati accedendo a ultimo errore
. Vedi reactivemongo.api.collections.GenericCollection#update che restituisce un Future[LastError]
.
Anche in questo caso i documenti inseriti/aggiornati non verranno restituiti. Se hai davvero bisogno di restituire l'intero documento interessato, dovrai fare un'altra query per recuperare i documenti corrispondenti.
Probabilmente riscriverei il tuo codice in questo modo (senza errori/gestione degli errori):
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!")
}
}
}
)
}
Vedi anche Scala Futures:http://docs.scala-lang.org/ panoramiche/core/futures.html
Questo è davvero utile!;)