【问题标题】:Look up MongoDB for documents matching an array of partial phone numbers在 MongoDB 中查找与部分电话号码数组匹配的文档
【发布时间】:2023-04-02 02:45:01
【问题描述】:

作为某些“您可能认识的人”功能的一部分,我们有一个应用程序可以发送一组用户联系人的最后 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}$/

这有任何性能问题吗?或者这样可以吗?

【问题讨论】:

    标签: node.js mongodb mongoose nosql


    【解决方案1】:

    查询

    • usersContacts 保留为数字
    • 仅将数据库中的电话转换为号码
    • 使用数字(而不是字符串和正则表达式)进行 n 次比较

    所以总的收获是不用转成字符串,比较数字而不是字符串,如果你有大数组,会更快。

    *假设 usersContacts 如果电话是 001234567 将只有 1234567 前零位将丢失。 ($toInt 在数据库中也以这种方式工作,因此它们将相等)

    Test code here

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

    【讨论】:

    • 太棒了!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2019-05-06
    • 2019-07-16
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多