MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie sollte ich meine verschachtelten reaktiven Mongo-Aufrufe in meiner Play2-Anwendung strukturieren?

Ich bin weder ein Experte für MongoDB noch für ReactiveMongo, aber es scheint, dass Sie versuchen, eine NoSQL-Datenbank auf die gleiche Weise zu verwenden, wie Sie Standard-SQL-Datenbanken verwenden würden. Beachten Sie, dass mongoDB asynchron ist, was bedeutet, dass Operationen in der Zukunft ausgeführt werden können, weshalb Einfügungs-/Aktualisierungsoperationen keine betroffenen Dokumente zurückgeben. Zu Ihren Fragen:

Sie sollten sich wahrscheinlich die mongoDB db.collection.update() ansehen -Methode und rufen Sie sie mit upsert auf Parameter als wahr. Wenn Sie es sich leisten können, werden dadurch entweder Dokumente aktualisiert, wenn sie bereits in der Datenbank vorhanden sind, oder sie anderweitig eingefügt. Auch dieser Vorgang gibt keine betroffenen Dokumente zurück, aber Sie können überprüfen, wie viele Dokumente betroffen sind, indem Sie auf letzter Fehler . Siehe reactivemongo.api.collections.GenericCollection#update was einen Future[LastError] zurückgibt .

Auch hier werden eingefügte/aktualisierte Dokumente nicht zurückgesendet. Wenn Sie wirklich das vollständige betroffene Dokument zurücksenden müssen, müssen Sie eine weitere Abfrage durchführen, um übereinstimmende Dokumente abzurufen.

Ich würde Ihren Code wahrscheinlich so umschreiben (ohne Fehler-/Fehlerbehandlung):

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

Siehe auch Scala Futures:http://docs.scala-lang.org/ overviews/core/futures.html

Das ist wirklich nützlich!;)