[英]Implement MongoDB aggregation pipeline with $group stage in java spring
我正在嘗試使用Spring mongo在java中實現MongoDB查詢。
這是本機MongoDB查詢:
db.ShieldReport.aggregate([
{$match:{"sellerCode":"e1aaf3"}},
{$project:{bucketName:"$bucketName", brandName: "$brandName", createdTime : "$createdTime", sellerCode : "$sellerCode"}},
{$sort:{"createdTime":-1}},
{$group:
{
_id: { sellerCode: "$sellerCode", bucketName: "$bucketName", brandName: "$brandName"},
itemsSold: { $first: { bucketName: "$bucketName", brandName: "$brandName", createdTime : "$createdTime"} }
}
},
{$sort:{"itemsSold.createdTime":-1}},
{$project : { _id : "$_id.sellerCode", bucketName :"$itemsSold.bucketName", brandName : "$itemsSold.brandName"}}
])
在我的Spring java版本中,我已經做到了這一點:
Aggregation agg = newAggregation(
match(Criteria.where("sellerCode").is(filterRequest.getSellerCode())),
Aggregation.project("bucketName")
.andInclude("brandName")
.andInclude("createdTime")
.andInclude("sellerCode"),
sort(Sort.Direction.DESC, "createdTime"),
group("sellerCode", "brandName", "bucketName")
);
但問題是我無法創建itemSold
字段。 我該如何創建?
您可以在Spring中重構您的管道,如下所示:
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("sellerCode").is(filterRequest.getSellerCode())),
Aggregation.sort(Sort.Direction.DESC, "createdTime"),
Aggregation.group("sellerCode", "bucketName", "brandName")
.first("bucketName").as("bucketName")
.first("brandName").as("brandName")
.first("createdTime ").as("createdTime "),
Aggregation.sort(Sort.Direction.DESC, "createdTime"),
Aggregation.project("bucketName", "brandName")
.and("sellerCode").previousOperation()
);
正如您所看到的,已經省略了一些管道階段,因為它們實際上並不是必需的。 例如, $group
步驟之前的$project
管道可以取消,因為$group
管道運算符將應用累加器
在組步驟中,您將中間過濾的文檔按三個字段分組,並將其他字段值存儲在$first
運算符輔助的新字段中。
通過上一個組操作的createdTime
字段引用對中間結果進行排序。
最后,在第四步中,從上一個組操作中選擇“bucketName”和“brandName”字段。 請注意,“sellerCode”再次隱式引用group-id字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.