有人可以帮我弄这个吗

Can someone help me with this

我实际上需要在 mongoDb 中使用聚合。我已经使用以下查询来加入两个集合,然后通过一些过滤器提取答案。查询在 mongodb 终端中运行良好。

但是我需要在 Spring boot 中使用 aggreagte 函数在 springboot 中使用这个查询。我查看了以下文档,非常有用。但是由于查询非常大。这就是为什么我无法以正确的方式编写它。

https://www.baeldung.com/spring-data-mongodb-projections-aggregations

db.coll1.aggregate([
  {
    "$unionWith": {"coll": "coll2"}
  },
  {
    "$group": {
      "_id": {
        "Id": "Id",
        "Name": {
          "$arrayElemAt": [
            {
              $split: [
                "FullName",
                "T",
              ]
            },
            1
          ]
        },
        "StreetName": {
          "$arrayElemAt": [
            {
              $split: [
                "Address",
                "T",
                
              ]
            },
            1
          ]
        }
        
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$match": {
      "$expr": {
        "$gt": [
          "$count",
          1
        ]
      }
    }
  }])

你能帮我使用聚合函数并转换这个查询,这样我就可以在 springboot 中使用它吗?

看起来像是在尝试进行计数 (*),按 trunc(gapStartTimeStamp)、trunc(gapEndTimeStamp) 分组,其中计数 > 1

如果是这样的话: 您的查询略有不同,已使用 spring-data-mongodb 3.1.8

进行测试

UnionWithOperation unionWith = UnionWithOperation.unionWith("coll2");
        
ProjectionOperation convertStartDateOp = Aggregation.project("stationId", "gapStartTimeStamp", "gapEndTimeStamp")
            .and(StringOperators.Substr.valueOf("gapStartTimeStamp").substring(0, 10))
                .as("gapStartDate")
                .and(StringOperators.Substr.valueOf("gapEndTimeStamp").substring(0, 10))
                .as("gapEndDate");
                
GroupOperation countOp = Aggregation.group("stationId", "gapStartDate", "gapEndDate").count().as("count");
        MatchOperation matchOp = Aggregation.match(Criteria.where("count").gt(1));

AggregationResults<Document> aggregate = mongoOps.aggregate(
        Aggregation.newAggregation(
            unionWith,convertStartDateOp,countOp, matchOp
        ),
        YourColl1.class, Document.class);

List<Document> mappedResults = aggregate.getMappedResults();

生成此查询:

db.coll1.aggregate(
[
 {"$unionWith": {"coll": "coll2"}}, 
  {"$project": 
    {
      "stationId": 1, 
      "gapStartTimeStamp": 1, 
      "gapEndTimeStamp": 1, 
      "gapStartDate": {"$substr": ["$gapStartTimeStamp", 0, 10]}, 
      "gapEndDate": {"$substr": ["$gapEndTimeStamp", 0, 10]}
    }
  }, 
  {"$group": {
    "_id": {
      "stationId": "$stationId", 
      "gapStartDate": "$gapStartDate", 
      "gapEndDate": "$gapEndDate"
    }, 
    "count": {"$sum": 1}
   }
  }, 
  {"$match": {"count": {"$gt": 1}}}
  
  ]
  );