【问题标题】:bson.errors.InvalidDocument: key '$oid' must not start with '$' trying to insert document with pymongobson.errors.InvalidDocument: key '$oid' 不能以 '$' 开头尝试使用 pymongo 插入文档
【发布时间】:2017-06-24 15:35:37
【问题描述】:

我想将文档从 json 文件中插入到集合中,上面写着 bson.errors.InvalidDocument: key '$oid' must not start with '$' 我该如何解决?

文档示例: [{"name": "Company", "_id": {"$oid": "1234as123541gsdg"}, "info": {"email": "test@gmail.com"}}]

【问题讨论】:

  • 你能给出示例文件吗?看来您具有以“$”开头的文档 ID 的价值
  • 你很可能需要逃避$。一个简单的方法是:import re; re.escape({your variable here})
  • 我已经用文档示例更新了问题正文
  • "_id": "1234as123541gsdg" 有什么问题?
  • 当我将集合转储到 json 文件时得到它

标签: python pymongo


【解决方案1】:

尝试删除文件中的所有空格(\n,字符串引号外的空格)。它可能会像奇迹一样工作

【讨论】:

【解决方案2】:

在 Python 中使用 bson.ObjectId 类表示 ObjectId:

from bson import ObjectId

_id = ObjectId("5899e0aca600741755433908")

举个完整的例子:

from bson import ObjectId

collection.insert(
    {"name": "Company", "_id": ObjectId("5899e0aca600741755433908"),
     "info": {"email": "test@gmail.com"}})

为了加载 MongoDB Extended JSON 数据,请使用 PyMongo 的json_util.loads

from bson.json_util import loads

json_str = '[{"name": "Company", "_id": {"$oid": "5899e0aca600741755433908"}, "info": {"email": "test@gmail.com"}}]'

data = loads(json_str)
print(data)

for doc in data:
    collection.insert(doc)

“loads()”从带有“$oid”的扩展 JSON 语法转换为实际的 ObjectId 实例。

【讨论】:

  • 不客气!还有什么我应该添加到我的答案中的吗,或者您会将其标记为正确吗?
  • 有人知道Ruby是否有类似的东西吗?
  • 只是想说明一下,您可以使用 file.read() 从 json 文件中获取 json_str。 open("filepath", "r") as f: json_str = f.read()
猜你喜欢
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多