MongoDb查询,日期格式为“ 2019-07-31T00:00:00”

时间:2019-08-20 00:03:35

标签: mongodb mongodb-query azure-cosmosdb-mongoapi

我在MongoDB集合中具有以下格式的日期字段:

{
     "firstEffectiveDate" : "2019-09-31T00:00:00".
     "lastEffectiveDate" : "2019-11-30T00:00:00".
}

现在,我正在尝试获取当前处于活动状态的记录,这意味着如果当前日期在firstEffectivedate和lastEffectivedate之间,则它将返回所有记录。

我第一次尝试获得比今天更高的记录:

db.collection.find({firstEffectiveDate: {"$gte": new Date()}})

但这本身不返回任何文档,请有人帮助。谢谢。

如何在具有上述日期格式的日期之间获取记录?

1 个答案:

答案 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汇总提供的高级日期计算方法。