javascript - 如何根据它是 Node.JS 中的 $regex 还是 $text 对 Mongoose 结果进行排序?

标签 javascript regex node.js mongodb mongoose

我有一个 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/

相关文章:

javascript - 加入和着色 TR

javascript - 根据 Html RadioButtonFor 的值隐藏/显示输入字段,并在显示时强制执行

javascript - 提取字符串并将其存储为变量

javascript - 用于匹配某些 url 的正则表达式

javascript - 函数虽然有值但返回未定义

javascript - 如何传递参数信息异步队列饱和或不饱和?

javascript - nodejs 比较 Unicode 文件名

javascript - 下载文件并在下载应用程序或 cordova 应用程序的通知中显示它

javascript - 在其他元素之上打开元素

regex - grep 特定字符串并计算致命和错误的数量