Tôi không phải là chuyên gia về mongoDB cũng không phải trong ReactiveMongo nhưng có vẻ như bạn đang cố gắng sử dụng cơ sở dữ liệu NoSQL theo cách giống như cách bạn sử dụng cơ sở dữ liệu SQL tiêu chuẩn. Lưu ý rằng mongoDB là không đồng bộ có nghĩa là các hoạt động có thể được thực thi trong một số tương lai, đây là lý do tại sao các hoạt động chèn / cập nhật không trả về các tài liệu bị ảnh hưởng. Về câu hỏi của bạn:
Bạn có thể nên xem mongoDB db.collection.update ()
và gọi nó bằng upsert
tham số như true. Nếu bạn có đủ khả năng, điều này sẽ cập nhật tài liệu nếu chúng đã tồn tại trong cơ sở dữ liệu hoặc chèn chúng theo cách khác. Một lần nữa, thao tác này không trả về các tài liệu bị ảnh hưởng nhưng bạn có thể kiểm tra xem có bao nhiêu tài liệu đã bị ảnh hưởng bằng cách truy cập vào lỗi cuối cùng
. Xem reacttivemongo.api.collections.GenericCollection # update trả về Future[LastError]
.
Một lần nữa, các tài liệu đã chèn / cập nhật sẽ không được trả lại. Nếu bạn thực sự cần trả lại toàn bộ tài liệu bị ảnh hưởng, bạn sẽ cần thực hiện một truy vấn khác để truy xuất các tài liệu phù hợp.
Tôi có thể sẽ viết lại mã của bạn theo cách này (không xử lý lỗi / lỗi):
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!")
}
}
}
)
}
Xem thêm Scala Futures: http://docs.scala-lang.org/ Overviews / core / futures.html
Điều này thực sự hữu ích!;)