执行 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
是实体 Foo
的 JSONCollection
并且 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]]())
我正在使用带有播放框架的反应式mongo。我曾经有一个使用聚合框架的查询,它按预期工作。自更新到版本 0.13.0 后,我在执行查询时遇到错误。
class 看起来像这样:
class Foo(
id: Option[UUID],
obj: UUID,
lm: Date
)
我想为查询提供一个与 obj
属性 相匹配的 UUID 列表,但只有根据 lm
属性.
该查询的结果应映射到 class Bar
的列表,如下所示:
class Bar(
obj: UUID,
ts: Date
)
查询看起来像这样(假设 col
是实体 Foo
的 JSONCollection
并且 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]]())