我正在使用带有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}]]]
它给了我正确的结果。
有人能给我一个提示吗,我在这里做错了什么?
答案 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]]())