2016-08-22 138 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