【问题标题】:Update all MongoDB's datetime string to ISO datetime format in MongoDB将所有 MongoDB 的日期时间字符串更新为 MongoDB 中的 ISO 日期时间格式
【发布时间】:2020-02-27 17:55:10
【问题描述】:

我在查询我的 mongodb 集合时遇到了一点麻烦,因为它的日期时间都存储为字符串,格式如下:timestamp:"Sat Jun 09 2018 11:58:03 GMT-0400 (EDT)"

timestamp的类型在mongodb中是String。 我喜欢将其所有时间戳转换为 UTC ISO 日期时间。 我是Mongo的新手..我来自MSSQL..我找不到更新所有时间戳的方法,它的格式很奇怪。

我的目标是运行查询{timestamp: {$lte: some iso datetime.}}

【问题讨论】:

  • 你的 MongoDB 版本是多少?

标签: python mongodb pymongo


【解决方案1】:

纯粹在Mongo中做会很麻烦,你必须写很多代码。

我认为最简单的解决方案是使用moment.js 库,因为它可以直接解析 RFC 2822 日期时间格式:

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

您可以多次运行上述命令,即当 timestamp 已经是正确的 Date 对象时,不会有任何中断。

【讨论】:

  • 所以我在 mongodb 中的时间戳是字符串类型,在启动时刻库之前我需要将其转换为日期类型吗?
  • 不,moment() 读取字符串并转换为 Date 对象
【解决方案2】:

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'>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2019-09-15
    相关资源
    最近更新 更多