在mongodb中转换一个以字符串格式存储的日期值,并与当前日期相减。

问题描述 投票:0回答:1

我需要应用一个查询来过滤少于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天的记录呢?

mongodb nosql aggregate pymongo robo3t
1个回答
1
投票

如果你能确保所有的字符串都在相同的时区和格式中,你可以直接将它们作为字符串进行比较。

db.getCollection('collection_data').find({"tager.date_from": 
{ $lte : new Date(ISODate().getTime() - (1000 * 86400 * 50)).toString() }, 
"status": "active"})

确保当你把日期转换为字符串时,你要确保你把它转换为和你存储的格式和时区相同的格式。

这显然不是推荐的解决方案,你有2个选择。

  1. 将日期保存为 Date这需要你更新你的代码和数据库,但在我看来,这将是最好的长期解决方案。
  2. 如果你使用的是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))}
        }
    }
]);


0
投票

在聚合框架中,你可以使用 $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") }
>
© www.soinside.com 2019 - 2024. All rights reserved.