在MongoDB中查找与部分电话号码数组匹配的文档



作为一些'你可能认识的人'功能的一部分,我们有一个应用程序,发送用户联系人的最后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]]}}}])

相关内容

  • 没有找到相关文章

最新更新