Преобразование значения даты, хранящегося в строковом формате, и вычитание из текущей даты в mongodb - PullRequest
0 голосов
/ 28 мая 2020

Мне нужно применить запрос для фильтрации записей, срок хранения которых меньше 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 дней?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Если вы можете убедиться, что все строки находятся в одном часовом поясе и формате, вы можете просто сравнить их как строки:

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

Убедитесь, что при преобразовании даты в строку вы убедитесь, что преобразовали ее в тот же формат и часовой пояс, которые вы сохранили.

С учетом сказанного, это явно не рекомендуемое решение. у вас есть 2 варианта:

  1. Сохранить даты как Date. это потребует от вас обновления кода и базы данных, но, на мой взгляд, это будет лучшим долгосрочным решением.
  2. Если вы используете Mon go версии 3.6+, вы можете использовать Mon go 's $ dateFromString
db.getCollection('collection_data').aggregate([
    {
        $addFields: {
            tagerDate: {$dateFromString: {dateString: "$tager.date_from"}}
        }
    },
    {
        $match: {
            tagerDate: {$lte: new Date(ISODate().getTime() - (1000 * 86400 * 50))}
        }
    }
]);

0 голосов
/ 28 мая 2020

Вы можете преобразовать строку в дату в структуре агрегирования, используя $ 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") }
>
...