【问题标题】:How to fetch data from mongoDB based on two dates in spring boot?如何在spring boot中根据两个日期从mongoDB中获取数据?
【发布时间】:2022-02-04 13:47:41
【问题描述】:

我在 Spring Boot 中使用聚合。但得到响应为空

Aggregation.match(Criteria.where("createdAt").lt(fromDate).gt(toDate));

mongoDbTemplate 返回查询如下

"createdAt" : { "$gt" : { "$date" : "2020-12-31T18:30:00.000Z"} , "$lt" : { "$date" : "2022-01-04T07:34:42.000Z"}}}}

那么如何使用 mongoTemplate.aggregation 从 MongoDB 获取数据。 mongo Shell 不支持 $date, 有什么解决办法吗?

【问题讨论】:

    标签: java mongodb spring-boot spring-data


    【解决方案1】:

    尝试了解您可以通过函数名称创建的内置方法

    @Repository
    public interface YourDTORepository extends MongoRepository<YourDTO, YourIdentifier> {
        ArrayList<YourDTO> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);
    }
    

    在期望两个参数之间,它将为您构建范围。

    【讨论】:

    • 我必须使用聚合,如 mongoTemplate.aggregate(aggregation, "collectionName", myDTO.class);
    【解决方案2】:

    您需要使用and 以防您想要获取范围 [from,to]

    Aggregation.match(Criteria.where("createdAt").lt(fromDate)
                                         .and("createdAt").gt(toDate));
    

    或者,

    Criteria 类具有andOperator 函数。您需要将条件传递给它。

    query.addCriteria(
        new Criteria().andOperator(
            Criteria.where("createdAt").lt(fromDate),
            Criteria.where("createdAt").gt(toDate)
        )
    );
    

    另一个选项是查询注释。

    @Query("{'createdAt' : { $gte: ?0, $lte: ?1 } }")

    这里,?0 代表函数的第一个参数,?1 代表函数的第二个参数。

    Reference

    【讨论】:

    • 我试过这个,但比较的是字符串类型。我要比较 Date 类型 query.addCriteria(new Criteria().andOperator(Criteria.where("createdAt").lt(fromDate), Criteria.where("createdAt").gt(toDate)));
    • 我也参考了他们提到的其他 QA 和 stackoverflow 和 mongoDB 社区使用 ISODate 或 new Date()
    • 是的,如果你的 fromDate, toDate 是正确的 Date 对象,你会得到想要的 o/p
    【解决方案3】:

    经过大量研究,我终于找到了解决方案,可能这对其他人有帮助。

    "createdAt" : { "$gt" : { "$date" : "2020-12-31T18:30:00.000Z"} , "$lt" : { "$date" : "2022-01-04T07:34:42.000Z"}}}}
    

    mongoDbTemplate返回的这个是对的,但是不支持老版本的spring boot。

    我的项目旧版本是

    <pom>
        <groupId>com.Demo</groupId>
        <artifactId>emp</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
    </pom>
    

    我改如下

     <pom>
            <groupId>com.Demo</groupId>
            <artifactId>emp</artifactId>
            <version>2.5.3</version>
            <packaging>war</packaging>
      </pom>
    

    其余代码同上。

    所以它工作正常。

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2021-08-30
      相关资源
      最近更新 更多