【问题标题】:Filter by Date with Spring Data MongoTemplate使用 Spring Data MongoTemplate 按日期过滤
【发布时间】:2020-03-10 14:49:47
【问题描述】:

我想按日期过滤我的归档数组,使用 mongo 查询看起来像这样:

    {
        $project: {
            user: "$$ROOT",
            fieldA: {
                $filter: {
                    input: "$fieldA",
                    as: "a",
                    cond: {
                        $and: [
                            {$lt: ["$$a.constraint", new Date()]}, 
                            {$gt: ["$$a.constraint", new Date()]}
                        ]
                    }
                }
            }
           }
     }, 

查询有效,但是当我尝试使用 spring 进行查询时遇到了问题:

project()
    .and("$$ROOT").as("user")
    .and(
        filter("$fieldA")
            .as("a")
            .by(
                and(       
                    ComparisonOperators.Lte.valueOf("a.constraint")
                        .lessThanEqualTo(dateEnd),                                              
                    ComparisonOperators.Gte.valueOf("a.constraint")
                        .greaterThanEqualTo(dateStart)
                )
            )).as("fieldA"),

我认为这不是进行日期比较的正确方法,但我不知道如何正确进行。能帮我弄清楚我做错了什么吗?

【问题讨论】:

    标签: spring mongodb-query spring-data-mongodb


    【解决方案1】:

    尝试将dateStartdateEnd 变量包装在ConvertOperators.ToDate.toDate 中。 ComparisonOperators 方法(在本例中为 lessThanEqualTogreaterThanEqualTo)接受 StringAggregationExpression

    通过使用ConvertOperators.ToDate.toDate 方法,您可以确保传递的参数是AggregationExpression,并且值的格式正确以便比较。

    结果如下所示:

    import static org.springframework.data.mongodb.core.aggregation.ConvertOperators.ToDate.toDate
    ...
    
    project()
        .and("$$ROOT").as("user")
        .and(
            filter("$fieldA")
                .as("a")
                .by(
                    and(       
                        ComparisonOperators.Lte.valueOf("a.constraint")
                            .lessThanEqualTo(toDate(dateEnd)),                                              
                        ComparisonOperators.Gte.valueOf("a.constraint")
                            .greaterThanEqualTo(toDate(dateStart))
                    )
                )).as("fieldA"),
    

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2013-11-13
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多