我在MongoDB集合中具有以下格式的日期字段:
{
"firstEffectiveDate" : "2019-09-31T00:00:00".
"lastEffectiveDate" : "2019-11-30T00:00:00".
}
现在,我正在尝试获取当前处于活动状态的记录,这意味着如果当前日期在firstEffectivedate和lastEffectivedate之间,则它将返回所有记录。
我第一次尝试获得比今天更高的记录:
db.collection.find({firstEffectiveDate: {"$gte": new Date()}})
但这本身不返回任何文档,请有人帮助。谢谢。
如何在具有上述日期格式的日期之间获取记录?
答案 0 :(得分:1)
由于您的日期记录为字符串,因此不能使用new Date()
作为参数,因为那样您就将字符串与日期进行比较。
幸运的是,您使用ISO标准日期格式,这意味着它可以进行排序,甚至可以作为字符串进行排序。
例如,假设我有这个收藏集:
> db.test.find()
{ "_id": 0, "dt": "2019-08-20T00:00:00" }
{ "_id": 1, "dt": "2019-08-21T00:00:00" }
{ "_id": 2, "dt": "2019-08-22T00:00:00" }
{ "_id": 3, "dt": "2019-08-23T00:00:00" }
{ "_id": 4, "dt": "2019-08-24T00:00:00" }
{ "_id": 5, "dt": "2019-08-25T00:00:00" }
您可以使用ISO日期格式的字符串构造查询,例如:
> db.test.find({dt:{$gte:'2019-08-23T00:00:00'}})
{ "_id": 3, "dt": "2019-08-23T00:00:00" }
{ "_id": 4, "dt": "2019-08-24T00:00:00" }
{ "_id": 5, "dt": "2019-08-25T00:00:00" }
请注意,查询正确选择了所有日期> = 2019-08-23T00:00:00
。
如果今天的日期是2019-08-22,这也将起作用:
> db.test.find({dt:{$gte:(new Date()).toISOString()}})
{ "_id": 3, "dt": "2019-08-23T00:00:00" }
{ "_id": 4, "dt": "2019-08-24T00:00:00" }
{ "_id": 5, "dt": "2019-08-25T00:00:00" }
实际上,最好的解决方案是重构数据以使用正确的ISODate()
数据类型而不是字符串。这样,您就可以利用Date Expression Operators汇总提供的高级日期计算方法。