mongodb - 将 ISODate 字符串转换为 mongoDB 原生 ISODate 数据类型

标签 mongodb pymongo isodate

我的应用程序生成 JSON 格式的日志。日志看起来像这样:

{"LogLevel":"error","Datetime":"2013-06-21T11:20:17Z","Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}

目前,我正在将上述日志行按原样推送到 mongoDB 中。但 mongoDB 将日期时间存储为字符串(这是预期的)。现在我想对这些日志运行一些数据处理作业,我更愿意将日期时间存储为 mongoDB 的 native ISODate 数据类型。

我可以想到 3 种方法来做到这一点:

i) 解析每个 JSON 日志行并将字符串转换为应用程序代码中的 ISODate 类型,然后将其插入。缺点:在将其推送到 mongoDB 之前,我必须解析每一行,这会有点昂贵

ii) 每次插入后运行查询,使用

将最后插入文档的字符串日期时间转换为 ISODate
element.Datetime = ISODate(element.Datetime);

缺点:同样昂贵,因为我将在每次插入时运行一个额外的查询 iii) 在生成点修改我的日志,这样我就不必在应用程序代码级别进行任何解析,或者在每次插入后运行更新查询

另外,我只是好奇,有没有办法可以配置 mongoDB 将日期时间字符串自动转换为其 native isodate 格式?

TIA

编辑: 我正在使用 pymongo 插入 json 日志

我的文件看起来像这样:

{“LogLevel”:“错误”,“日期时间”:“2013-06-21T11:20:17Z”,“模块”:“DB”,“方法”:“ExecuteSelect”,“请求”:“WS_VALIDATE ","Error":"过程或函数'WS_VALIDATE'需要参数'@LOGIN_ID',但未提供该参数。"}

像上面提到的那样,有数百行。 这就是我将它们插入 mongodb 的方式:

for line in logfile:
    collection.insert(json.loads(line))

以下内容将解决我的问题:

for line in logfile:
    data = json.loads(line)
    data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
    collection.insert(data)

我想做的是摆脱上面必须做的日期时间的额外操作。希望这能澄清问题。

最佳答案

看起来你已经有了答案...我会坚持:

for line in logfile:
    data = json.loads(line)
    data["Datetime"] = datetime.strptime(data["Datetime"], "%Y-%M-%DTHH:mmZ")
    collection.insert(data)

我遇到了类似的问题,但我事先不知道应该在哪里用日期时间对象替换它。所以我将 json 信息更改为如下内容:

{"LogLevel":"error","Datetime":{"__timestamp__": "2013-06-21T11:20:17Z"},"Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}

并解析 json:

json.loads(data, object_hook=logHook)

“logHook”定义为:

def logHook(d):
    if '__timestamp__' in d:
        return datetime.strptime(d['__timestamp__'], "%Y-%M-%DTHH:mmZ")
    return d

这个logHook函数还可以扩展以用elif,elif,...替换许多其他“变量”

希望这有帮助!

关于mongodb - 将 ISODate 字符串转换为 mongoDB 原生 ISODate 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236479/

相关文章:

c++ - Mongodb C++ 编译问题

mongodb - 如何使用 PyMongo 将文档添加到集合中的数组

python - 带字符串时间戳的平均聚合

mongodb - 在聚合期间从 MongoDB ISODate 中获取以秒为单位的 unix 时间戳

mongodb - 编码(marshal)和编码(marshal) BSON

mongodb - Mongo - rs.initiate() 错误代码 76

datetime - 仅 ISO 8601 日期部分

javascript - 从 Mongodb 格式化 ISODate

html - node.js , mongodb, mongoose, html 如何插入数据(在 index.html 中)?

python - Pymongo 在文档中插入