为啥使用整数作为 pymongo 的键不起作用?
Posted
技术标签:
【中文标题】为啥使用整数作为 pymongo 的键不起作用?【英文标题】:Why using integer as a key with pymongo doesn't work?为什么使用整数作为 pymongo 的键不起作用? 【发布时间】:2014-03-02 18:46:35 【问题描述】:我已经在 python 中使用更大的数据集进行了尝试,但遇到了问题,所以我创建了一个小型测试集,也在 python 中使用 pymongo:
from pymongo import MongoClient
testColl = MongoClient().tDB.tColl
data = 'foo': 'bar', 'baz': 1: 'a': 'B', '_id': 'AB123456789'
testColl.insert(data)
这会返回
bson.errors.InvalidDocument: documents must have only string keys, key was 1
将 baz 中字典中的 1 替换为 2 会相应地更改键的错误为 2
这是为什么?我是否缺少有关 Mongo 中 id 的内容?
【问题讨论】:
这个错误是不言自明的:你必须使用string
只作为键。看看this question for guidance。
我以前读过这个问题,但我仍然不明白。我在顶层有一个 _id ,它是一个字符串。为什么 pymongo 拒绝它以支持内部字典的键?我可能遗漏了一些东西,此时我可能需要一个 eli5 才能得到它。
【参考方案1】:
我已经提交了对您帖子标题的修改,因为它对您遇到的问题有些误导。您没有尝试按照指示更新 _id
字段,而是您的 Python 字典定义与 BSON 规范不兼容。
在这一行:
data = 'foo': 'bar', 'baz': 1: 'a': 'B', '_id': 'AB123456789'
在 Mongo 术语中,您有一个数字(整数)作为文档的键值。从 JSON 派生,在 BSON 规范中这是无效的,您的密钥必须是规范中要求的字符串。
bson.errors.InvalidDocument: documents must have only string keys, key was 1
您需要将 Python 代码中的所有 键 保留为 字符串 以符合要求。
data = 'foo': 'bar', 'baz': '1': 'a': 'B', '_id': 'AB123456789'
将键的表示更改为字符串修复问题。
请注意,请考虑您的文档结构,因为在 MongoDB 文档集合中使用这种类型的表示法(如果您想访问 numerical 索引)比使用数组有几个缺点。
【讨论】:
哦!我想我明白了。它不仅是文档键,还包括文档中的每个键。这就是让我感到震惊的原因。谢谢 key 不代表主键 (_id),它代表任何字段名。键值对等以上是关于为啥使用整数作为 pymongo 的键不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
使用整数作为关联数组的键在 iOS safari 上不起作用
为啥我的 foreach 循环与 users.json 文件中的键不匹配