Mongodb 如何找到最佳数组匹配

Mongodb 如何找到最佳数组匹配,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,我有quiz1、quiz2和quiz3,我想根据quiz3中的标记向用户推荐一个测验,quiz1或quiz2都可以,而不需要获取集合中的每个文档,并在应用程序级别上对它们进行处理 Quiz_1 = { _id:"...", tags:["life-style","personalit

我有quiz1、quiz2和quiz3,我想根据quiz3中的标记向用户推荐一个测验,quiz1或quiz2都可以,而不需要获取集合中的每个文档,并在应用程序级别上对它们进行处理

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 }
 ])