Nejsem odborník na mongoDB ani na ReactiveMongo, ale zdá se, že se snažíte používat databázi NoSQL stejným způsobem, jako byste používali standardní databáze SQL. Všimněte si, že mongoDB je asynchronní, což znamená, že operace mohou být provedeny v budoucnu, proto operace vložení/aktualizace nevracejí dotčené dokumenty. K vašim otázkám:
Pravděpodobně byste se měli podívat na mongoDB db.collection.update()
a zavolejte ji pomocí upsert
parametr jako true. Pokud si to můžete dovolit, bude to buď aktualizovat dokumenty, pokud již existují v databázi, nebo je vložit jinak. Tato operace opět nevrací dotčené dokumenty, ale můžete zkontrolovat, kolik dokumentů bylo ovlivněno přístupem k poslední chyba
. Viz reactivemongo.api.collections.GenericCollection#update který vrací Future[LastError]
.
Ještě jednou, vložené/aktualizované dokumenty nebudou vráceny. Pokud opravdu potřebujete vrátit celý dotčený dokument zpět, budete muset provést další dotaz, abyste získali odpovídající dokumenty.
Pravděpodobně bych přepsal váš kód tímto způsobem (bez zpracování chyb/selhání):
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!")
}
}
}
)
}
Viz také Scala Futures:http://docs.scala-lang.org/ overviews/core/futures.html
To je opravdu užitečné!;)