Não armazene números de telefone como números inteiros. Armazene-os como strings. Quando você tem um valor que consiste apenas em dígitos e em que a aritmética é inútil, como um código postal, um número de conta bancária ou um número de telefone, armazená-lo como um número não faz muito sentido.
- Como você já notou, os números são quase impossíveis de pesquisar quando você deseja pesquisar por uma sequência de dígitos, porque os sistemas de computador armazenam números inteiros em binário, não em decimal.
- Você não pode ter zeros à esquerda
- Quando o número for muito longo, você encontrará um estouro de inteiro ou o converterá em um número de ponto flutuante (a critério do seu driver MongoDB). Ambos resultarão em um comportamento muito estranho.
A propósito, tudo isso se aplica a quase qualquer banco de dados, não apenas ao MongoDB.
Mas se você estiver absolutamente determinado a mantê-los como números, aqui estão duas coisas que você pode fazer.
- Quando o número de dígitos desconhecidos é fixo, você pode usar o
$gt
e$lt
operadores para procurar um intervalo.contactphone:{$gt:5556000, $lt:5556999}
encontraria todos os números com o padrão5556xxx
. - Você pode usar um
$where
-query que usa uma função javascript para converter internamente cada número em uma string e, em seguida, aplica sua expressão regular a essa string.$where: "String(this.contactphone).match(/^4832/) != null"
. Espero que você não tenha muitos documentos em seu banco de dados, pois, quando tiver, essa consulta poderá demorar um pouco.