所以,我有下一个模式,它是汽车零件的索引,用于根据关键字自动查找零件类型。
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个匹配的关键字,第二个只有一个。我怎样才能做到这一点?
答案 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}}