Mongoose如何统计每条记录tags字段与给定数组的匹配项数量
你可以通过MongoDB的集合操作符$setIntersection结合$size实现匹配得分统计,以下是完整的Mongoose聚合查询代码:
const targetTags = [1, 2, 3]; // 把这里的YourModel替换为你实际的Mongoose模型名称 YourModel.aggregate([ // 【可选,推荐加】提前过滤完全无匹配标签的文档,提升大数量下的查询效率 { $match: { tags: { $in: targetTags } } }, // 计算每条记录的匹配得分 { $addFields: { score: { $size: { $setIntersection: ["$tags", targetTags] } } } }, // 【可选】如果没加前置过滤,可以在这里过滤掉得分为0的记录 { $match: { score: { $gt: 0 } } }, // 输出符合你要求的字段结构 { $project: { _id: 0, // 不需要返回_id可以设置为0隐藏 name: 1, description: 1, tags: 1, score: 1 } } ]) .then(result => { // 处理返回结果 console.log(result); }) .catch(error => { // 异常处理 console.error(error); });
逻辑说明
$setIntersection用于计算两个数组的交集,返回同时存在于文档tags字段和你给定的targetTags数组中的元素$size统计交集数组的长度,就是你需要的匹配得分- 不需要过滤0分记录的话,直接删除两个
$match阶段即可 - 最终返回的结构和你要求的格式完全一致
内容的提问来源于stack exchange,提问作者Mike Shiv
相关产品推荐
相关产品推荐

