Не съм експерт по mongoDB, нито по ReactiveMongo, но изглежда, че се опитвате да използвате NoSQL база данни по същия начин, както бихте използвали стандартни SQL бази данни. Имайте предвид, че mongoDB е асинхронен, което означава, че операциите може да бъдат изпълнени в бъдеще, поради което операциите за вмъкване/актуализация не връщат засегнати документи. Относно вашите въпроси:
Вероятно трябва да погледнете mongoDB db.collection.update()
и го извикайте с upsert
параметър като верен. Ако можете да си го позволите, това или ще актуализира документите, ако вече съществуват в базата данни, или ще ги вмъкне по друг начин. Отново, тази операция не връща засегнати документи, но можете да проверите колко документа са били засегнати чрез достъп до последна грешка
. Вижте reactivemongo.api.collections.GenericCollection#update което връща Future[LastError]
.
Още веднъж вмъкнати/актуализирани документи няма да бъдат върнати. Ако наистина трябва да върнете обратно целия засегнат документ, ще трябва да направите друга заявка, за да извлечете съответстващи документи.
Вероятно бих пренаписал кода ви по следния начин (без обработка на грешка/отказ):
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!")
}
}
}
)
}
Вижте също Scala Futures:http://docs.scala-lang.org/ overviews/core/futures.html
Това е наистина полезно!;)