玩reactivemongo并没有停止

时间:2013-11-13 09:29:53

标签: mongodb scala playframework-2.0 swagger reactivemongo

在我的play / swagger / reactivemongo应用程序中,我在控制器中使用以下函数来获取带有“EntityID”8的结果列表。

@ApiOperation(value = "Gets the item of a specific ID", notes = "Returns an Item", responseClass = "Item", httpMethod = "GET")
@ApiErrors(Array(
new ApiError(code = 400, reason = "Invalid ID supplied"),
new ApiError(code = 404, reason = "Item not found")))
def index = Action { implicit request =>
 Async {
  // test id
  var myVar: Int = 8

  val cursor: Cursor[JsObject] = collection.find(Json.obj("EntityID" -> myVar))
  .sort(Json.obj("_id" -> -1))
  .cursor[JsObject]
  // gather all the JsObjects in a list
  val futureUsersList: Future[List[JsObject]] = cursor.toList

  // transform the list into a JsArray
  val futureUsersListJs: Future[JsArray] = futureUsersList.map { Measurements_live =>
    Json.arr(Measurements_live)
  }

  futureUsersListJs.map { Measurements_live =>
    Ok(Measurements_live)
  }
 }
}

测量模型:

case class Measurements_live(
EntityID: Int,
SensorID: Int,
Datetime: Date,
Value: String)

object JsonFormats {
import play.api.libs.json.Json
import play.api.data._
import play.api.data.Forms._

implicit val measureFormat = Json.format[Measurements_live]
val measureForm = Form(
  mapping(
    "EntityID" -> number,
    "SensorID" -> number,
    "Datetime" ->  date,
    "Value" -> text)(Measurements_live.apply _)(Measurements_live.unapply _))
}

问题在于它不会停止加载。数据库中总共有35000个对象。 我玩过cursor.close()来停止光标并返回一些结果。我想要的是当返回所有结果时光标自动关闭。

1 个答案:

答案 0 :(得分:0)

我的第一直觉是“在一个HTTP请求中提取的对象很多!”。

我不能确切地说为什么这不起作用,但我怀疑它正在整理成Future[List[JsObject]]正在杀死这件事。

我会使用Cursor.toList() page的版本,将其设置为合理的数字(比如100),然后允许客户指定他们想要查看的find个结果作为参数。如果你相信它们不会太贪心,你甚至可以让客户设置页面大小。

显然,您需要在_id中添加另一个子句才能获得正确的分页偏移量;如果您的客户只是告诉您他们已经获得的最高find()值,那么您的{{1}}查询仍然会非常简单。