我正在使用akka-http和MongoDB数据库在scala中编写CRUD。我希望能够从MongoDB中的集合/表中返回所有项目。
我有一个如下所示的路由器:
val imageRoute = {
pathPrefix("api") {
pathPrefix("image") {
get {
path(Segment).as(FindByIdRequest) { request =>
complete {
repository
.findById(request.id)
.map { optionalImage => optionalImage.map {
_.asResource
}
}
.flatMap {
case None => Future.successful(HttpResponse(status = StatusCodes.NotFound))
case Some(image) => Marshal(image).to[ResponseEntity].map { e => HttpResponse(entity = e) }
}
}
}
} ~ post {
entity(as[ImageResource]) { image =>
complete {
repository
.save(image.asDomain)
.map { id =>
HttpResponse(status = StatusCodes.Created, headers = List(Location(s"/api/images/$id")))
}
}
}
}
}
pathPrefix("images"){
get{
complete{
repository
.findAll()
}
}
}
}
}
}
我的回购看起来像这样:
class ImageRepository(collection: MongoCollection[Image])(implicit ec: ExecutionContext) {
def findById(id: String): Future[Option[Image]] =
collection
.find(Document("_id" -> new ObjectId(id)))
.head
.map(Option(_))
def findAll(): Observable[String] =
collection
.find()
def save(image: Image): Future[String] =
collection
.insertOne(image)
.head
.map { _ => image._id.toHexString }
}
然而,当我运行findAll方法时,我只得到一个空的花括号。我不确定我做错了什么。
因此,解决方案是更改findAll方法,以便返回Future [Seq],并实现toFuture方法:
def findAll(): Future[Seq[Image]] =
collection
.find()
.toFuture()
答案 0 :(得分:0)
从驱动程序doc:在API中,返回Observables的所有方法都是“冷”流意味着在订阅之前不会发生任何事情。 订阅Observable,或者返回Future。
Doc:http://mongodb.github.io/mongo-scala-driver/2.2/getting-started/quick-tour/