Как получить данные из MongoDB с помощью Spring - группировать по последней дате и времени для каждого дня? - PullRequest
1 голос
/ 01 августа 2020

У меня есть документы в формате ниже в MongoDB. Я хочу извлечь данные, сгруппированные по категории, имени, дате (в формате, например, гггг-мм-дд), по последнему времени создания для каждого дня, чтобы узнать, прошел ли статус или нет.

{ "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 Code. Спасибо!

1 Ответ

0 голосов
/ 01 августа 2020

Запрос Пн go выглядит как

[
  {
    $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
    }
  }
]

Рабочий Пн go площадка . И агрегирование в 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();

    }

Я не тестировал, но он должен работать, и тоже это вижу .

...