Проблемы с выполнением запроса структуры агрегации реактивного монго с получением DefaultJSONCommandError - PullRequest
0 голосов
/ 15 мая 2018

Я использую реактивные игры с игровыми рамками. Я имел обыкновение иметь запрос, который использует структуру агрегации, и он работал как ожидалось. После обновления до версии 0.13.0 я получаю ошибки при выполнении запроса.

Класс выглядит так:

class Foo(
  id: Option[UUID],
  obj: UUID,
  lm: Date
)

Я хочу дать запросу список идентификаторов UUID, которые соответствуют свойству obj, но только самые последние согласно свойству lm.

Результат этого запроса должен быть сопоставлен со списком класса Bar, который выглядит следующим образом:

class Bar(
  obj: UUID,
  ts: Date
)

Запрос выглядит следующим образом (при условии, что col представляет собой JSONCollection объекта Foo, а ids представляет собой список UUID.

import col.BatchCommands.AggregationFramework._

col
    .aggregate(
      Match(Json.obj("obj" -> Json.obj("$in" -> ids.map(_.toString)))),
      List(
        Sort(Descending("lm")),
        Group(JsString("$obj"))("obj" -> FirstField("obj"), "ts" -> FirstField("lm")),
        Project(Json.obj("_id" -> 0, "obj" -> "$obj", "ts" -> "$ts"))
      )
    )
    .map(_.head[Bar])

Это работало, как и ожидалось, до обновления до 0.13.0. Чтобы быть более точным, я использую плагин реактивной игры 0.13.0-play26

Ошибка теперь выглядит так:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[DefaultJSONCommandError: CommandError[code=<unknown>, errmsg=<unknown>, doc: {"obj":"a797ec90-80d7-4b5e-b144-2454436f2b16","ts":1526390247074}]]]

К сожалению, я не смог найти документацию на сайте responsetivemongo, похоже, документы не обновлялись с 0.11.x

При использовании Mongo Cli запрос выглядит так:

db.Foo.aggregate([{ $match: { obj: { $in: ["<uuid>", "<uuid>"] } } },{ $sort: { lm: -1 } },{ $group: { _id: "$obj", ts: { $first: "$ts" } } }]); и это дает мне правильный результат.

Может кто-нибудь дать мне подсказку, что я тут не так делаю?

1 Ответ

0 голосов
/ 16 мая 2018

используйте col.aggregatorContext вместо col.aggregate

col
    .aggregatorContext[Bar](
      Match(Json.obj("obj" -> Json.obj("$in" -> ids.map(_.toString)))),
      List(
        Sort(Descending("lm")),
        Group(JsString("$obj"))("obj" -> FirstField("obj"), "ts" -> FirstField("lm")),
        Project(Json.obj("_id" -> 0, "obj" -> "$obj", "ts" -> "$ts"))
      )
    )
    .prepared
    .cursor
    .collect[List](-1, reactivemongo.api.Cursor.FailOnError[List[Bar]]())
...