scala #reactivemongo #play-reactivemongo
#scala #reactivemongo #воспроизведение-reactivemongo
Вопрос:
У меня проблемный запрос mongo. Проблематично, потому что это занимает 10-12 секунд, и именно поэтому я ищу другую реализацию.
Запрос пытается выполнить подсчет количества элементов в коллекции. Я уверен, что есть лучший способ выполнить подсчет.
Текущая реализация:
def count(criteria: Option[JsObject], skip: Int, limit: Option[Int]): Future[Long] =
(for {
col <- collection
counted <- col.count(
selector = criteria,
limit = limit,
skip = skip,
hint = None,
readConcern = ReadConcern.Majority
)
} yield counted) recoverWith {
case error =>
logger.error(
s"failed to count by [${criteria.getOrElse(JsObject.empty)}]"
s" with error: [${error.getMessage}]"
, error)
Future.failed(MongoExceptionBuilder.buildError(error))
}
Я просмотрел документацию и нашел команду aggregateWith, которая могла бы взаимодействовать с функцией подсчета. Я попытался реализовать это на себе, но мне это не удалось.
http://reactivemongo.org/releases/0.1x/documentation/advanced-topics/aggregation.html#count
def count(criteria: Option[JsObject], skip: Int, limit: Option[Int]): Future[Long] =
(for {
col <- collection
counted <- col.aggregateWith[Long]() { framework =>
import framework.{Count, Group, Match}
(Match(criteria.getOrElse(JsObject.empty)),List(Count("count")))
}.head
} yield counted) recoverWith {
case error =>
logger.error(
s"failed to count by [${criteria.getOrElse(JsObject.empty)}]"
s" with error: [${error.getMessage}]"
, error)
Future.failed(MongoExceptionBuilder.buildError(error))
}
Ошибка, которую я вижу:
lt-dispatcher-4 c.i.d.c.c.m.PlayerProfileDAOapplyOrElse(строка:95) не удалось выполнить подсчет по [{}] с ошибкой: [JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsnumber),WrappedArray())))))] play.api.libs.json.Исключение JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsnumber),WrappedArray())))))
Комментарии:
1. Попробуйте последнюю версию