使用 Spring Data @Aggregation搜索 MongoDB ISODate

Searching for MongoDB ISODate Using Spring Data @Aggregation

提问人:Kylep5587 提问时间:4/8/2021 更新时间:8/14/2023 访问量:988

问:

我有一个连接到MongoDB数据库的Spring API。我正在尝试使用Spring在“发货”文档中查找“发货日期”晚于用户指定日期的条目。@Aggregation

这是我的存储库的示例:

import org.springframework.data.mongodb.repository.Aggregation;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ShipmentRepository extends MongoRepository<Shipment, String> {
    @Aggregation("{ '$match': { shipDate: {$gt: ISODate(?0)} } }")
    int findShippedAfterDate(String date);
}

传递的值为“2020-06-16”。我使用的是 @Aggregation 而不是 @Query,因为一旦我让这部分工作,$match之后就会有一个$group操作。date

似乎在内部使用无法正常工作,并导致以下错误:?0ISODate()

JSON 读取器需要一个字符串,但发现“?0”

我尝试了以下语法变体:

  • shipDate: {$gt: ISODate('?0')}
  • shipDate: {$gt: ISODate('$?0')}

两者都会导致以下错误,我认为这是由于实际上没有被值替换而引起的:?0

org.bson.json.JsonParseException:日期格式无效。

我相信问题在于没有被字符串值替换,因为当使用字符串而不是变量占位符时,查询会按预期工作:?0

@Aggregation("{ '$match': { shipDate: {$gt: ISODate('2020-06-16')} } }")

我犯了一个简单的语法错误吗?感谢您对此的任何帮助!

匹配 spring-data-mongodb 聚合 isodate

评论

2赞 Diego 5/7/2022
我和你有同样的问题,你能找到解决方案吗?谢谢

答:

0赞 Kylep5587 4/10/2021 #1

我能够通过使用将存储在 MongoDB 中的 ISODate 转换为可以与用户提供的日期匹配的字符串,然后使用 .但是,我认为这种方法可能存在以下问题:$dateToString$addFields

  • 效率低下,因为它会为每个返回的条目添加一个字段。dateString

我不确定这是否会是一个问题,因为它取决于 MongoDB 在后面跟着 .如果仅将字段添加到 返回的条目中,则效率会高得多。$addFields$match$match

工作实例:@Aggregation

@Aggregation(pipeline = {
        "{ '$addFields': { 'dateString': { $dateToString: { format: '%Y-%m-%d', date: '$shipDate'} } }  }",
        "{ '$match': { dateString: {$gte: ?0} } }" })