2017-06-21 96 views
1

我有quiz1,quiz2和quiz3,我想根据来自quiz3的标签向用户推荐一个测验,不论是测验1还是测验2,而不需要采集集合中的每个文档并对其进行处理在应用程序级别上。如何找到最佳数组匹配

Quiz_1 = {             
    _id:"...",             
    tags:["life-style","personality","sports","soccer"]   
}; 

Quiz_2 = { 
    _id:"...", 
    tags:["IQ","inteligence","science","maths"] 
}; 

Quiz_3 = { 
    _id:"...",             
    tags:["life-style","maths","inteligence","school"]   
}; 

这里最好的配对是quiz_2,因为quiz_3匹配quiz_2和2个标签,匹配quiz_1和1个标签。 (更多的标签匹配等于更好的匹配)我如何使用猫鼬做到这一点?

说明:

我有一个集合名为“测验”和我想的MongoDB当我输入(标签返回第二个文件:“生活方式”,“数学”,“智力”,“学校“])

quizzes: 
[ 
    { 
    _id:..., 
    tags:["life-style","personality","sports","soccer"]] 
    }, 
    { 
    _id:"...", 
    tags:["IQ","inteligence","science","maths"] 
    }, 
    { 
    _id:"...", 
    tags:["life-style","maths","inteligence","school"] 
    } 
] 
+1

显然?为什么?你认为你可以解释为什么? –

+0

,因为quiz_3与2个标签匹配quiz_2并仅匹配1个标签的quiz_1 –

+1

因此,您正在寻找每个术语的“最大交集”。但我不明白这是如何适用于“用户”。用户是否应该有自己的术语列表相交?请继续解释。在当然的问题。它似乎还没有你想象的那么清楚。 –

回答

1

基本上你想获得比较阵列的$setIntersection$size"tags"阵列在文档中。然后你$sort至顶得上最大的“大小”,终于$limit一个结果:

var compare = ["life-style","maths","inteligence","school"]; 

Quizzes.aggregate([ 
    { "$match": { "tags": { "$in": compare } } }, 
    { "$project": { 
    "size": { 
     "$size": { 
     "$setIntersection": [ compare, "$tags" ] 
     } 
    } 
    }}, 
    { "$sort": { "size": -1 } }, 
    { "$limit": 1 } 
]) 

你只检查实际需要通过使用$in至少有一个匹配的文件加快速度。