正则表达式:捕获组?

4
我想知道在MongoDB中是否可以使用捕获组。
例如,假设我有一个用户集合,只有他们的全名,而我想要获取他们的名字和姓氏。
我考虑使用捕获组来实现这一目标:
bulk.find( { full_name: /<first_name>(.*) <last_name>(.*)/i } ).upsert().replaceOne(
   {
     first_name: <first_name>,
     last_name: <last_name>
   }
);
bulk.execute();

使用MongoDB是可行的吗?如果是,你会如何实现?
2个回答

3

做得很好。谢谢!我甚至不知道你可以放置Javascript :o) - Romain
1
这不仅仅是使用MongoDB。db.collection.find()返回一个(Javascript)游标对象,覆盖所有文档。游标上的forEach方法将函数应用于每个结果,这使得对数据库进行一次调用。因此,如果您的集合有1234567个文档,则上述代码至少会对数据库进行1234568次调用。在MongoDB查询中,捕获组在(2.6)中不可用,因此您需要像答案一样做一些事情,可能需要分批处理。 - wdberkeley
感谢@wdberkeley的补充,你说得对,性能确实不好! - Romain

0

MongoDB 4.2版本(于2019年8月发布)提供了regexFind operator。根据文档:

在聚合表达式中提供正则表达式(regex)模式匹配功能。如果找到匹配项,则返回包含有关第一个匹配项的信息的文档... 如果您的正则表达式模式包含捕获组并且该模式在输入中找到匹配项,则结果中的捕获数组对应于由匹配字符串捕获的组。

语法:

{ $regexFind: { input: <expression> , regex: <expression>, options: <expression> } }

例如(我没有验证你的正则表达式是否符合你的要求)
db.collection.aggregate([
  {
    $project: {
      names: {
        $regexFind: { input: "$phone", regex: /(.*) (.*)/i }
      }
    }
  }
])

输出将会是:

{ "names" : { "match" : "John Doe", "idx" : 0, "captures" : [ "John", "Doe" ] } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接