MongoDB4.2迁6+Mongoose升级后textScore元数据错误求助
解决MongoDB 6.0 + Mongoose 6.11.1中
MongoServerError: query requires text score metadata, but it is not available错误 错误原因
MongoDB 6.0对文本查询的textScore元数据获取做了严格限制:只有当查询条件中包含$text操作符时,才能在投影(projection)或排序中使用$meta: "textScore"。如果你的parameters查询对象里没有$text相关条件,直接在投影里声明score: {$meta: "textScore"}就会触发这个错误——因为此时不存在文本匹配的分数元数据。
而MongoDB 4.2版本对这个限制更宽松,允许在非文本查询中声明该投影(虽然此时score值无意义),这就是迁移后报错的核心原因。
解决步骤
1. 分场景处理投影与排序
根据业务逻辑中是否存在文本搜索需求,动态调整投影字段和排序规则:
- 当查询包含
$text(即正在做文本搜索)时,才添加score投影,并优先按textScore排序; - 非文本查询场景下,不添加
score投影,沿用原有排序规则。
2. 修改代码示例
针对你提供的代码,修改如下:
// 初始化投影和排序规则 let projection = { password: 0, selected_catalogs: 0 }; let querySort = { ...sort }; // 判断当前是否为文本查询 if (parameters.$text) { // 添加textScore投影 projection.score = { $meta: "textScore" }; // 优先按文本匹配分数排序,再叠加原有排序规则 querySort = { score: { $meta: "textScore" }, ...querySort }; } async.parallel({ total: cb => user.countDocuments(parameters).exec(cb), users: cb => user.find(parameters, projection, { skip: (page-1)*limit, limit: limit }) .populate('rate') .sort(querySort) .lean() .exec(cb), }, (err, results) => { console.log(err); if (err) return res.status(400).json(err); Consume.setUsersConsume(results.users).then(users => { let pages = Math.ceil(results.total/limit); users = _.sortBy(users, sort_by); if (sort_direction === -1) users.reverse(); return res.json({ total: results.total, per_page: limit, current_page: page, last_page: pages, next_page_url: (page + 1) > pages ? null : 'http://' + config.get('external.main.api.url') + '/billing/users?page=' + (page + 1), prev_page_url: (page - 1) < 1 ? null : 'http://' + config.get('external.main.api.url') + '/billing/users?page=' + (page - 1), from: (page-1)*limit + 1, to: ((page-1)*limit + limit) > results.total ? results.total : ((page-1)*limit + limit), users, rates: rates }).end(); }, error => { return res.status(500).json(error); }); });
3. 验证索引有效性
你提供的文本索引是正常的,覆盖了company.name、contact下的多个字段及email,符合文本搜索的需求,无需调整。
额外说明
- 文本搜索场景下,直接通过MongoDB的
sort({ score: { $meta: "textScore" } })排序比在内存中排序效率更高,也能避免后续手动排序的逻辑冗余; - 非文本搜索场景下,
textScore本身不存在,所以不需要也无法获取该字段,移除投影即可正常运行。
内容的提问来源于stack exchange,提问作者Никита Середа
相关产品推荐
相关产品推荐

