我在MongoDB中有一個聚合查詢,當我在shell中直接運行它時會起作用。這裏的殼查詢:如何在Spring中編寫Mongo聚合查詢?
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的這些$版本的最大值
就像我說的那樣,上面的查詢已經有效。我的問題是如何將它翻譯成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()聚集變量的表現,揭示與$項目第一個問題:
{
"aggregate" : "__collection__" ,
"pipeline" : [
{ "$match" : { "_id" : { "$in" : [ "A" , "B" , "C"]}}} ,
{ "$project" : { "versions" : { "versions" : "$nested.field.version"}}} ,
{ "$unwind" : "$versions"}
]
}
顯然,這不匹配我的意圖是什麼,所以我沒有得到正確的語法。但TBH我沒有發現Spring MongoOps語法非常直觀,而且他們的文檔也不是很好。
我沒有看到任何方式調用nested()
方法,但沒有包括對and()
的調用。我認爲這是主要問題,因爲它在那裏嵌套倍增。在這裏有沒有任何Spring MongoOps英雄能夠幫助我正確地編寫相應的Java代碼?
那麼,您的答案在這裏是正確的。不幸的是,儘管由於Spring Data的一個bug,但它並不適用於我的特殊情況。我總是在發佈SO之前清理我的字段名稱,但實際上我在某些嵌套字段名稱中強調了下劃線,看起來Spring Data在進行一些引用失敗的參照完整性檢查時會對下劃線進行某種分割。所以感謝您的努力,但不幸的是,Spring Data對於我的用例來說太麻煩了。 – SoaperGEM
@SoaperGEM不用擔心,太糟糕了,不適合你。 – chridam