我想基于查询数组计算每个文档的Jaccard-Index。
集合
{
model: Pants,
colors: [green, blue]
},
{
model: Trousers,
colors: [red, blue, yellow]
},
...
查询的预期结果:['green']
{
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和string我想这意味着运算符
$size
将计算出的整数作为字符串返回,但为什么呢?问题2
是否可以合并所有三个阶段并仅在一次投影中计算Jaccard指数?
感谢您的帮助!
1 个答案:
答案 0 :(得分:0)
我休息一下,现在它适用于以下聚合:
db.clothes.aggregate([ {'$project': {'model': 1, 'jaccard_index': { '$divide': [{'$size': {'$setIntersection': ['$colors', ['green']]}}, {'$size': {'$setUnion': ['$colors', ['green']]}}] } } } ])