使用 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 提到的 $date
或 ISODate
构造函数相同的操作。
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"}}}
我有一份 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 提到的 $date
或 ISODate
构造函数相同的操作。
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"}}}