查找 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 在数据库中也以这种方式工作,因此它们将相等)

PlayMongo

aggregate(
[{"$match": 
   {"$expr": 
     {"$in": 
       [{"$toInt": 
          {"$substrCP": 
            ["$phone", {"$subtract": [{"$strLenCP": "$phone"}, 9]}, 9]}},
        [123456789, 12345678]]}}}])