簡體   English   中英

在java spring中使用$ group stage實現MongoDB聚合管道

[英]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(filterR‌​equest.getSellerCode‌​())),
    Aggregation.project("bucketName")
               .andInclude("brandName")
               .an‌​dInclude("createdTim‌​e")
               .andInclude("sell‌​erCode"), 
    sort(Sort.Direction.DESC, "createdTime"), 
    group("sellerCode", "brandName", "bucketName")
); 

但問題是我無法創建itemSold字段。 我該如何創建?

您可以在Spring中重構您的管道,如下所示:

Aggregation agg = Aggregation.newAggregation( 
    Aggregation.match(Criteria.where("sellerCode").is(filterR‌​equest.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM