转换以字符串格式存储的日期值并减去 mongodb 中的当前日期
Posted
技术标签:
【中文标题】转换以字符串格式存储的日期值并减去 mongodb 中的当前日期【英文标题】:Convert a date value stored in string format and subtract with current date in mongodb 【发布时间】:2020-09-15 14:10:47 【问题描述】:我需要应用查询来过滤少于 50 天的记录。为此,我需要将当前日期减去 50 天并与日期字段进行比较。
我尝试的查询是:
db.getCollection('collection_data').find("tager.date_from":
$lte : new Date(ISODate().getTime() - (1000 * 86400 * 50)) ,
"status": "active")
但是 tager.date_from 是一个类似于“2020-05-06T12:24:29+00:00”的字符串,而不是 ISODate(“2020-05-27T14:57:31.302Z”)。那么如何在查询中转换它以及获取超过 50 天的记录呢?
【问题讨论】:
【参考方案1】:您可以使用$dateFromString 将字符串转换为聚合框架中的日期。您的日期字符串已采用所需的默认格式,因此很简单。对于其他格式,您可以将格式字符串传递给$dateFromString
。
> db.test.insert("date": "2020-05-06T12:24:29+00:00")
WriteResult( "nInserted" : 1 )
> db.test.aggregate(["$project" : "newdate" : "$dateFromString" : "dateString" : "$date" ])
"_id" : ObjectId("5ecf91fab4a2af1a21e3e244"), "newdate" : ISODate("2020-05-06T12:24:29Z")
>
【讨论】:
“无法识别的表达式'$dateFromString'”,@Joe 从 Mongo 3.6+ 版本开始提供 道歉应该包括我正在使用的版本,即 MongoDB 4.2。感谢汤姆的澄清。如果您使用的版本早于 3.6,您将错过大量功能。 我正在使用 Robo 3T 1.3.1@JoeDrumgoole Robo 3T 是 MongoDB 的 GUI 界面。它独立于服务器版本而存在。【参考方案2】:如果您可以确保所有字符串都在相同的时区和格式中,您可以将它们作为字符串进行比较:
db.getCollection('collection_data').find("tager.date_from":
$lte : new Date(ISODate().getTime() - (1000 * 86400 * 50)).toString() ,
"status": "active")
确保在将日期转换为字符串时,确保将其转换为与存储相同的格式和时区。
话虽如此,这显然不是推荐的解决方案。你有两个选择:
-
将日期保存为
Date
。这将需要您更新代码和数据库,但在我看来,这将是最好的长期解决方案。
如果您使用的是 Mongo 3.6+ 版本,您可以使用 Mongo 的 $dateFromString
db.getCollection('collection_data').aggregate([
$addFields:
tagerDate: $dateFromString: dateString: "$tager.date_from"
,
$match:
tagerDate: $lte: new Date(ISODate().getTime() - (1000 * 86400 * 50))
]);
【讨论】:
感谢 Tom,这将显示所有记录,而不是超过 50 天的记录。 这个新的 Date(ISODate().getTime() - (1000 * 86400 * 90)).toString() 打印 Fri Feb 28 2020 05:56:42 GMT-0500 (EST),其中无法与字符串格式进行比较! 您是说聚合返回所有文档?tagerDate
字段是否至少按预期创建?关于toString
,Date
有很多不同的toString
方法。您应该阅读并根据您的情况使用正确的。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
我正在使用 mongo 3.4@Tom
Gotcha,所以其他选项仍然有效。正如我建议的那样,我个人建议更新数据库以包含字符串。如果你不能,那么只需找到所需的字符串转换方法并使用它。以上是关于转换以字符串格式存储的日期值并减去 mongodb 中的当前日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongodb php 中以 ISODATE 格式存储当前日期和时间?
如何将日期字符串转换为 mysql 日期格式以使用 mysql 查询计算日期差异
在 SQL Server 中以日期时间格式转换日期时间字符串