【发布时间】:2015-11-03 16:49:24
【问题描述】:
我在 MongoDB 中有一个聚合查询,当我直接在 shell 中运行它时它就可以工作。这是 shell 查询:
db.MyCollection.aggregate([
{$match: {_id: {$in: ['A', 'B', 'C']}}},
{$project: {"versions": "$nested.field.version"}},
{$unwind: "$versions"},
{$group: {_id: "$_id", "maxVersion": {$max: "$versions"}}}
])
如您所见,它执行以下操作:
- 仅匹配具有指定 ID 的某些文档
- 将嵌套字段向下投影到基础级别字段(并有效地从管道中过滤掉所有其他字段,但仍保留 ID)
- 展开我们投射到管道中各个文档中的 $versions 字段的数组元素
- 查找每个 ID 的 $versions 的最大值
就像我说的,上面的查询已经有效。我的问题是如何将其转换为 Spring MongoDB 语法。这是我的第一次尝试,它不起作用:
Aggregation aggregation = newAggregation(
match(Criteria.where("_id").in(listOfIds))
,project().and("versions").nested(bind("versions", "nested.field.version"))
,unwind("versions")
,group("_id").max("versions").as("maxVersion")
);
当我尝试在调试模式下运行代码时,我可以看到我实际上在 newAggregation 上得到了一个 IllegalArgumentException,说它无法评估。如果我用 $group 子句注释掉该行,那么我可以看到聚合变量的这个 toString() 表示,这揭示了 $project 子句的问题:
{
"aggregate" : "__collection__" ,
"pipeline" : [
{ "$match" : { "_id" : { "$in" : [ "A" , "B" , "C"]}}} ,
{ "$project" : { "versions" : { "versions" : "$nested.field.version"}}} ,
{ "$unwind" : "$versions"}
]
}
显然这与我的意图不符,所以我的语法不正确。但是 TBH 我觉得 Spring MongoOps 的语法不是很直观,他们的文档也不是很好。
如果不首先包括对and() 的调用,我看不到任何调用nested() 方法的方法。我认为这是主要问题,因为它在那里的嵌套增加了一倍。这里有没有Spring MongoOps大侠可以帮我正确写出等价的Java代码?
【问题讨论】:
标签: java spring mongodb spring-data spring-data-mongodb