Spara inte telefonnummer som heltal. Förvara dem som strängar. När du har ett värde som bara består av siffror och där aritmetik är meningslöst, som ett postnummer, ett bankkontonummer eller ett telefonnummer, är det inte så meningsfullt att lagra det som ett nummer.
- Som du redan har märkt är siffror nästan omöjliga att söka när du vill söka efter en siffersekvens, eftersom datorsystem lagrar heltal i binärt, inte i decimaler.
- Du kan inte ha inledande nollor
- När talet är för långt kommer du antingen att stöta på ett heltalsspill eller så kommer du att få det omvandlat till ett flyttal (efter din MongoDB-drivrutin). Båda kommer att resultera i mycket konstigt beteende.
Allt detta gäller för nästan vilken databas som helst, inte bara MongoDB.
Men skulle du vara helt fast besluten att behålla dem som siffror, här är två saker du kan göra.
- När antalet okända siffror har fastställts kan du använda
$gt
och$lt
operatörer för att söka efter ett intervall.contactphone:{$gt:5556000, $lt:5556999}
skulle hitta alla nummer med mönstret5556xxx
. - Du kan använda en
$where
-query som använder en javascript-funktion för att internt konvertera varje nummer till en sträng och sedan tillämpar ditt reguljära uttryck på den strängen.$where: "String(this.contactphone).match(/^4832/) != null"
. Jag hoppas att du inte har många dokument i din databas, för när du har det kan den här frågan ta ett tag.