MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come devo strutturare le mie chiamate reactivemongo nidificate nella mia applicazione play2?

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!;)