计算 Jaccard-Index - $size返回字符串类型的值



我想根据查询数组计算每个文档的Jaccard索引。

收集

{
model: Pants,
colors: [green, blue]
},
{
model: Trousers,
colors: [red, blue, yellow]
},
...

查询的预期结果:['绿色']

{
model: Pants,
jaccard_index: 0.5
},
{
model: Trousers,
jaccard_index: 0
},
...

聚合管道

Query: ['green']
db.clothes.aggregate([
{'$project': 
{'model': 1, 
'colors': 1,
'colors_intersection': {'$setIntersection': ['$colors', ['green']]}, 
'colors_union': {'$setUnion': ['$colors', ['green']]}}}, 
{'$project': 
{'model': 1, 
'colors': 1, 
'intersection_len': {'$size': '$colors_intersection'}, 
'union_len': {'$size': '$colors_union'} }}, 
{'$project': 
{'model': 1, 
'colors': 1,
'jaccard_index': {'$divide': ['$intersection_len', 'union_len'] } }}
])

问题1

当我执行此查询时,我收到以下错误消息:

$divide仅支持数字类型,不支持 int 和字符串

我想这意味着运算符$size将计算出的整数作为字符串返回,但为什么呢?

问题2

是否可以合并所有三个阶段并在一个投影中计算杰卡德指数?

感谢您的帮助!

我休息了一下,现在它适用于以下聚合:

db.clothes.aggregate([
{'$project': 
{'model': 1, 
'jaccard_index':
{ '$divide': [{'$size': {'$setIntersection': ['$colors', ['green']]}},
{'$size': {'$setUnion': ['$colors', ['green']]}}] 
}
}
}
])

最新更新