我在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的身份证?

推荐答案

我已经提交了一份对你文章标题的编辑,考虑到这对你的问题有点误导.您并没有按照指示try 更新_id字段,而是您的Python字典定义与BSON规范不兼容.

在这方面:

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

在Mongo术语中,您有一个数字(整数)作为文档的键值.源于JSON,在BSON规范中,这是无效的.您的密钥must应该是规范中要求的字符串.

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

为了兼容,需要将Python代码中的所有keys都保持为strings.

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

将密钥的表示形式更改为字符串将解决此问题.

作为一个注释,考虑您的文档 struct ,因为在使用MyGDB文档集合时使用这种类型的符号(如果您想访问numerical索引)有几个缺点.

Mongodb相关问答推荐

在MongoDB中获取所有帖子时如何获取相关用户信息

MongoDB - 来自先前匹配文档的聚合匹配字段

MongoDB - 家庭作业(job)帮助.不确定如何在 mongodb 中访问文档中的变量

mongoDB 过滤、排序和排名结果

Mongoose 返回包含属性内任何位置的值的所有文档

Mongo 删除最后的文件

mongoose通过引用属性查找文档

为什么mongodb的文档中存储键名

如何检索 MongoDb 集合验证器规则?

使用 MongoDB C# 驱动程序在嵌套数组上使用过滤器生成器进行查询

Mongodb将重音字符匹配为基础字符

pymongo 排序和 find_one 问题

在 mongodb 的一次更新调用中推送到两个单独的数组

如何在 MongoDB Map-reduce 映射函数中使用变量

没有参考选项的mongoose填充字段

有人在 Google App Engine 上try 过 MongoDB 吗?

填充mongoose后查找

更新时提示Field name duplication not allowed with modifiers

Lombok - java.lang.StackOverflowError:toString 方法上的 null

AsQueryable 方法是否在新的 Mongodb C# 驱动程序 2.0rc 中离开?