我有一个包含以下文档的收藏集:
{
"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提到的$date
或ISODate
构造函数相同的操作。
Criteria.where("dateBeg")
.lte(DateOperators.DateFromString.fromString(tmpExtent.getString("fromDate")))
.lte(DateOperators.DateFromString.fromString(tmpExtent.getString("toDate")))
答案 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"}}}