执行reactivemongo聚合框架查询的问题获取DefaultJSONCommandError

时间:2018-05-15 13:41:38

标签: scala playframework reactivemongo

我正在使用带有play框架的reactivemongo。我曾经有一个使用聚合框架的查询,它按预期工作。自更新到版本0.13.0后,我在执行查询时遇到错误。

该课程如下:

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

我想为查询提供一个与obj属性匹配但仅根据lm属性的最新UUID列表。

该查询的结果应该映射到类Bar的列表,如下所示:

class Bar(
  obj: UUID,
  ts: Date
)

查询如下所示(假设col是实体JSONCollection的{​​{1}},Foo是UUID列表。

ids

此功能按预期工作,直到升级到0.13.0。更准确地说,我使用reactivemongo play plugin 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-play26

不幸的是,我在reactivemongo网站上找不到文档,似乎自0.11.x以后文档没有更新

使用mongo cli,查询如下所示:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[DefaultJSONCommandError: CommandError[code=<unknown>, errmsg=<unknown>, doc: {"obj":"a797ec90-80d7-4b5e-b144-2454436f2b16","ts":1526390247074}]]]它给了我正确的结果。

有人能给我一个提示吗,我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

使用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]]())