MongoDB diferențe între NumberLong și Integer simplu? (Programare, Mongodb)

Francisco Costa a intrebat.

Care sunt principalele diferențe (dimensiune, viteză etc.) între tipurile de date double, NumberLong, NumberInt sau un simplu întreg în MongoDB?

Dacă vreau să salvez un număr fix mic (ceva între 0 și 1000), ce tip de date ar trebui să folosesc?

Comentarii

  • Int nativ este de 32 de biți, în timp ce numberlong permite 64 de biți, un int mic se poate folosi doar reprezentarea nativă a numărului întreg –  > Por Sammaye.
2 răspunsuri
Jayram

NumberInt

În mod implicit, shell-ul mongo tratează toate numerele ca valori în virgulă mobilă. Shell-ul mongo oferă funcția NumberInt() pentru a specifica în mod explicit numere întregi pe 32 de biți.

NumberLong

În mod implicit, shell-ul mongo tratează toate numerele ca valori în virgulă mobilă. Mongo shell oferă constructorul NumberLong() pentru a trata numere întregi pe 64 de biți.

Clasa NumberLong() acceptă Long ca șir de caractere:

NumberLong("2090845886852")

Sursă: http://docs.mongodb.org/manual/core/shell-types/

Comentarii

  • Shell și MongoDB în sine sunt două lucruri diferite, shell-ul tratează ints ca float din cauza unei limitări javascript, dar MongoDB le va trata ca int și, din moment ce nu este specificat niciun limbaj aici, nu vă puteți baza pe faptul că int este tratat ca float pentru op –  > Por Sammaye.
  • Tocmai am dat peste o problemă – acest lucru nu funcționează atunci când editați un câmp. În cazul editării, trebuie să ștergeți mai întâi câmpul și apoi să-l salvați ca tip dorit, vedeți aici: stackoverflow.com/questions/36894019/… – -.  > Por VSO.
Florian Winter

NumberLong și NumberInt nu sunt tipuri de date în MongoDB, ci funcții JavaScript în shell-ul MongoDB.

Tipurile de date în MongoDB sunt definite în specificația BSON: http://bsonspec.org/spec.html

Numerele sunt stocate ca tip 0x01 (virgulă mobilă), tip 0x10 (întreg pe 32 de biți) sau tip 0x12 (întreg pe 64 de biți).

Dacă inserați sau actualizați un document în shell-ul MongoDB, atunci NumberLong creează un număr întreg pe 64 de biți, NumberInt creează un număr întreg pe 32 de biți, iar un număr JavaScript obișnuit creează o valoare în virgulă mobilă. Acest lucru se datorează faptului că în JavaScript nu există numere întregi, ci doar numere în virgulă mobilă.

Ieșirea în shell-ul MongoDB afișează numere cu virgulă mobilă și numere întregi pe 32 de biți ca numere JavaScript, în timp ce numerele întregi pe 64 de biți sunt afișate ca apeluri la NumberLong:

> db.inttest.insert({f: 1234, i: NumberInt("1234"), l: NumberLong("1234")})
> db.inttest.findOne()
{
        "_id" : ObjectId("5396fc0db8e0b3e2dedb59b0"),
        "f" : 1234,
        "i" : 1234,
        "l" : NumberLong(1234)
}

Diferite drivere MongoDB oferă metode diferite de inserare a diferitelor tipuri de numere. De exemplu, driverul C++ creează un număr întreg pe 64 de biți dacă adăugați un număr long long valoare la un BSONObjectBuilder.

Interogările se potrivesc ori de câte ori numerele sunt egale. În exemplul de mai sus, interogările

> db.inttest.find({i:1234})
> db.inttest.find({l:1234})
> db.inttest.find({f:1234})
> db.inttest.find({i:NumberLong("1234")})
> db.inttest.find({l:NumberLong("1234")})
> db.inttest.find({f:NumberLong("1234")})

se potrivesc toate cu documentul inserat.

Tags: