作為某些“您可能認識的人”功能的一部分,我們有一個應用程式會發送用戶聯系人的最后 9 位數字(最后 9 位數字,因為用戶存盤聯系方式的方式存在問題,例如使用國家/地區代碼)等等)。然后,API 必須執行查找,我們需要在資料庫中查找任何用戶檔案,其中任何用戶電話號碼的最后 9 位數字與陣列中的電話號碼相匹配。
我希望做這樣的事情:
usersContacts = [123456789, 987654321, 123443212,...]
find: {
phoneNumber: {
$in: usersContacts,
$regex: 'Some last 9 digit match regex'
}
}
以下在聚合管道中確實有效:
$match: {
phoneNumStr: {
$in: [/861650975$/, /861650976$/]
}
}
上面的兩個問題是我需要首先將電話號碼欄位投影到一個字串(這很好),但還需要通過回圈應用程式發送的陣列并創建 /{phoneNum} 來添加 N 個不同的正則運算式陳述句$/
這有任何性能問題嗎?或者這樣可以嗎?
uj5u.com熱心網友回復:
詢問
- 保持
usersContacts為數字 - 僅將資料庫中的電話轉換為號碼
- 使用數字(而不是字串和正則運算式)進行 n 次比較
所以整體增益不需要轉換為字串,并且比較數字而不是字串,如果你有大陣列,它會更快。
*假設usersContacts如果電話001234567只有 1234567,前零位數字將丟失。($toInt在資料庫中也以這種方式作業,因此它們將相等)
測驗代碼在這里
aggregate(
[{"$match":
{"$expr":
{"$in":
[{"$toInt":
{"$substrCP":
["$phone", {"$subtract": [{"$strLenCP": "$phone"}, 9]}, 9]}},
[123456789, 12345678]]}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335694.html
下一篇:填充貓鼬查詢時展平多個欄位
