Nie przechowuj numerów telefonów jako liczb całkowitych. Przechowuj je jako ciągi. Kiedy masz wartość, która składa się tylko z cyfr i na której arytmetyka jest bezsensowna, jak kod pocztowy, numer konta bankowego lub numer telefonu, to przechowywanie jej jako liczby nie ma większego sensu.
- Jak już zauważyłeś, liczby są prawie niemożliwe do wyszukania, gdy chcesz wyszukać ciąg cyfr, ponieważ systemy komputerowe przechowują liczby całkowite w postaci binarnej, a nie dziesiętnej.
- Nie możesz mieć wiodących zer
- Gdy liczba jest zbyt długa, napotkasz przepełnienie lub przekonwertujesz ją na liczbę zmiennoprzecinkową (według uznania sterownika MongoDB). Oba spowodują bardzo dziwne zachowanie.
Nawiasem mówiąc, wszystko to dotyczy prawie każdej bazy danych, nie tylko MongoDB.
Ale jeśli jesteś absolutnie zdeterminowany, aby zachować je jako liczby, oto dwie rzeczy, które możesz zrobić.
- Gdy liczba nieznanych cyfr jest ustalona, możesz użyć
$gt
i$lt
operatorów do wyszukiwania zakresu.contactphone:{$gt:5556000, $lt:5556999}
znalazłby wszystkie liczby o wzorze5556xxx
. - Możesz użyć
$where
-query, który używa funkcji javascript do wewnętrznej konwersji każdej liczby na łańcuch, a następnie stosuje twoje wyrażenie regularne do tego łańcucha.$where: "String(this.contactphone).match(/^4832/) != null"
. Mam nadzieję, że nie masz wielu dokumentów w swojej bazie danych, ponieważ gdy to zrobisz, to zapytanie może trochę potrwać.