Express js Mongoose替代MySQL%Wildcard

时间:2015-05-09 10:09:01

标签: node.js mongodb express mongoose

我一直在阅读并尝试了一些其他人已经取得成功的不同代码段,但我似乎无法让它发挥作用。

我喜欢的是用户只使用部分术语进行搜索,即“peter”#pe;'。我想在搜索字词上加上通配符。

到目前为止我的代码,它不起作用:

router.get('/:callsign', function(req,res){
var search = req.params.callsign;
var term = escape(search);
term = term.toUpperCase();
if(search=="*" || search==""){
    res.redirect("/");
}
User.find({'callsign' : new RegExp('^'+term+'$', "i") }, function(err, callsign){
    if(err)
    {
        console.log('No user found'+err);
        req.flash('message','Sorry, something went wrong. Try again.');
        res.render('callSearchResults'),{
            message: req.flash('message'), 
            title: 'Sorry, no results'
        }
    }
    if(callsign){
        console.log('Callsign:'+callsign+term);
        res.render('callSearchResults',{
            call: callsign,
            title: 'You searched for '+search,
            query: term
        });
    }else{
        console.log('No entries found'+search);
    }
});
});

此外,'呼号'回调永远是真的 - 即使没有结果!

1 个答案:

答案 0 :(得分:1)

您正在使用RegExp进行此搜索。文字^表示模式必须位于字符串的开头,而$表示结尾处。如果您只想匹配部分,则不需要添加它们,例如下面的示例:

new RegExp(term, "i")

还有一个很好的全文搜索内置mongo机制。您可以从官方docs了解它们。

关于mongoose中的查询,当有对象并检入回调时。返回的对象是文档数组,在JS中,空数组被转换为true语句。而是检查lenght数组,如下所示:

if(callsign.length > 0) {
  // Logic
} else {
  // Nothing found
}