我需要应用一个查询来过滤少于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天的记录呢?
如果你能确保所有的字符串都在相同的时区和格式中,你可以直接将它们作为字符串进行比较。
db.getCollection('collection_data').find({"tager.date_from":
{ $lte : new Date(ISODate().getTime() - (1000 * 86400 * 50)).toString() },
"status": "active"})
确保当你把日期转换为字符串时,你要确保你把它转换为和你存储的格式和时区相同的格式。
这显然不是推荐的解决方案,你有2个选择。
Date
这需要你更新你的代码和数据库,但在我看来,这将是最好的长期解决方案。db.getCollection('collection_data').aggregate([
{
$addFields: {
tagerDate: {$dateFromString: {dateString: "$tager.date_from"}}
}
},
{
$match: {
tagerDate: {$lte: new Date(ISODate().getTime() - (1000 * 86400 * 50))}
}
}
]);
在聚合框架中,你可以使用 $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") }
>