当前位置: 首页 > 知识库问答 >
问题:

多重聚合和释放-Spring数据Mongodb

微生阳平
2023-03-14

我有一个mongo查询,用于展开四个对象数组,并根据匹配条件过滤数据。如何在Spring data mongodb中执行相同的操作

我使用过单次放卷,但找不到任何具有多次放卷和匹配操作的。

db.generator.aggregate([
{ $unwind :'$eCList'},
{ $unwind :'$pcList'},
{ $unwind :'$cityList'},
{ $unwind :'$eATypeList'},
{ $match : {'eCList.eCCode': { $eq : 'enccode1'} }},
{ $match : {'pcList.pcCode': { $eq : 'pccode1'} }},
{ $match : {'cityList.cityCode': { $eq : 'citycode1'} }},
{ $match : {'eATypeList.eATypeCode': { $eq : 'eATypeCode1'} }},
{ $project : {generatorData : '$generatorData',pcList:'$pcList',
    generatorCode: '$generatorCode', eCId : '$eCList.eCId', 
    eCCode : '$eCList.eCCode', eCKey : '$eCList.eCKey' } }
])

共有1个答案

唐麒
2023-03-14

你可以在1.10中尝试下面的聚合。x spring mongo版本。

 Aggregation aggregation = Aggregation.newAggregation(
       Aggregation.unwind("eCList"),
       Aggregation.unwind("pcList"),
       Aggregation.unwind("cityList"),
       Aggregation.unwind("eATypeList"),
       Aggregation.match(Criteria.where("eCList.eCCode").is("enccode1")),
       Aggregation.match(Criteria.where("pcList.pcCode").is("pccode1")),
       Aggregation.match(Criteria.where("cityList.cityCode").is("citycode1")),
       Aggregation.match(Criteria.where("eATypeList.eATypeCode").is("eATypeCode1")),
       Aggregation.project("generatorData", "pcList", "generatorCode").
          andInclude(Aggregation.bind("eCId", "eCList.eCId")).
          andInclude(Aggregation.bind("eCCode", "eCList.eCCode")).
          andInclude(Aggregation.bind("eCKey", "eCList.eCKey"))
);
List<BasicDBObject>  results  = mongoTemplate.aggregate( aggregation, "generator", BasicDBObject.class).getMappedResults();

生成的Shell查询:

{
  "aggregate":"__collection__",
  "pipeline":[
    {"$unwind":"$eCList"},
    {"$unwind":"$pcList"},
    {"$unwind":"$cityList"},
    {"$unwind":"$eATypeList"},
    {"$match":{"eCList.eCCode":"enccode1"}},
    {"$match":{"pcList.pcCode":"pccode1"}},
    {"$match":{"cityList.cityCode":"citycode1"}},
    {"$match":{"eATypeList.eATypeCode":"eATypeCode1"}},
    {"$project":{
      "generatorData":1,
      "pcList":1,
      "generatorCode":1,
      "eCId":"$eCList.eCId",
      "eCCode":"$eCList.eCCode",
      "eCKey":"$eCList.eCKey"}}
  ]
}

静态导入

import org.springframework.data.mongodb.core.query.Criteria;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

Aggregation aggregation = newAggregation(
     unwind("eCList"),
     unwind("pcList"),
     unwind("cityList"),
     unwind("eATypeList"),
     match(where("eCList.eCCode").is("enccode1")),
     match(where("pcList.pcCode").is("pccode1")),
     match(where("cityList.cityCode").is("citycode1")),
     match(where("eATypeList.eATypeCode").is("eATypeCode1")),
     project("generatorData", "pcList", "generatorCode").
       andInclude(bind("eCId", "eCList.eCId")).
       andInclude(bind("eCCode", "eCList.eCCode")).
       andInclude(bind("eCKey", "eCList.eCKey"))
);
 类似资料:
  • 我正在开发Spring Boot V2.2.6。Release+Eureka+Hystrix和Turbine。在发这个问题之前,我浏览了很多链接,比如: > Spring启动式涡轮 Spring Boot+Eureka服务器+Hystrix with Turbine:empty pom.xml

  • 有人能帮我把这个mongoDB聚合转换成Spring数据mongo吗? 我试图在每个邀请函文件中获得未提醒与会者的电子邮件列表。 让它在mongo shell中运行,但需要在Spring data mongo中运行。 我的shell查询 ) 正如你们所看到的,这是我提出的,它在管道的项目和团队运作中并没有像预期的那样发挥作用。下面给出了生成的查询。 聚合对象创建 它创建以下查询 聚合对象生成的查询

  • 有人知道如何使用Spring-Data将下面的聚合函数转换成java代码吗?

  • 我正在尝试做一个GroupBy基于共享ID的GeoJSON功能列表,以便通过使用拆分/聚合来聚合这些功能的单个字段,如下所示: 除非我取消对这三行的注释,否则聚合器永远不会发布组,数据库也不会收到任何更新。如果我将groupTimeout设置为小于5秒,则会丢失部分结果。 我预计发布策略默认为,我预计在处理完所有(拆分)功能后会自动释放所有组(REST服务消息中总共只有129个功能)。手动将其设置

  • 我的应用程序使用Spring数据MongoDB,我试图在嵌入式文档中按降序排序数据,这是不工作的。 请参考以下JSON文档 JSON-库存文件: Spring数据Mongodb聚合查询: 电流输出: 苹果:150.0 李子:200.0 橙子:500.0 预期产量(按需求描述订单): 橙子:500.0 李子:200.0 苹果:150.0 你能帮我按降序得到预期的输出吗? 此外,我计划通过使用上述带限

  • 我尝试使用下面的elasticsearch查询来处理Spring数据。目的是为字段返回唯一的结果。就像与SQL数据库进行比较一样。 我将该字段配置为关键字,它使查询在api中完美运行,如下所示: 我的问题是,当我尝试使用StringQuery运行时,相同的查询在Spring数据中不起作用,我得到以下错误。我猜它使用不同的api来运行查询。 我尝试过使用类型来实现相同的结果,没有重复和没有对象加载,