2016-09-06 25 views
5

Akka-http ve ReactiveMongo ile bir web servisi yazıyorum. Kendimle çözemediğim bir sorunla karşı karşıya kaldım.ReactiveMongo ile ekleme yaptıktan sonra kimliği alın

Sorun hatası veya Tamam statü dışında herhangi yararlı bilgiler içermez WriteResult olduğunu yöntemini

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

var.

Ekledikten sonra nesne kimliğinin nasıl ekleneceğini açıklar mısınız? Bulduğum tüm örnekler ya LastError ya da Play! Çerçeve.

cevap

1

ReactiveMongo belgelerinden bir örnek verilmiştir.

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

Ben Bu yaklaşım olmayan bana hala olması gerekir bu durumda hem WriteResult ve kaydedilmiş varlık

5

Bu ReactiveMongo tarafından yapılan (oldukça yaygın) bir tasarım seçimidir.

Önerilen çözüm, db'nin sizin için bir tane oluşturmasına izin vermek yerine, BSONObjectID.generate kullanarak bir kimlik sağlamaktır.

İşte kaydetme yöntemi dan tuple dönerek kimliği veya herhangi bir başka alan, hatta tüm nesneyi başardı 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

ulaşmasını sağlar önce saveRoute

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

çağırmak Route varlık kopyalayıp genereted kimliği atar Kimlik almak için boş sonuç. –

+0

@ yeşil sarmaşık ne demek istiyorsun? –

+0

Başarı durumunda bu nesneyi alıyorum 'DefaultWriteResult (Tamam = true, n = 1, writeErrors = List(), writeConcernError = Yok, code = Yok, errmsg = Yok)' İçinde 'ObjectId' yok –

İlgili konular