Je ne suis pas un expert en mongoDB ni en ReactiveMongo mais il semble que vous essayez d'utiliser une base de données NoSQL de la même manière que vous utiliseriez des bases de données SQL standard. Notez que mongoDB est asynchrone, ce qui signifie que des opérations peuvent être exécutées dans le futur, c'est pourquoi les opérations d'insertion/mise à jour ne renvoient pas les documents concernés. Concernant vos questions :
Vous devriez probablement regarder mongoDB db.collection.update()
méthode et appelez-la avec le upsert
paramètre comme vrai. Si vous pouvez vous le permettre, cela mettra à jour les documents s'ils existent déjà dans la base de données ou les insérera autrement. Encore une fois, cette opération ne renvoie pas les documents concernés mais vous pouvez vérifier combien de documents ont été affectés en accédant au dernière erreur
. Voir reactivemongo.api.collections.GenericCollection#update qui renvoie un Future[LastError]
.
Encore une fois, les documents insérés/mis à jour ne seront pas retournés. Si vous avez vraiment besoin de renvoyer le document concerné complet, vous devrez effectuer une autre requête pour récupérer les documents correspondants.
Je réécrirais probablement votre code de cette façon (sans gestion des erreurs/échecs) :
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!")
}
}
}
)
}
Voir aussi Scala Futures :http://docs.scala-lang.org/ aperçus/core/futures.html
C'est vraiment utile !;)