NumberLong(253351454)
działa tylko dla liczb, które są na tyle małe, że nie muszą być… cóż, długie:powłoka musi je jakoś reprezentować w JS, więc może reprezentować tylko liczby, które
W przypadku większych liczb wymagana jest reprezentacja tekstowa, ponieważ nie ma wystarczająco dużego typu danych, stąd NumberLong("3059300418")
z 3059300418 > 253351454
.
Innymi słowy, nie, nie ma różnicy . To tylko ograniczenie powłoki, a ogólniej mówiąc, JS i liczb zmiennoprzecinkowych.
Zastrzeżenie:nie próbuj wywoływać konstruktora ze zbyt dużą liczbą, tj. nie próbuj db.foo.insert({"t" : NumberLong(1234657890132456789)});
Ponieważ ta liczba jest zbyt duża dla podwojenia, spowoduje to błędy zaokrągleń. Powyższa liczba zostanie przekonwertowana na NumberLong("1234657890132456704")
, co jest oczywiście błędne.