在 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聚合中的查找中的管道不起作用?