我有一个 REST API
调用,例如 /item/search
,它附加了一些查询参数。
用户可以搜索整个词条
或只搜索词条的3个或更多字符
。
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
这样的查询,
我们得到以下错误,
Can't canonicalize query: BadValue must have $meta projection for all $meta sort keys
有什么方法可以进行部分OR
完整搜索,同时保留 textScore 并根据该分数对生成的 mongoose 文档进行排序。
提前干杯和感谢。
最佳答案
MongoDB 的 find()
方法可以采用第二个可选参数,指示要返回哪些字段,在您的情况下是 $text
搜索,特殊的投影字段$meta
允许您取回匹配文档的分数,以便您可以对其进行排序。
尝试修改您的 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);
});
关于javascript - 如何根据它是 Node.JS 中的 $regex 还是 $text 对 Mongoose 结果进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29631097/