You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Никита Середа

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:13:31