soa*_*gem 2 java spring mongodb spring-data spring-data-mongodb
我在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"}}}
])
Run Code Online (Sandbox Code Playgroud)
如您所见,这可以做到以下几点:
就像我说的,上面的查询已经有效了.我的问题是如何将其转换为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")
);
Run Code Online (Sandbox Code Playgroud)
当我尝试在调试模式下运行代码时,我可以看到我实际上在newAggregation上得到一个IllegalArgumentException,说它无法评估.如果我用$ group子句注释掉这一行,那么我可以看到聚合变量的这个toString()表示,它揭示了$ project子句的问题:
{
"aggregate" : "__collection__" ,
"pipeline" : [
{ "$match" : { "_id" : { "$in" : [ "A" , "B" , "C"]}}} ,
{ "$project" : { "versions" : { "versions" : "$nested.field.version"}}} ,
{ "$unwind" : "$versions"}
]
}
Run Code Online (Sandbox Code Playgroud)
显然,这与我的意图不符,所以我没有得到正确的语法.但TBH我没有发现Spring MongoOps语法非常直观,他们的文档也不是很好.
如果没有先调用,我就没有办法调用该nested()方法and().我认为这是主要的问题,因为它在那里加倍筑巢.有没有Spring MongoOps英雄可以帮助我正确编写等效的Java代码?
的$project,因为你仍然可以做一个管道是没有必要$unwind的嵌套的领域,因此该管道的聚集能得到相同的结果,当前的:
db.MyCollection.aggregate([
{
"$match": {
"_id": { "$in": ['A', 'B', 'C'] }
}
},
{ "$unwind": "$nested.field" },
{
"$group": {
"_id": "$_id",
"maxVersion": { "$max": "$nested.field.version" }
}
}
])
Run Code Online (Sandbox Code Playgroud)
Spring Data MongoDB聚合等效:
Aggregation agg = newAggregation(
match(Criteria.where("_id").in(ids)),
unwind("nested.field"),
group("_id").max("nested.field.version").as("maxVersion")
);
Run Code Online (Sandbox Code Playgroud)
回到你当前的聚合,你需要$unwind在nested.field数组,而不是nested.field.version字段,因为那是一个字符串,而不是数组:
db.MyCollection.aggregate([
{$match: {_id: {$in: ['A', 'B', 'C']}}},
{$project: {"fields": "$nested.field"}},
{$unwind: "$fields"},
{$group: {_id: "$_id", "maxVersion": {$max: "$fields.version"}}}
])
Run Code Online (Sandbox Code Playgroud)
Sprind Data MongoDB等价物看起来像:
Aggregation agg = newAggregation(
match(Criteria.where("_id").in(ids)),
project().and("nested.field").as("fields")
unwind("fields"),
group("_id").max("fields.version").as("maxVersion")
);
Run Code Online (Sandbox Code Playgroud)