2013-11-13 2 views
1

В моих играх/развязность/приложениях reactivemongo я использую следующую функцию в контроллере, чтобы получить список результатов с «EntityId» 8.Play reactivemongo не останавливает

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

ответ

0

Моим первым инстинктом является «это лот объектов для извлечения в одном HTTP-запросе!».

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

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

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

Смежные вопросы