作为一些'你可能认识的人'功能的一部分,我们有一个应用程序,发送用户联系人的最后9位数字的数组(最后9位数字,因为用户可能会使用国家代码等方式存储联系人详细信息)。然后,API必须执行查找,我们需要在数据库中找到任何用户文档,其中任何用户电话号码的后9位数字与数组中的电话号码匹配。
我希望这样做:
usersContacts = [123456789, 987654321, 123443212,...]
find: {
phoneNumber: {
$in: usersContacts,
$regex: 'Some last 9 digit match regex'
}
}
下面的操作可以在聚合管道中工作:
$match: {
phoneNumStr: {
$in: [/861650975$/, /861650976$/]
}
}
上面的两个问题是,我需要项目的电话号码字段为字符串第一(这是好的),但也需要添加N个不同的正则表达式语句通过循环通过应用程序发送的数组和创建/{phoneNum}$/
是否存在性能问题?或者这样可以吗?
- 保持
usersContacts
为数字 - 只将数据库中的电话转换为号码
- 使用数字(而不是字符串和正则表达式)进行n比较
所以总的增益是不需要转换为字符串,比较数字而不是字符串,如果你有一个大数组,它会更快。
*假设usersContacts
如果电话是001234567
将只有1234567前零位数将会丢失。($toInt
在数据库中也以这种方式工作,因此它们将相等)
PlayMongo
aggregate(
[{"$match":
{"$expr":
{"$in":
[{"$toInt":
{"$substrCP":
["$phone", {"$subtract": [{"$strLenCP": "$phone"}, 9]}, 9]}},
[123456789, 12345678]]}}}])