1

在我的 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() 来停止光标并返回一些结果。我想要的是当返回所有结果时光标会自动关闭。

4

1 回答 1

0

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

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

我会使用带有参数Cursor.toList()的版本,将其设置为合理的数字(比如 100),然后允许客户端指定他们希望将哪些结果作为参数查看。如果您相信他们不会太贪心,您甚至可以让客户设置页面大小。upTopage

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

于 2013-11-14T03:14:11.643 回答