首页 > 解决方案 > 在spring mongodb中的两个字符串日期范围之间查找

问题描述

我有Person类似的文件

{
  "_id": {
    "$oid": "5e44659dcd"
  },
  "record": {
    "Date_Of_Birth": "9/25/2018"
  },
  "_class": "com.example.entities.Birth"
}

Recordis of type objectDate_Of_Birthis of typeStringDate已存储在其中,我想执行查询以对其使用 $gte 和 $lte 操作。我正在使用弹簧数据 mongodb。似乎首先我必须使用 $dateFromString 将其转换为日期,但这似乎是我认为不需要的聚合。

下面是我到目前为止创建的代码

Pageable pageable = PageRequest.of(page, size);
Query query = new Query(
        Criteria
                .where("record.Date_Of_Birth").gte(DateOperators.dateFromString(startDate).withFormat("mm/dd/yyyy"))
                .andOperator(Criteria.where("record.Date_Of_Birth").lte(DateOperators.dateFromString(endDate).withFormat("mm/dd/yyyy"))
)).with(pageable);

生成此查询

{ "record.Date_Of_Birth" : { "$gte" : { "value" : { "dateString" : "9/25/2018", "format" : "mm/dd/yyyy"}}}, "$and" : [{ "record.Date_Of_Birth" : { "$lte" : { "value" : { "dateString" : "9/25/2018", "format" : "mm/dd/yyyy"}}}}]}

并且根本不工作。任何的想法?

标签: javaspringmongodbspring-bootaggregation-framework

解决方案


$expr允许在查询中使用聚合运算符。这将允许您将存储的值转换为日期,以便您可以进行苹果与苹果的比较。

db.collection.find({
  $expr: {
    $gte: [
      {$dateFromString: {
           dateString: "$record.Date_Of_Birth", 
           format: "%m/%d/%Y", 
           timeZone: "EST5EDT"}},
      {$dateFromString: {
           dateString: "9/25/2018", 
           format: "%m/%d/%Y", 
           timeZone: "EST5EDT"}}
    ]
  }
})

推荐阅读