sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo debo estructurar mis llamadas reactivas mongo anidadas en mi aplicación play2?

No soy un experto en mongoDB ni en ReactiveMongo, pero parece que está tratando de usar una base de datos NoSQL de la misma manera que usaría bases de datos SQL estándar. Tenga en cuenta que mongoDB es asíncrono, lo que significa que las operaciones pueden ejecutarse en el futuro, por eso las operaciones de inserción/actualización no devuelven los documentos afectados. Con respecto a sus preguntas:

Probablemente debería mirar el mongoDB db.collection.update() y llámelo con upsert parámetro como verdadero. Si puede permitírselo, esto actualizará los documentos si ya existen en la base de datos o los insertará de lo contrario. De nuevo, esta operación no devuelve los documentos afectados, pero puede comprobar cuántos documentos se han visto afectados accediendo al último error . Consulte reactivemongo.api.collections.GenericCollection#update que devuelve un Future[LastError] .

Una vez más, los documentos insertados/actualizados no serán devueltos. Si realmente necesita devolver el documento afectado completo, deberá realizar otra consulta para recuperar los documentos coincidentes.

Probablemente reescribiría su código de esta manera (sin manejo de errores/fallas):

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!")
                    }
                }
            }
        )
}

Consulte también Scala Futures:http://docs.scala-lang.org/ resúmenes/núcleo/futuros.html

¡Esto es realmente útil!;)