为什么使用整数作为pymongo的关键不起作用?

时间:2014-02-06 01:50:06

标签: python mongodb dictionary pymongo

我在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,将错误更改为key,相应地为2

这是为什么?我在Mongo中遗漏了一些关于ID的内容吗?

1 个答案:

答案 0 :(得分:11)

我已经提交了对您帖子标题的修改,因为它对您遇到的问题有些误导。您没有尝试按指示更新_id字段,而是您的Python字典定义与BSON规范不兼容。

在这一行:

data = {'foo': 'bar', 'baz': {1: {'a': 'B'}}, '_id': 'AB123456789'}

您有一个数字(整数)作为Mongo术语中的文档的键值。在BSON规范中从JSON派生,这是无效的,您的密钥必须是规范中要求的字符串。

bson.errors.InvalidDocument: documents must have only string keys, key was 1

您需要将Python代码中的所有密钥保留为字符串才能符合要求。

data = {'foo': 'bar', 'baz': {'1': {'a': 'B'}}, '_id': 'AB123456789'}

将键的表示更改为字符串修复问题。

作为一个注释,请考虑一下您的文档结构,因为使用这种类型的表示法(如果您想要访问MongoDB文档集合中的数字索引)而不是使用数组有几个缺点。< / p>