查找 MongoDB 匹配部分 phone 数字数组的文档
Look up MongoDB for documents matching an array of partial phone numbers
作为某些 'people you may know' 功能的一部分,我们有一个应用程序可以发送用户联系人最后 9 位数字的数组(最后 9 位数字是因为用户存储联系方式的方式存在问题,例如使用国家代码等)。 API 然后必须执行查找,我们需要在我们的数据库中找到任何用户文档,其中任何用户 phone 号码的最后 9 位数字与数组中的 phone 号码相匹配。
我希望做这样的事情:
usersContacts = [123456789, 987654321, 123443212,...]
find: {
phoneNumber: {
$in: usersContacts,
$regex: 'Some last 9 digit match regex'
}
}
以下内容在聚合管道中有效:
$match: {
phoneNumStr: {
$in: [/861650975$/, /861650976$/]
}
}
上面的两个问题是我需要先将 phone 数字字段投影到字符串(这很好),但还需要通过循环发送的数组来添加 N 个不同的正则表达式语句通过应用创建 /{phoneNum}$/
这有任何性能问题吗?或者这样可以吗?
查询
- 将
usersContacts
保留为数字
- 仅将数据库中的phone转换为数字
- 是否使用数字(而不是字符串和正则表达式)进行 n 次比较
所以整体增益是不需要转换成字符串,比较数字而不是字符串,如果你有大数组,它会更快。
*假设 usersContacts
如果 phone 是 001234567
将只有 1234567
第一个零数字将丢失。 ($toInt
在数据库中也以这种方式工作,因此它们将相等)
aggregate(
[{"$match":
{"$expr":
{"$in":
[{"$toInt":
{"$substrCP":
["$phone", {"$subtract": [{"$strLenCP": "$phone"}, 9]}, 9]}},
[123456789, 12345678]]}}}])
作为某些 'people you may know' 功能的一部分,我们有一个应用程序可以发送用户联系人最后 9 位数字的数组(最后 9 位数字是因为用户存储联系方式的方式存在问题,例如使用国家代码等)。 API 然后必须执行查找,我们需要在我们的数据库中找到任何用户文档,其中任何用户 phone 号码的最后 9 位数字与数组中的 phone 号码相匹配。
我希望做这样的事情:
usersContacts = [123456789, 987654321, 123443212,...]
find: {
phoneNumber: {
$in: usersContacts,
$regex: 'Some last 9 digit match regex'
}
}
以下内容在聚合管道中有效:
$match: {
phoneNumStr: {
$in: [/861650975$/, /861650976$/]
}
}
上面的两个问题是我需要先将 phone 数字字段投影到字符串(这很好),但还需要通过循环发送的数组来添加 N 个不同的正则表达式语句通过应用创建 /{phoneNum}$/
这有任何性能问题吗?或者这样可以吗?
查询
- 将
usersContacts
保留为数字 - 仅将数据库中的phone转换为数字
- 是否使用数字(而不是字符串和正则表达式)进行 n 次比较
所以整体增益是不需要转换成字符串,比较数字而不是字符串,如果你有大数组,它会更快。
*假设 usersContacts
如果 phone 是 001234567
将只有 1234567
第一个零数字将丢失。 ($toInt
在数据库中也以这种方式工作,因此它们将相等)
aggregate(
[{"$match":
{"$expr":
{"$in":
[{"$toInt":
{"$substrCP":
["$phone", {"$subtract": [{"$strLenCP": "$phone"}, 9]}, 9]}},
[123456789, 12345678]]}}}])