使用Spring Data@Aggregation搜索MongoDB ISODate



我有一个连接到MongoDB数据库的Spring API。我正试图使用Spring的CCD_;装运";具有";shipDate";晚于用户指定的日期。

以下是我的存储库示例:

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);
}

作为CCD_ 2传递的值是">";2020-06-16">。我使用@Aggregation而不是@Query,因为一旦我让这部分工作起来,$match后面就会有$group操作。

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

JSON读取器需要一个字符串,但找到了"?0'

我尝试了以下语法变体:

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

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

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

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

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

我犯了一个简单的语法错误吗?谢谢你在这方面的帮助!

我使用$dateToString将存储在MongoDB中的ISODate转换为一个可以与用户提供的日期匹配的字符串,然后使用@Aggregation0将其添加到每个条目中,从而实现了这一点。然而,我认为这种方法可能存在以下问题:

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

我不确定这是否会成为一个问题,因为这取决于MongoDB在处理$addFields$match时的处理方式。如果它只将字段添加到$match返回的条目中,则效率会高得多。

工作@Aggregation示例:

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

最新更新