我正在使用以下代码通过名字或姓氏搜索用户:
var re = new RegExp(req.params.search, 'i');
User.find()
.or([{ firstName: re }, { lastName: re }])
.exec(function(err, users) {
res.json(JSON.stringify(users));
});
如果search
等于'John'
或'Smith'
,则效果很好,但不适用于'John Sm'
。
任何线索如何完成这种查询?
谢谢!
免责声明:该问题最初出现在3年前的上一个问题的评论中,至今仍未得到解答。我正在开始一个新线程,因为1)这不是主要问题,并且2)我认为这很有趣,可以拥有自己的线程
编辑:
假设数据库包含两个记录:John Smith
和John Kennedy
。
John
应同时返回John Smith
和John Kennedy
John Sm
应仅返回John Smith
用单词分隔搜索词,然后使用交替运算符('|')将其分隔。
var terms = req.params.search.split(' ');
var regexString = "";
for (var i = 0; i < terms.length; i++)
{
regexString += terms[i];
if (i < terms.length - 1) regexString += '|';
}
var re = new RegExp(regexString, 'ig');
对于输入'John Smith'
,这将创建一个看起来像的正则表达式/John|Smith/ig
。对于单个单词,只要输入为真,就可以返回true。'John Sm'
你可以玩这个正则表达式来获得一个更适合您的需求。
编辑:
这里的问题是您的姓名字段是分开的。在这种情况下,对两个字段应用相同的正则表达式将不会得到所需的结果。正则表达式需要使用完整名称应用于相同的字段。
一个可能的解决方案是使用聚合:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句