2016-08-22 166 views
1

我想在java中使用Spring mongo實現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領域。我如何創建?

+0

我嘗試使用 聚合AGG = newAggregation(匹配(Criteria.where( 「sellerCode」)。爲(filterRequest.getSellerCode())), Aggregation.project( 「bucketName」)。andInclude( 「名優產品」)。和「包含」(「createdTime」)和包括(「sellerCode」), sort(Sort.Direction.DESC,「createdTime」), group(「sellerCode」,「brandName」,「bucketName」)) 但問題是我無法創建itemSold字段。我如何創建? – Nayanava

+1

我已將您的問題進行了一些調整,使其更易於理解。我在頂部說明了主要問題,爲json查詢和java代碼添加了語法提示,並且還做了其他一些重新修改。如果你有進一步的澄清,你可以添加,請[編輯]的問題,以進一步改善; Stack Overflow鼓勵編輯。 –

回答

0

你可以在重組春您的管道如下:

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字段。

+0

組方法內的fields()方法正在拋出編譯時錯誤。 – Nayanava

+0

@Nayanava再次嘗試更新的方法,讓我知道這是怎麼回事。 – chridam