MongoDB在使用$in运算符时查找元素最匹配的文档

MongoDB在使用$in运算符时查找元素最匹配的文档,mongodb,mongoose,aggregation-framework,Mongodb,Mongoose,Aggregation Framework,所以,我有下一个模式,它是一个汽车零件索引,用于根据关键字自动查找零件类型 nameEnglish: { type: String }, keywords: [{ type: String }] myArr = ['b', 'c', 'f']; db.collection.find({ keywords: { $in: myArr } }); 我在数据库中有两个文档,一个是: [ { _id: 1, nameEnglish: 'abcdef', keywords: ['a', '

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

nameEnglish: {
  type: String
},
keywords: [{
  type: String
}]
myArr = ['b', 'c', 'f'];
db.collection.find({ keywords: { $in: myArr } });
我在数据库中有两个文档,一个是:

[
  { _id: 1, nameEnglish: 'abcdef', keywords: ['a', 'b', 'c', 'd', 'e', 'f'] },
  { _id: 2, nameEnglish: 'cde', keywords: ['c', 'd', 'e'] }
]
我现在想做的是用匹配的关键字的数量查询这个集合

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

我希望它总是返回第一个文档,因为它有3个匹配的关键字,而第二个只有一个。如何实现这一点?

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

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

您需要将聚合与
$setcrossion
一起使用,以获得匹配数,并按匹配数排序,限制预期的结果数

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

您可以尝试使用
$setcrossion
在聚合下面查找
关键字
数组和输入数组之间的匹配元素,然后使用
$size
计算匹配元素,然后使用
$sort
降序和
$limit
1输出最匹配的文档

您可以使用项目排除
{$project:{count:0}}
作为最终阶段来删除count字段

db.col.aggregate(
    [{
        $addFields: {
            "count": {
                $size: {
                    $setIntersection: ["$keywords", myArr]
                }
            }
        }
    }, {
        $sort: {
            "count": -1
        }
    }, {
        $limit: 1
    }]
)

您可以尝试使用
$setcrossion
在聚合下面查找
关键字
数组和输入数组之间的匹配元素,然后使用
$size
计算匹配元素,然后使用
$sort
降序和
$limit
1输出最匹配的文档

您可以使用项目排除
{$project:{count:0}}
作为最终阶段来删除count字段

db.col.aggregate(
    [{
        $addFields: {
            "count": {
                $size: {
                    $setIntersection: ["$keywords", myArr]
                }
            }
        }
    }, {
        $sort: {
            "count": -1
        }
    }, {
        $limit: 1
    }]
)