Играть в реактивный монго не останавливается

В моем приложении 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(), который останавливает курсор и возвращает некоторые результаты. Я хочу, чтобы курсор автоматически закрывался, когда возвращаются все результаты.


person Marc Bruins    schedule 13.11.2013    source источник


Ответы (1)


Мой первый инстинкт: «это много объектов, которые нужно получить в одном HTTP-запросе!».

Я не могу точно сказать, почему это не работает, но я подозреваю, что это убивает Future[List[JsObject]].

Я бы использовал версию Cursor.toList(), которая принимает параметр upTo, установите разумное число (скажем, 100), а затем позвольте клиенту указать, какие page результатов он хочет видеть в качестве параметра. Вы даже можете позволить клиенту установить размер страницы, если вы уверены, что он не станет слишком жадным.

Очевидно, вам нужно будет добавить еще одно предложение к вашему find, чтобы получить правильное смещение для нумерации страниц; если ваш клиент просто сообщит вам самое высокое значение _id, которое он уже получил, ваш запрос find() все равно будет очень простым.

person millhouse    schedule 14.11.2013