转换以字符串格式存储的日期值并减去 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 字段是否至少按预期创建?关于toStringDate 有很多不同的toString 方法。您应该阅读并根据您的情况使用正确的。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 我正在使用 mongo 3.4@Tom Gotcha,所以其他选项仍然有效。正如我建议的那样,我个人建议更新数据库以包含字符串。如果你不能,那么只需找到所需的字符串转换方法并使用它。

以上是关于转换以字符串格式存储的日期值并减去 mongodb 中的当前日期的主要内容,如果未能解决你的问题,请参考以下文章

Java以这种格式减去两个日期[重复]

如何在 mongodb php 中以 ISODATE 格式存储当前日期和时间?

如何将日期字符串转换为 mysql 日期格式以使用 mysql 查询计算日期差异

在 SQL Server 中以日期时间格式转换日期时间字符串

Springboot + mongodb 将字符串转换为日期

在mongodb聚合管道中将毫秒转换为日期以进行分组?