Mongodb 如何找到最佳数组匹配
我有quiz1、quiz2和quiz3,我想根据quiz3中的标记向用户推荐一个测验,quiz1或quiz2都可以,而不需要获取集合中的每个文档,并在应用程序级别上对它们进行处理Mongodb 如何找到最佳数组匹配,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有quiz1、quiz2和quiz3,我想根据quiz3中的标记向用户推荐一个测验,quiz1或quiz2都可以,而不需要获取集合中的每个文档,并在应用程序级别上对它们进行处理 Quiz_1 = { _id:"...", tags:["life-style","personalit
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"]
};
这里最好的匹配是测验2,因为测验3匹配测验2和2个标记,而测验1只匹配1个标记。(更多的标记匹配就意味着更好的匹配)我如何使用猫鼬做到这一点 说明: 我有一个名为“测验”的集合,我希望mongodb在我输入时返回第二个文档(标签:[“生活方式”、“数学”、“智能”、“学校”)
基本上,您希望获得文档中比较数组和
“tags”
数组的名称。然后,您需要在顶部获得最大的“尺寸”,最后得到一个结果:
var compare = ["life-style","maths","inteligence","school"];
Quizzes.aggregate([
{ "$match": { "tags": { "$in": compare } } },
{ "$project": {
"size": {
"$size": {
"$setIntersection": [ compare, "$tags" ]
}
}
}},
{ "$sort": { "size": -1 } },
{ "$limit": 1 }
])
您可以通过使用来检查实际至少有一个匹配项的文档,从而加快速度。显然是这样吗?为什么?你认为你能解释为什么吗?因为测验3与测验2匹配2个标记,与测验1匹配1个标记,所以你在寻找每个学期的“集合的最大交集”。但我不明白这对“用户”有什么影响。用户是否应该有自己的交叉术语列表?请继续解释。当然是在这个问题上。还没有你想象的那么清楚。最后我们得到了一个解释。在这里提问时,不要在问题标题中使用标记名。这就是我把它拿走的原因。谢谢,尼尔!你是最棒的!
var compare = ["life-style","maths","inteligence","school"];
Quizzes.aggregate([
{ "$match": { "tags": { "$in": compare } } },
{ "$project": {
"size": {
"$size": {
"$setIntersection": [ compare, "$tags" ]
}
}
}},
{ "$sort": { "size": -1 } },
{ "$limit": 1 }
])