2016-09-06 15 views
5

Tôi đang viết một dịch vụ web với akka-http và ReactiveMongo. Tôi gặp phải vấn đề mà tôi không thể tự giải quyết được.Nhận ID sau khi chèn với ReactiveMongo

tôi có phương pháp

def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]): Future[WriteResult] = { 
    collection.insert(route) 
    } 

Vấn đề là WriteResult không chứa bất kỳ thông tin hữu ích trừ lỗi hay tình trạng OK.

Bạn có thể giải thích cách lấy ID đối tượng được chèn sau khi chèn. Tất cả các ví dụ mà tôi đã tìm thấy có liên quan đến phiên bản cũ với LastError hoặc với Play! Khung.

Trả lời

1

tôi quản lý để lấy ID hay bất cứ lĩnh vực khác, hoặc thậm chí toàn bộ đối tượng bằng cách quay tuple từ tiết kiệm phương pháp.

def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]) = { 
    collection.insert(route).map((_, route)) 
    } 

sao chép Route thực thể và gán ID genereted trước khi gọi saveRoute

route.copy(id = Some(BSONObjectID.generate().stringify)) 

Cách tiếp cận này cho phép tôi để có được cả hai, WriteResult và lưu đơn vị

5

Đó là một lựa chọn thiết kế (khá phổ biến) được thực hiện bởi ReactiveMongo.

Giải pháp được đề xuất là tự cung cấp id, sử dụng BSONObjectID.generate, thay vì cho phép db tạo một mã cho bạn.

Dưới đây là một ví dụ từ các tài liệu ReactiveMongo http://reactivemongo.org/releases/0.11/documentation/tutorial/write-documents.html

val id = BSONObjectID.generate 
val person = Person(
    id, 
    "Stephane", 
    "Godbillon", 
    29) 

val future = collection.insert(person) 

future.onComplete { 
    case Failure(e) => throw e 
    case Success(lastError) => { 
    println(s"successfully inserted document with id $id) 
    } 
} 
+0

trong trường hợp này bạn vẫn cần phải có không kết quả trống để nhận ID. –

+0

@ green-creeper ý của bạn là gì? –

+0

Trong trường hợp thành công, tôi nhận đối tượng này 'DefaultWriteResult (ok = true, n = 1, writeErrors = List(), writeConcernError = None, code = None, errmsg = None)' Không có 'ObjectId' trong nó –

Các vấn đề liên quan