PyMongo编码错误求助:无法编码set类型对象问题排查
解决MongoDB聚合管道中InvalidDocument(set类型无法编码)的问题
你的问题根源其实很明显——在聚合管道的$sort阶段,你不小心用了集合(set)语法而非字典(dict)语法。
问题成因
看你代码里这一行:
{'$sort': {'diff', 1}}
这里的{'diff', 1}是Python的set对象(用逗号分隔元素的大括号),但MongoDB的聚合管道要求$sort接收的是一个键值对字典,用来指定排序字段和排序方向(1代表升序,-1代表降序)。Python的set类型无法被bson编码器序列化,所以才会抛出InvalidDocument("cannot encode object: {1, 'diff'}, of type: <class 'set'>")这个错误。
解决方法
只需要把$sort里的集合改成字典,把逗号换成冒号即可:
res = self.database_collection.aggregate([ {'$set': { 'diff': { '$sum': [{'$pow': [{'$sub': ['$r', r]}, 2]}, {'$pow': [{'$sub': ['$g', g]}, 2]}, {'$pow': [{'$sub': ['$b', b]}, 2]}] } }}, {'$sort': {'diff': 1}}, # 这里把逗号替换为冒号,将set转为合法的dict {'$limit': 1} ])
这样修改后,{'diff': 1}就是一个符合要求的字典,bson编码器可以正常处理,聚合管道也能按照diff字段升序排序,返回颜色差异最小的图片数据。
内容的提问来源于stack exchange,提问作者weilueluo
相关产品推荐
相关产品推荐

