使用 Spring 和 DateFromString 在日期上构建聚合操作

Building aggregation operation over date using Spring and DateFromString

我有一份 collection,其中包含以下文件:

{
  "observation": {
    "temporalExtent": [
      {
        "dateBeg": ISODate("2002-07-28T20:47:00.000+02:00"),
        "dateEnd": ISODate("2003-09-13T16:17:00.000+02:00")
      }
    ]
  }
}

我正在尝试进行以下应该 return 上面文档的聚合操作,但我无法弄清楚哪里出了问题以及找不到文档的原因。

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": {
            "$dateFromString": {
              "dateString": "1892-01-05T23:50:39.000Z"
            }
          }
        }
      }
    }
  }
})

有什么想法吗?你可以玩 this config here

编辑

聚合操作$dateFromString由Spring-data-mongodbDateOperators.DateFromString fromString(Object value)方法生成。我想知道为什么我滥用此运算符或其他方式来生成与 @arsendavtyan 和 @mani 提到的 $dateISODate 构造函数相同的操作。

Criteria.where("dateBeg")
  .lte(DateOperators.DateFromString.fromString(tmpExtent.getString("fromDate")))
  .lte(DateOperators.DateFromString.fromString(tmpExtent.getString("toDate")))

value.dateString 替换为 $date 或仅使用 ISODate 而不是 String

选项 1

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": {
             "$date": "1892-01-05T23:50:39.000Z"
          }
        }
      }
    }
  }
})

选项 2

db.collection.aggregate({
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": ISODate("1892-01-05T23:50:39.000Z")
        }
      }
    }
  }
})

请尝试运行

db.collection.aggregate([{
  "$match": {
    "observation.temporalExtent": {
      "$elemMatch": {
        "dateBeg": {
          "$gte": new ISODate("1892-01-05T23:50:39.000Z")
        }
      }
    }
  }
}])

Try running using mongoshell or Robo Mongo , Mongoplayground throw error for newIsoDate()

这是防止使用 $dateFromString 运算符的解决方法。

日期的字符串表示被解析为Instant

JSONObject tmpExtent = (JSONObject) item;
Instant from = Instant.parse(tmpExtent.getString("fromDate"));
Instant to = Instant.parse(tmpExtent.getString("toDate"));

标准的构造如下:

Criteria.where("dateBeg").lte(from).lte(to)

对 mongoDB 的查询看起来像@arsendavtyan 第一个解决方案。

{ "dateBeg" : { "$gte" : { "$date" : "2011-01-31T23:00:00.000Z"} , "$lte" : { "$date" : "2019-02-21T23:00:00.000Z"}}}