执行 reactivemongo 聚合框架查询时出现 DefaultJSONCommandError 问题

Problems executing reactivemongo aggregation framework query getting a DefaultJSONCommandError

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

class 看起来像这样:

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

我想为查询提供一个与 obj 属性 相匹配的 UUID 列表,但只有根据 lm 属性.

的最新 UUID

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

class Bar(
  obj: UUID,
  ts: Date
)

查询看起来像这样(假设 col 是实体 FooJSONCollection 并且 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 之前,这按预期工作。更准确地说,我使用了 reactivemongo 播放插件 0.13.0-play26

错误现在看起来像这样:

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

不幸的是,我在 reactivemongo 网站上找不到文档,文档似乎从 0.11.x

开始就没有更新过

使用 mongo cli 查询如下所示:

db.Foo.aggregate([{ $match: { obj: { $in: ["<uuid>", "<uuid>"] } } },{ $sort: { lm: -1 } },{ $group: { _id: "$obj", ts: { $first: "$ts" } } }]); 它给了我正确的结果。

谁能给我提示,我做错了什么?

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