我有REST API
这样的/item/search
调用,其中附加了一些查询参数。
用户可以搜索某个字词的entire 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 必须为所有$ meta排序键 $ meta projection
我有什么方法可以进行部分OR
完整搜索,同时维护textScore并根据该分数对我生成的mongoose文档进行排序。
提前干杯谢谢。
答案 0 :(得分:2)
MongoDB的 find()
方法可以使用第二个可选参数来指示要返回的字段以及 $text
搜索的情况,特殊投影字段 $meta
可让您取回匹配文档的分数,以便对其进行排序。
尝试修改您的find()
查询以将查询和 $meta
投影作为find()
参数而不是or()
方法进行修改:< / p>
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);
});