使用$ in运算符时,MongoDB查找包含大多数匹配元素的文档

时间:2018-01-24 06:07:33

标签: mongodb mongoose aggregation-framework

所以,我有下一个模式,它是汽车零件的索引,用于根据关键字自动查找零件类型。

nameEnglish: {
  type: String
},
keywords: [{
  type: String
}]

我在数据库上有两个文件,一个是:

[
  { _id: 1, nameEnglish: 'abcdef', keywords: ['a', 'b', 'c', 'd', 'e', 'f'] },
  { _id: 2, nameEnglish: 'cde', keywords: ['c', 'd', 'e'] }
]

我现在要做的是使用 MOST 匹配的关键字数查询此集合。

myArr = ['b', 'c', 'f'];
db.collection.find({ keywords: { $in: myArr } });

我希望这总是返回第一个文档,因为它有3个匹配的关键字,第二个只有一个。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

您需要使用$setIntersection聚合来获取匹配数,并按匹配数排序,限制为预期的结果数。

db.col.aggregate([
{$addFields : {noOfMatch :{$size :{$setIntersection : ["$keywords", ['b', 'c', 'f']]}}}},
{$sort : {"noOfMatch" : -1}},
{$limit : 1}
])

答案 1 :(得分:1)

您可以使用$setIntersection尝试以下聚合,以查找keywords数组和输入数组之间的匹配元素,然后$size计算匹配的元素,$sort降序和{ {1}} 1输出匹配最多的文档。

您可以使用项目排除$limit作为最后阶段删除计数字段。

{$project:{count:0}}