MongoDB文本搜索报错:must have $meta projection for all $meta sort keys
解决MongoDB文本搜索排序报错:MongoError: must have $meta projection for all $meta sort keys
兄弟,你的问题出在两个核心点上,咱们一步步拆解修正:
错误原因分析
你碰到的报错提示已经说得很清楚:当使用$meta类型的字段做排序键时,必须在查询的**投影(projection)**里明确声明这个$meta字段。除此之外还有个隐藏问题——你现在用的是正则表达式查询,正则查询不会生成textScore,只有MongoDB官方的文本搜索($text操作符)才会返回可用于排序的textScore值。
修正步骤
1. 先确认text索引有效性
先检查你创建的text索引是否正确针对description字段,在MongoDB Shell里执行:
db.yourCollectionName.getIndexes()
如果没有看到类似{ "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "description_text", "weights" : { "description" : 1 } }的索引记录,先重新创建索引:
db.yourCollectionName.createIndex({ description: "text" })
2. 替换正则查询为文本搜索语法
把原来的正则查询换成$text + $search的官方文本搜索方式,这样才能生成textScore用于排序:
// 多个关键词用空格分隔,MongoDB会自动处理全文匹配 var query = { $text: { $search: 'abaaba abadaba woobydooby' } };
(如果需要精确匹配某个短语,可以用双引号包裹,比如$search: '"abaaba"')
3. 添加投影声明score字段
在find()方法的第二个参数里,明确指定返回score字段并标记为$meta: 'textScore',这是解决报错的关键:
最终修正后的代码
var query = { $text: { $search: 'abaaba abadaba woobydooby' } }; var sort = { score: { $meta: 'textScore' } }; var limit = 50; Collection // 第二个参数是投影,必须声明score的$meta类型 .find(query, { score: { $meta: 'textScore' } }) .sort(sort) .limit(limit) .exec(function (err, records) { if (err) { console.log(err); } else { console.log(records); } });
额外说明
- 如果你一定要用正则查询,那没办法使用
textScore排序,只能改用普通字段(比如_id、创建时间等)做排序依据,因为正则查询不支持生成textScore。 - 你的MongoDB 3.6版本完全支持上述文本搜索和排序操作,版本兼容没问题。
内容的提问来源于stack exchange,提问作者Merge-pony
相关产品推荐
相关产品推荐

