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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

查询

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

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

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

Test code here

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

【讨论】:

太棒了!谢谢

以上是关于在 MongoDB 中查找与部分电话号码数组匹配的文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB通过***属性和嵌套数组键查找文档,并返回匹配文档的一部分

为啥在与数组中的字段匹配时,mongoDB聚合中的查找中的管道不起作用?

Mongodb 查找与聚合匹配返回一个空数组

MongoDB - 如何通过 Id 查找文档并找到与 ID 数组匹配的文档

MongoDb:查找具有重复项的精确数组匹配

根据对象数组中不匹配的属性查找匹配的文档 - MongoDB