使用Scala和MongoDB返回所有项目?

时间:2018-04-06 10:02:52

标签: mongodb scala akka

我正在使用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方法时,我只得到一个空的花括号。我不确定我做错了什么。

因此,解决方案是更改find​​All方法,以便返回Future [Seq],并实现toFuture方法:

 def findAll(): Future[Seq[Image]] =
collection
  .find()
    .toFuture()

1 个答案:

答案 0 :(得分:0)

从驱动程序doc:在API中,返回Observables的所有方法都是“冷”流意味着在订阅之前不会发生任何事情。 订阅Observable,或者返回Future。

Doc:http://mongodb.github.io/mongo-scala-driver/2.2/getting-started/quick-tour/