首页 > 解决方案 > java中的mongodb,如何在聚合函数中使用日期范围

问题描述

我有以下代码用于根据性别进行过滤,然后根据employee_id 进行分组,以及一个额外的字段,用于计算总天数。

    collection.aggregate(
            Arrays.asList(
                    Aggregates.match(Filters.eq("$sex","male")),
              Aggregates.group("$employee_id", sum("total", "$days")),

            )
    ).forEach(printBlock);

在此查询中,如何添加要匹配的日期范围,例如 - 大于 (some date) 和 less than (some date) 。这也是在 java.util.Date 或其他东西中使用的正确日期格式。我发现了类似的问题,但在 2020 年没有发现可能有更新的部分以更简单的方式执行此操作。还有一种方法可以生成没有这种格式的查询,只需按日期范围过滤并按某个值分组。

     the json example

                  {
                    "employee_id": "GX078333",
                    "sex": "male",
                    "days": 5,
                    "date": {
                              "$date": "2020-06-01T07:33:50.796Z"
                    },
                    }

标签: javadatabasemongodbdateisodate

解决方案


Filters.and(Bson, Bson, ...)您可以使用或引用匹配多个值Filters.and(List<Bson>)

我希望您知道日期必须是日期的数组/列表。

所以,提供一个例子。cDateRangArrayList与您的 Dates 应该匹配的。

例如

ArrayList<Date> cDateRange = new ArrayList<>();
cQueryFields.add(Filters.in("date.mydatearray", cDateRange));

//
Bson cQuery = Filters.and(cQueryFields);

//
ArrayList<Bson> cQueryList = new ArrayList<>();
cQueryList.add(Aggregates.match(cQuery));

//
cQueryList.add(Aggregates.match(cQuery));
AggregateIterable<Document> cResult = cMongoDatabase.getCollection("your collection Name").aggregate(pFilter)


推荐阅读