MongoDB find()投影排除功能服务端失效、本地测试正常问题咨询
问题成因
你遇到的问题核心是PyMongo(Python MongoDB驱动)版本的语法差异,和MongoDB服务端版本没有直接关联:
- 你本地环境安装的是PyMongo 3.x版本,该版本的
find()方法支持直接将投影配置作为第二个位置参数传入,也就是你原来的写法是符合3.x版本规范的,所以本地运行正常。 - 你的服务端环境安装的是PyMongo 4.0及以上版本,该版本调整了
find()方法的参数签名,第二个位置参数不再默认对应投影配置,必须显式使用projection=关键字参数传入投影规则,否则传入第二个位置参数会被识别为非法参数,直接抛出异常,Flask未捕获该异常就会返回500错误。
你移除投影参数后相当于调用无额外参数的find()方法,该写法在PyMongo 3.x和4.x版本中都兼容,所以可以正常运行。
解决方案
你可以选择任意一种方式修复,都可以保留投影排除规则:
- 方案1:调整参数写法,显式声明projection关键字参数,该写法同时兼容所有PyMongo 3.x、4.x版本:
all_records = list( streamers[streamer].find({}, projection={ 'date-edited':0, 'old-amount':0 }).limit(max_record_limit).sort([('amount', -1)]) )
- 方案2:将服务端的PyMongo版本降级到和本地一致的3.x版本,或者将本地PyMongo升级到4.x版本,统一驱动版本即可消除语法差异。
如果需要验证问题,你可以在服务端代码中添加异常捕获打印堆栈信息,会看到明确的参数不合法相关报错。
内容的提问来源于stack exchange,提问作者questionBan
相关产品推荐
相关产品推荐

