使用Spring和DateFromString在日期上进行聚合操作

时间:2019-02-27 18:15:56

标签: mongodb aggregation-framework spring-data-mongodb

我有一个包含以下文档的收藏集:

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

我正在尝试进行以下聚合操作,该操作应该返回上面的文档,但是我无法弄清楚出了什么问题以及为什么找不到该文档。

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

有什么主意吗?您可以玩this config here

编辑

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

请尝试运行

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

尝试使用mongoshell或Robo Mongo运行,newIsoDate()的Mongoplayground抛出错误

答案 2 :(得分:0)

这是阻止使用$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"}}}