我想根据查询数组计算每个文档的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']]}}]
}
}
}
])