如何根据在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()
方法可以接受第二个可选参数,指出要返回哪些字段,在$text
search的情况下,特殊投影字段$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); });