当前位置: 首页 > 知识库问答 >
问题:

将ISODate字符串转换为mongoDB本机ISODate数据类型

阎自怡
2023-03-14

我的应用程序以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的原生ISODate数据类型。

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

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

ii)每次插入后,运行查询,将上次插入的文档的字符串日期时间转换为ISODate,使用

element.Datetime = ISODate(element.Datetime);

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

另外,我很好奇,是否有办法配置mongoDB将datetime字符串自动转换为其本机isodate格式?

TIA公司

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

我的文件如下所示:

{"LogLevel":"错误","日期时间":"2013-06-21T11:20:17Z","模块":"DB","方法":"ExecuteSelect","请求":"WS_VALIDATE","错误":"过程或函数'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)

我想做的是摆脱上面我不得不做的对datetime的额外操作。希望这能澄清问题。

共有3个答案

龙弘盛
2023-03-14

这取决于您推送日志的语言/驱动程序/实用程序。我假设您使用的是mongoimport。

mongoimport不支持ISODate()。请参阅此问题https://jira.mongodb.org/browse/SERVER-5543ISODate()不是JSON格式,因此在mongoimport中不受支持。

i) 这种方法似乎更有效。ii)对mongo执行两项操作:插入

{"LogLevel":"error","Datetime":{"$date" : 1371813617000},"Module":"DB","Method":"ExecuteSelect","Request":"WS_VALIDATE","Error":"Procedure or function 'WS_VALIDATE' expects parameter '@LOGIN_ID', which was not supplied."}

上面的JSON应该可以工作。请注意,它是64位而不是32位历元。

融唯
2023-03-14

另外,我很好奇,是否有办法配置mongoDB将datetime字符串自动转换为其本机isodate格式?

您可能希望为时间戳创建一个Python datetime对象,并使用Pymango插入该对象。这作为MongoDB中的本机日期对象存储在后台。

因此,例如在Python中:

from datetime import datetime
object_with_timestamp = { "timestamp": datetime.now() }
your_collection.insert(object_with_timestamp)

从Mongo shell查询此对象时,将显示一个ISODate对象:

“时间戳”:ISODate(“2013-06-24T09:29:58.615Z”)

齐建白
2023-03-14

看来你已经找到答案了。。。我会坚持:

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

我有一个类似的问题,但我事先不知道应该在哪里用datetime对象替换它。所以我将我的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格式存储日期和时间。 看起来像这样 使用nodejs / javascript,如何显示时间成分,这样我会得到类似的信息 我正在使用momentjs简化此操作,但是据我所知,momentjs似乎支持ISODate格式。 感谢您的帮助。 问题答案: JavaScript的Date对象支持ISO日期格式,因此,只要您有权访问日期字符串,就可以执行以下操

  • 问题内容: 我正在使用node-mongodb-native驱动程序(http://mongodb.github.io/node-mongodb- native/ )使用nodejs 。 我有带有日期属性存储为类型的文档。 通过nodejs,我正在使用以下查询: 它什么也不返回。为了使其正常工作,我需要执行以下操作: 但是在我的nodejs代码中无法识别。 那么,如何通过我的nodejs程序对mo

  • 我将nodejs与node mongodb本机驱动程序一起使用(http://mongodb.github.io/node-mongodb-native/). 我有一些带有日期属性的文档存储为ISODate类型。 通过nodejs,我使用以下查询: 它不返回任何内容。要使其工作,我需要执行以下操作: 但在我的nodejs代码中无法识别ISODate。 那么如何通过我的nodejs程序对mongo日

  • 我在使用Java搜索MongoDB中的ISODate字段时遇到麻烦。我想找到精确匹配的日期。 下面是我如何查询第一个集合并获取ISODate字段“Timestamp”。一旦我得到这个日期,我想搜索另一个具有相同“Timestamp”值的集合。 。。。 我正在格式化ISODate,因为它以我想要搜索的不同格式返回我的日期。因此,我将其转换为这种模式“yyyy-MM-dd HH: mm: ss” 我找

  • 所以,基本上。我不想知道是否有可能(如果有可能,如何),实际上把一个类在C#代码中直接转换成一个字符串?因此,基本上,该类中的所有内容都进入字符串。 这有点短,但我不知道怎么说得更清楚。

  • 问题内容: 我正在从在Varchar中具有原始提要的表中导入数据,我需要将varchar中的列导入到字符串列中。我尝试使用以及,但是却遇到了错误,因为有一些空字段,我需要将它们作为空或null检索到新表中。 请让我知道是否有相同的功能。 问题答案: 大胆猜测:如果您的值是一个空字符串,则可以使用NULLIF将其替换为NULL: