MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como devo estruturar minhas chamadas reactivemongo aninhadas no meu aplicativo play2?


Não sou especialista em mongoDB nem em ReactiveMongo, mas parece que você está tentando usar um banco de dados NoSQL da mesma maneira que usaria bancos de dados SQL padrão. Observe que o mongoDB é assíncrono, o que significa que as operações podem ser executadas em algum futuro, é por isso que as operações de inserção/atualização não retornam documentos afetados. Sobre suas dúvidas:

Você provavelmente deve olhar para o mongoDB db.collection.update() e chame-o com o upsert parâmetro como verdadeiro. Se você puder pagar, isso atualizará os documentos se eles já existirem no banco de dados ou os inserirá de outra forma. Novamente, esta operação não retorna os documentos afetados, mas você pode verificar quantos documentos foram afetados acessando o último erro . Consulte reactivemongo.api.collections.GenericCollection#update que retorna um Future[LastError] .

Mais uma vez, os documentos inseridos/atualizados não serão devolvidos. Se você realmente precisar devolver o documento afetado completo, precisará fazer outra consulta para recuperar os documentos correspondentes.

Eu provavelmente reescreveria seu código dessa maneira (sem tratamento de erros/falhas):
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!")
                    }
                }
            }
        )
}

Veja também Scala Futures:http://docs.scala-lang.org/ overviews/core/futures.html

Isso é realmente útil!;)