具有"2019-07-31T00:00:00"日期格式的 MongoDb 查询



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

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

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

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

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

但这本身并没有返回任何文件,有人可以帮忙吗?谢谢。

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

由于您的日期记录为字符串,因此不能使用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()数据类型而不是字符串。这样,您就可以在聚合中利用日期表达式运算符提供的高级日期计算方法。

最新更新