如何根据 Node.JS 中的 $regex 或 $ text 对 Mongoose 结果进行排序?

How to sort Mongoose results depending on whether it's a $regex or $ text in Node.JS?

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

用户可以搜索 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);
         });
};

一个查询 Like item/search?q=new+2,

我们得到以下错误,

Can't canonicalize query: BadValue must have $meta projection for all $meta sort keys

有什么方法可以进行部分 OR 完整搜索,同时保留 textScore 并根据该分数对生成的 mongoose 文档进行排序。

提前致谢。

MongoDB 的 find() 方法可以采用第二个可选参数,指示要 return 的字段以及 $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);
  });