为啥使用整数作为 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 的键不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 IE8 中输入表单中的键不起作用

使用整数作为关联数组的键在 iOS safari 上不起作用

为啥保留重复记录时h2复合主键不起作用?

为啥我的 foreach 循环与 users.json 文件中的键不匹配

为啥 PyQt 中的 keyPress 事件对 Enter 键不起作用?

为啥这个 pymongo 子文档找不到工作?