MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影
Posted
技术标签:
【中文标题】MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影【英文标题】:MongoError: must have $meta projection for all $meta sort keys using Mongo DB Native NodeJS Driver 【发布时间】:2018-08-05 03:41:54 【问题描述】:直接在 MongoDB 上运行以下文本搜索不会出现任何问题:
db.getCollection('schools').find(
$text:
$search: 'some query string',
$caseSensitive: false,
$diacriticSensitive: true
, score: $meta: "textScore").sort(score:$meta:"textScore")
但是,当尝试使用 native NodeJS driver 运行相同的查询时:
function getSchools(filter)
return new Promise(function (resolve, reject)
MongoClient.connect('mongodb://localhost:60001', function(err, client)
const collection = client.db('schools').collection('schools');
collection.find(
$text:
$search: filter,
$caseSensitive: false,
$diacriticSensitive: true
, score: $meta: "textScore").sort(score:$meta:"textScore").toArray(function(err, docs)
if (err) return reject(err);
resolve(docs);
);
);
);
我收到以下错误:
MongoError: must have $meta projection for all $meta sort keys
我在这里做错了什么?
【问题讨论】:
【参考方案1】:在当前版本的原生MongoDB驱动中,需要包含projection
key among the options for find
:
const results = await collection.find(
$text: $search: filter
,
projection: score: $meta: 'textScore' ,
sort: score: $meta: 'textScore' ,
).toArray();
【讨论】:
【参考方案2】:好的,根据this bug自3.0.0版本起find
和findOne
no longer supportfields
参数和查询需要改写如下:
collection.find(
$text:
$search: filter,
$caseSensitive: false,
$diacriticSensitive: true
)
.project( score: $meta: "textScore" )
.sort(score:$meta:"textScore")
【讨论】:
在此处查找文档:mongodb.github.io/node-mongodb-native/3.0/api/… 那么他们为什么不相应地更新textScore sort example in their very own documentation?! :rolleyes: 感谢您指出这一点!可能为我节省了相当多的时间,尤其是因为错误消息并没有很好地提示实际错误...... 嗨,谁能告诉我是否必须按相同查询的相反顺序排序? @Christallkeks 因为这些是 mongo shell 的文档,nodejs 驱动程序文档是 here以上是关于MongoError: 必须使用 Mongo DB Native NodeJS Driver 对所有 $meta 排序键进行 $meta 投影的主要内容,如果未能解决你的问题,请参考以下文章
MongoError:未在 db 上授权执行命令?与 socket.io 连接时
MongoDB 通过 Mlab - MongoError:身份验证失败
MongoError:拓扑被破坏,我该如何修复它? [复制]
mongoDB开启的 --auth 之后,使用 db.eval() 报错MongoError: not authorized on wang to execute command