PyMongo 3.11.0调用map_reduce方法提示不存在的问题求助
解决PyMongo中
TypeError: 'Collection' object is not callable的问题 首先明确:PyMongo 3.11.0中并没有移除map_reduce()方法,这个方法仍然存在于Collection对象上,你遇到的报错大概率是代码里的小细节问题导致的。
最可能的原因:代码笔误
你的报错TypeError: 'Collection' object is not callable通常发生在你把Collection对象(也就是db.races)当成函数调用的时候——比如不小心漏写了.map_reduce,写成了:
result = db.races(map, reduce, 'myresults') # 这里漏了关键的.map_reduce!
这种写法会直接调用db.races这个集合对象,自然会触发"对象不可调用"的错误。
一个重要的规范:避免覆盖Python内置函数
你用了map和reduce作为变量名,这两个是Python的内置函数,虽然这不是你当前报错的直接原因,但这是非常不好的编码实践,后续可能引发其他奇怪的问题。建议把变量名改成比如map_func和reduce_func:
from bson.code import Code map_func = Code("function () { emit('races', 1); }") reduce_func = Code("function (key, values) { var count = 0; values.forEach(function(v) { count += v; }); return count; }") result = db.races.map_reduce(map_func, reduce_func, 'myresults')
确认方法名的正确性
PyMongo中对应的方法名是**map_reduce(下划线分隔)**,而不是mapReduce(驼峰式)——后者是MongoDB Shell中的写法,在PyMongo里并不存在。如果你写成db.races.mapReduce(...)会触发AttributeError,但不是你当前的TypeError,不过也要注意区分两者的差异。
额外检查:确保db.races是合法的Collection对象
可以先打印type(db.races)确认它是pymongo.collection.Collection类型,比如:
print(type(db.races)) # 正常输出应该是<class 'pymongo.collection.Collection'>
如果不是,说明你的数据库连接或集合名存在问题,需要确认你正确连接了数据库:
from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') db = client['your_database_name'] # 替换成你的实际数据库名 print(db.list_collection_names()) # 确认races集合在输出列表中
按照上面的步骤排查,应该能快速解决你的问题。
内容的提问来源于stack exchange,提问作者he66el
相关产品推荐
相关产品推荐

