如何对Mongoose结果进行排序取决于它是否是Node.JS中的$ regex或$ text?

时间:2015-04-14 15:14:42

标签: javascript regex node.js mongodb mongoose

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

用户可以搜索某个字词的entire term3 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文档进行排序。

提前干杯谢谢。

1 个答案:

答案 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);
  });