Операция MongoDB Group возвращает документ, а не отдельные поля - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь сгруппировать коллекцию файлов в зависимости от того, когда к ним последний раз обращались, в соответствии с данными, которые у меня есть в пн go.

Однако я не уверен, как вернуть больше документа из групповой операции.

Как мне вернуть документ со всей информацией в каждой группе?

Например, я сейчас возвращаю:

[
  {
    "year": [
      2020
    ],
    "month": [
      2
    ],
    "week": [
      7
    ],
    "day": [
      2
    ],
    "results": [
      "filename-1",
      "filename-2"
    ]
  }
]

Я получаю только имя файла обратно в массиве c. Я хотел бы документ, а не только имя.

Код, который я использую для создания результата выше

  public void groupTest() {

    final String dateField = "lastAccessTime";

    final LocalDate now = LocalDate.now();
    final LocalDate firstDay = now.with(firstDayOfYear());
    final LocalDate lastDay = now.with(lastDayOfYear());

    final Criteria criteria =
        new Criteria().andOperator(where(dateField).gte(firstDay), where(dateField).lte(lastDay));

    final ProjectionOperation dateProjection =
        project()
            .and("_id")
            .as("id")
            .and("name")
            .as("name")
            .and("absolutePath")
            .as("absolutePath")
            .and(dateField)
            .extractYear()
            .as("year")
            .and(dateField)
            .extractMonth()
            .as("month")
            .and(dateField)
            .extractWeek()
            .as("week")
            .and(dateField)
            .extractDayOfWeek()
            .as("day");

    final GroupOperation groupBy =
        group("year", "month", "week", "day")
                .addToSet("name")
                .as("results");

    final Aggregation aggregation =
        newAggregation(
            match(criteria),
            dateProjection,
            groupBy,
            sort(Sort.Direction.ASC, "year", "month", "week", "day"));
  }

Мне бы хотелось, чтобы значение моих результатов было больше похоже на:

[
  {
    "year": [
      2020
    ],
    "month": [
      2
    ],
    "week": [
      7
    ],
    "day": [
      2
    ],
    "results": [
      {
        "id": "123",
        "filename": "filename-1",
        "size": 30000
      },
      {
        "id": "456",
        "filename": "filename-2",
        "size": 30000
      }
    ]
  }
]

Любая помощь очень ценится

1 Ответ

1 голос
/ 13 апреля 2020

Измените групповой этап на следующий:

GroupOperation group = Aggregation
    .group("year", "month", "week", "day")
    .addToSet(new Document("id", "$id")
                   .append("filename", "$name")
                   .append("size", "$size"))
    .as("results");

Примечание: Обязательно включите поле size в dateProjection этап.

...