Pymongo使用find查询嵌套字段报TypeError:string indices must be integers
问题原因
你出现报错不是find方法使用错误,是构造查询筛选条件的语法不符合规范:
- 你写的
mycol['segmentos'[{'etiquetas'[{'categoria'}]}]]属于完全错误的Python语法:'segmentos'是字符串类型,你直接给字符串传入字典作为索引,自然触发TypeError: string indices must be integers报错。 - Pymongo查询嵌套字段不需要套集合对象
mycol的索引,直接用MongoDB标准的点分隔符拼接嵌套字段路径作为查询条件的键即可。
正确实现代码
如果你的segmentos、etiquetas是数组类型,MongoDB的点查询会自动匹配数组内符合条件的元素,无需额外操作。如果只需要统计符合条件的文档数量,无需遍历计数,直接调用count_documents方法效率更高:
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclient["test"] mycol = mydb["a_test"] # 嵌套字段查询条件写法:用点拼接字段层级路径 query = {"segmentos.etiquetas.categoria": "3"} # 高效统计数量写法 count = mycol.count_documents(query) print(count) # 如果需要遍历获取文档做后续处理的写法 i = 0 for doc in mycol.find(query): # 这里可添加对单条文档的处理逻辑 i += 1 print(i)
补充说明
- 如果需要匹配数组内同一个元素同时满足多个条件,再使用
$elemMatch操作符,单个字段匹配的场景直接用上述点查询即可。 - 如果你的
categoria字段在数据库中存储的是数字类型而非字符串,把查询条件里的"3"改为3即可。
内容的提问来源于stack exchange,提问作者WsDoragon
相关产品推荐
相关产品推荐

