我想知道是否可以在MongoDB中使用捕获组。
例如,假设我有一个只有全名的用户集合,我想得到他们的名字和姓氏。
以下是我使用捕获组的想法:
bulk.find( { full_name: /<first_name>(.*) <last_name>(.*)/i } ).upsert().replaceOne(
{
first_name: <first_name>,
last_name: <last_name>
}
);
bulk.execute();
是否可以只使用MongoDB?你会怎么做?
答案 0 :(得分:3)
也许使用javascript:
doc here:http://docs.mongodb.org/manual/reference/method/cursor.forEach/
示例:
db.collection.find().forEach(function(e) {
var fullName = e.full_name
e.firstname = full_name.substring(\*something*\)
e.lastname = full_name.substring(\*something*\)
db.collection.save(e);
});
答案 1 :(得分: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" ] } }