如何根据在Node.JS中是$ regex还是$ text来对Mongoose结果进行sorting?

我有一个REST API调用像/item/search ,它附带了一些查询参数。

用户可以searchentire term或者一个术语的3 or more characters

Node.JS输出函数如下,

 exports.getSearchedItems = function(req,res){ var searchText = req.query.q; var searchedString = searchText.replace(/ /g,"|"); var nameRegex = new RegExp('\\b' + searchedString + '.*', 'i'); Item.find() .or([ {$text: {$search: searchText } }, {'name': {$regex: nameRegex } }, {'score':{'$meta': 'textScore'} ] ) .sort({'score':{'$meta': 'textScore'}} .exec(function(err, items){ if(err) console.log('Error Finding Query ' +err); res.send(items); }); }; 

查询喜欢item/search?q=new+2

我们得到下面的错误,

无法规范化查询: BadValue必须对所有$ metasorting键进行$ meta投影

有什么办法可以做一个部分OR完整的search,但维护textScore和sorting我的结果mongoose文件按照该分数。

欢呼声和感谢提前。

MongoDB的find()方法可以接受第二个可选参数,指出要返回哪些字段,在$textsearch的情况下,特殊投影字段$meta允许您获取匹配文档的分数,以便对其进行sorting。

尝试修改您的find()查询以包含查询和$meta投影作为find()参数而不是or()方法:

 Item.find( { "$or":[ {"$text": {"$search": searchText } }, {"name": {"$regex": nameRegex } } ] }, { "score" : { "$meta" : "textScore"} }) .sort({"score": { "$meta": "textScore"} }) .exec(function(err, items){ if(err) console.log("Error Finding Query " + err); res.send(items); });