如何使用 Spring 从 MongoDB 检索数据 - 按每天的最新日期时间分组?

How to retrieve data from MongoDB using Spring - group by latest datetime for each day?

我在 MongoDB 中有以下格式的文件。我想提取每天最新创建日期时间按类别、名称、日期(格式如 yyyy-mm-dd)分组的数据,以了解状态是通过还是失败。

{ "name":"Scenario number one", "category":"general", "creationDateTime":"2020-06-15T00:18:35.608+00:00", "status":"Passed" },
{ "name":"Scenario number one", "category":"general", "creationDateTime":"2020-06-15T00:11:35.608+00:00", "status":"Failed" },
{ "name":"Scenario number one", "category":"general", "creationDateTime":"2020-06-15T00:08:35.608+00:00", "status":"Passed" },
{ "name":"Scenario number two", "category":"happy-path", "creationDateTime":"2020-06-15T00:17:35.608+00:00", "status":"Failed" },
{ "name":"Scenario number one", "category":"general", "creationDateTime":"2020-06-13T00:12:35.608+00:00", "status":"Passed" },
{ "name":"Scenario number two", "category":"happy-path", "creationDateTime":"2020-06-12T00:11:35.608+00:00", "status":"Failed" },
{ "name":"Scenario number two", "category":"happy-path", "creationDateTime":"2020-06-12T00:10:35.608+00:00", "status":"Passed" }

我希望输出格式类似于

{"category":"general", "name":"Scenario number one", "date":"2020-06-15", "status":"Passed"}
{"category":"happy-path", "name":"Scenario number two", "date":"2020-06-15", "status":"Failed"}
{"category":"general", "name":"Scenario number one", "date":"2020-06-13", "status":"Failed"}
{"category":"happy-path", "name":"Scenario number two", "date":"2020-06-12", "status":"Failed"}

请帮助 Spring 代码。谢谢!

Mongo 查询就像

[
  {
    $sort: {
      "creationDateTime": -1
    }
  },
  {
    "$addFields": {
      "date": {
        "$substr": [
          "$creationDateTime",
          0,
          10
        ]
      }
    }
  },
  {
    "$group": {
      "_id": {
        name: "$name",
        cat: "$category",
        cdt: "$date"
      },
      "category": {
        $first: "$category"
      },
      status: {
        $first: "$status"
      },
      name: {
        $first: "$name"
      },
      date: {
        $first: "$date"
      }
    }
  },
  {
    $project: {
      _id: 0
    }
  }
]

工作Mongo playground。以及 Spring、

中的聚合
 public List<Object> test() {
        Aggregation aggregation = Aggregation.newAggregation(
                sort(Sort.Direction.DESC, "creationDateTime"),
                a -> new Document("$addFields",
                        new Document("date",
                                new Document("$substr", Arrays.asList("$creationDateTime", 0, 10))
                        )
                ),
                group(Fields.from(
                        Fields.field("name", "$name"),
                        Fields.field("category", "$category"),
                        Fields.field("date", "$date")
                ))
                        .first("category").as("category")
                        .first("status").as("status")
                        .first("name").as("name")
                        .first("date").as("date"),
                project().andExclude("_id")

        ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

        return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();

    }

我没有测试,但应该可以,