计算Jaccard-Index - $ size返回string类型的值

时间:2018-06-18 10:18:32

标签: mongodb mongodb-query

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