Обновите всю строку даты и времени MongoDB в формат даты и времени ISO в MongoDB - PullRequest
1 голос
/ 27 февраля 2020

У меня небольшая проблема с запросом к моей коллекции mongodb, так как все ее дата и время хранятся в виде строки, а формат выглядит следующим образом: timestamp:"Sat Jun 09 2018 11:58:03 GMT-0400 (EDT)"

тип timestamp - это строка в mongodb. Мне нравится конвертировать все его временные метки в UT C ISO. Я новичок ie в понедельник go .. Я пришел с MS SQL .. Я не могу найти способ обновить все его временные метки в странном формате.

Моя цель это запустить запрос {timestamp: {$lte: some iso datetime.}}

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Делать это чисто в понедельник go будет громоздко, вам придется написать довольно много кода.

Я думаю, что самое простое решение - использовать момент . js* Библиотека 1004 *, потому что она может анализировать формат даты и времени RF C 2822 напрямую:

db.collection.find({}).forEach(function(doc) {
   var ts = moment(doc.timestamp).toDate();
   db.collection.updateOne(
      {_id: doc._id},
      {$set: { timestamp: ts} }
   );
})

Вы можете выполнить указанную выше команду несколько раз, т.е. когда timestamp уже является правильным Date объектом, то ничего брейки.

0 голосов
/ 29 февраля 2020

Python метод

Обычно dateutil.parser.parse хорошо работает в этой ситуации, но ему не нравится сложный формат, поэтому процесс заключается в преобразовании его в Сначала похожая на ISO строка, а затем анализ даты:

import pymongo
import pytz
from datetime import datetime
from dateutil import parser

db = pymongo.MongoClient(tz_aware=True)['mydatabase']
db.mycollection.insert_one({"timestamp": "Sat Jun 09 2018 11:58:03 GMT-0400 (EDT)"})
records = db.mycollection.find()

for record in records:
    d_str = record.get('timestamp')
    if d_str is not None:
        naive_str = f'{d_str[0:24]}'
        offset = d_str[28:33]
        naive_d = datetime.strptime(naive_str, '%a %b %d %Y %H:%M:%S')
        iso_str = f'{naive_d.isoformat()}{offset}'
        aware_d = parser.parse(iso_str).astimezone(pytz.utc)
        db.mycollection.update_one({'_id': record['_id']}, {'$set': {'timestamp': aware_d}})

d = db.mycollection.find_one()
print (d['timestamp'], type(d['timestamp']))

дает:

2018-06-09 15:58:03+00:00 <class 'datetime.datetime'>
...