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

MongoDb query with "2019-07-31T00:00:00" date format

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

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

现在我正在尝试获取当前活动的记录,这意味着如果当前日期介于第一个有效日期和最后一个有效日期之间,它应该 return 所有记录。

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

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

但这本身并不是 returning 任何文件,有人可以帮忙吗。谢谢。

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

由于您的日期记录为字符串,因此您不能使用 new Date() 作为参数,因为那样您将比较字符串和日期。

幸运的是,您使用的是 ISO 标准日期格式,这意味着它可以排序,即使是字符串。

例如,假设我有这个 collection:

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