【发布时间】:2019-07-30 23:57:52
【问题描述】:
我正在尝试使用欧几里得算法在给定图像的数据库中找到颜色最接近的图像(因为我并不真正关心距离,所以我省略了 sqrt)。数据库中的每个项目都包含字段r、g、b。
这是我检索结果的代码:
r, g, b = utilities.get_avg_rgb(match_image.convert('RGB'))
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}},
{'$limit': 1}
])
但是,我收到以下错误:
<class 'tuple'>: (<class 'bson.errors.InvalidDocument'>, InvalidDocument("cannot encode object: {1, 'diff'}, of type: <class 'set'>"), <traceback object at 0x0F5483C8>)
我认为它说我正在尝试使用类 set 编码一个对象,但它不能这样做(?)但我找不到原因。
我可以知道为什么会发生这种情况以及如何解决它吗?谢谢
【问题讨论】:
-
我相信 $sort 运算符采用
<field1>: <sort order>,而您在其中有<field1>, <sort order>。试试{'$sort': {'diff': 1}} -
@It'sNotMe 是的,解决了这个问题,但现在我得到了一个新的异常
<class 'tuple'>: (<class 'pymongo.errors.OperationFailure'>, OperationFailure("Unrecognized pipeline stage name: '$set'"), <traceback object at 0x0EBFFC60>) -
@It'sNotMe 非常感谢您为我看到这个!我将尝试从这里开始工作,您介意将其作为答案以便我接受吗?