我正在尝试使用 MongoDB Compass 中的导入数据按钮将现在已经变得非常简单的 JSON 导入 MongoDB。
我从这个开始:
{"timestamp":"1728714859000","prio":"0"}
{"timestamp":"1728714859000","prio":"0"}
这导致导入错误:
{"name":"WriteError","message":"'timestamp' must be present and contain a valid BSON UTC datetime value","index":1,"code":2,"op: {"timestamp":"1728714859000","prio":"0","_id":"67397afef3e6b1d4dc9c2f44"}}
通过反复试验,我发现从时间戳中删除引号(如下所示)可以解决该错误。
{timestamp:"1728714859000","prio":"0"}
{timestamp:"1728714859000","prio":"0"}
现在我遇到了一个新的错误,但仅限于 GUI,其中指出:
Failed to import with the following error:
Parser cannot parse input: expected an object key
在查看了一些其他示例之后,我找到了对 a 的引用_id
以及另一种制作时间戳的方法。
{
"_id" : "5d11c815eb946a412ecd677d",
"timestamp" : ISODate("2024-10-10T05:06:44.871Z"),
"name" : "harry"
}
现在我收到错误:
Failed to import with the following error:
Parser cannot parse input: expected a value
根据另一个建议,我尝试使用 Python 插入数据:
import pymongo
import time
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["sklogsdb"]
collection = db["sklogscol"]
record = {
"timestamp": int(time.time() * 1000),
"email": "[email protected]"
}
result = collection.insert_one(record)
这导致了同样的错误:
pymongo.errors.WriteError: 'timestamp' must be present and contain a valid BSON UTC datetime value, full error: {'index': 0, 'code': 2, 'errmsg': "'timestamp' must be present and contain a valid BSON UTC datetime value"}
我在这里做错了什么?
该错误表明数据正在被加载到时间序列集合中,这确实需要定义的时间字段中的 BSON UTC 日期时间。
BSON 规范(https://bsonspec.org/spec.html)将 UTC 日期时间定义为:
其中
int64
是自纪元以来的毫秒数。在许多查询形式中,MongoDB 允许使用整数查询日期时间,仅匹配 int64。但是,在存储数据时,输入的类型会保持不变。
您可能知道,JSON 没有表示日期/时间的数据类型,因此 MongoDB 定义了一种扩展的 JSON 格式来携带附加类型数据,以允许导入/导出文档,同时保留 JSON 不支持的数据类型。
具体到这个实例, UTC 日期时间的 MongoDB 扩展 JSON 表示为:
MongoDB Atlas 和 Compass 能够导入/导出扩展 JSON,因此您应该能够使用该格式。
经过大量试验后,我发现可以通过以下命令使用 python 添加记录:
查看 MongoDB 数据库中的记录后,这是 MongoDB 具有的格式,并且在导入 JSON 时有效:
出现此问题的原因是 MongoDB 在导入期间需要有效的 JSON 和 BSON 结构,而您的输入中存在一些语法和数据类型问题。还有,像“1728714859000”这样的字符串将不会被正确解释为时间戳。希望这能解决您的问题