2015-05-09 47 views
1

我一直在阅读并尝试了几个不同的代码片段,其他人已经取得了成功,但我似乎无法让它工作。Express js Mongoose替代MySQL%通配符

我想要的是用户只能使用部分术语进行搜索,即pe为'peter'。我想在搜索字词上使用通配符。

到目前为止我的代码,这是行不通的:

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

您正在使用RegExp进行此搜索。文字^表示该模式必须处于字符串的开始处,并且在末尾处为$。如果你只想匹配一部分,你并不需要添加它们,所以下面的例子:

new RegExp(term, "i") 

也有一个很好的机制,全文搜索内置的蒙戈。你可以从官方docs了解他们。

关于猫鼬中的查询,当有对象和检查回调时。返回的对象是文件数组,并且在JS空数组中被铸造为true语句。相反,请检查长度数组,如下所示:

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

非常感谢您的解释,我已更新我的代码,并且它现在按预期工作。我将对RegExp的使用做更多的研究。 – MikeF