java - MongoDB Group操作返回文档,而不是单个字段

原文 标签 java mongodb spring-data-mongodb

我试图根据我在Mongo中拥有的数据上次访问的时间对文件集合进行分组。

但是我不确定如何从组操作中返回更多文档。

如何获取包含每个分组下所有信息的文档?

例如,我现在返回:

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


我只是将文件名恢复到基本数组中。我想要的是文档,而不仅仅是名称。

我用来创建以上结果的代码

  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
      }
    ]
  }
]


很感谢任何形式的帮助

最佳答案

将您的小组赛阶段更改为:

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


注意:确保将size字段包括在dateProjection阶段中。

关于java - MongoDB Group操作返回文档,而不是单个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61182944/

相关文章:

java - CameraView.takePicture()将捕获的图像字节发送到哪里?

java - Swing 布局中的钢琴键:左移?

java - 已将Weblogic证书添加到本地JDK cacerts中。如何在PCF中添加证书,以便我可以通过mulesoft成功连接到Weblogic Jms

r - MongoDB-ISODate

java - PersistenceConstructor参数变量名与实例变量名不匹配

java - 具有Spring集成的PollableChannel

node.js - 如何使用内部 Mongoose 模式获取和设置函数

javascript - 检查mongo数据库中是否存在发布输入

spring - 请使用 'MongoMappingContext#setAutoIndexCreation(boolean)'或覆盖 'MongoConfigurationSupport#autoIndexCreation()'来明确

spring - spring-data-mongodb/k8s “Database name must not contain slashes, dots, spaces, quotes, or dollar signs”