【问题标题】:Mongoose: query full name with regexMongoose:使用正则表达式查询全名
【发布时间】:2015-08-01 05:00:47
【问题描述】:

我正在使用以下代码按名字或姓氏搜索用户:

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 年前 this previous question 的 cmets 上,至今仍未得到解答。我正在开始一个新线程,因为 1)这不是主要问题,并且 2)我认为这很有趣,可以拥有自己的线程

编辑:

假设数据库包含两条记录:John SmithJohn Kennedy

  • 查询John 应该返回John SmithJohn Kennedy
  • 查询John Sm 应该只返回John Smith

【问题讨论】:

  • 嗯,问题是您的姓名字段是分开的。在这种情况下,将相同的正则表达式应用于两个字段不会产生您想要的结果。正则表达式需要应用于具有完整名称的同一字段。
  • 我明白了。这给我带来了一个问题,如果我可以在猫鼬中查询虚拟字段,我发现this question 答案是否定的。我想我会自己实现一个查询后过滤器并提交答案。谢谢 ZeMoon。

标签: regex node.js mongodb mongoose


【解决方案1】:

按单词分隔搜索词,并使用交替运算符 ('|') 分隔它们。

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 的正则表达式。当输入只是'John Sm'时,这将返回单个单词以及工作。

您可以使用此正则表达式play around 来获得更适合您需求的表达式。

编辑:

这里的问题是您的姓名字段是分开的。在这种情况下,将相同的正则表达式应用于两个字段不会产生您想要的结果。正则表达式需要应用于具有完整名称的同一字段。

一个可能的解决方案是使用聚合:

User.aggregate()
    .project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
    .match({fullName: re})

【讨论】:

  • 我试过了。但它也返回 John Kennedy 和查询 John Sm
  • 我用两个测试用例更新了答案。谢谢。
  • 是的,但它只返回带有John 的空结果,因为必须满足两个查询条件。我希望 John SmithJohn Kennedy 都会被退回。这是一个自动完成/搜索字段。
  • 哇。它起到了魅力的作用。这实际上大大简化了我的代码。非常感谢!
  • 您能否提供完整的代码,因为User.aggregate().project({fullName: {$concat: ['$firstName', ' ', '$lastName']}}).match({fullName: re}).exec(callback); 不适合我。
猜你喜欢
  • 2012-07-28
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多