MongoDB inserisce float quando si tenta di inserire numeri interi


209
   > db.data.update({'name': 'zero'}, {'$set': {'value': 0}}) 
   > db.data.findOne({'name': 'zero})
    {'name': 'zero', 'value': 0.0}  

Come faccio a convincere Mongo a inserire un numero intero?

Grazie


quale versione di mongodb usi?
kamaradclimber,


1
nota che nel mio caso, quando volevo {$ set: {val: NumberInt (0)}} in qualche "val" che è già impostato come Long, non è cambiato. Ho dovuto prima cambiarlo con qualche altro valore, quindi riportarlo a 0, affinché il NumberInt (0) abbia effetto
kommradHomer,

Ho avuto lo stesso problema, dopo aver realizzato che avevo erroneamente cambiato un int32 in doppio, ripristinandolo usando NumberInt () non ho risolto il tipo a meno che non avessi prima cambiato con un valore diverso.
user1055568

Risposte:


328
db.data.update({'name': 'zero'}, {'$set': {'value': NumberInt(0)}})

Puoi anche usare NumberLong.


1
ma in findOne dice NumberLong (0) non come 0
sognatore ad occhi aperti il

11
Per impostazione predefinita, la shell mongo tratta tutti i numeri come valori in virgola mobile. Quindi dobbiamo specificare esplicitamente quale tipo di numero vogliamo usare, ad esempio NumberInt o NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu

12
Ho una domanda. NumberInt viene fornito solo nella shell mongo, come si fa in linguaggio JavaScript come node.js?
萧 易 客

@Shawyeok qui è una risposta stackoverflow.com/a/21870772/3815843
GRiMe2D

È importante tenere conto del fatto che gli ints hanno dei limiti. Se il numero è grande, considera di usare NumberLong
Tim Givois il

17

Una sintassi leggermente più semplice (almeno in Robomongo) ha funzionato per me:

db.database.save({ Year : NumberInt(2015) });

5

Se il tipo di valore è già doppio, quindi aggiornare il valore con il comando $ set non è possibile modificare il tipo di valore doppio in int quando si utilizza la funzione NumberInt () o NumberLong (). Pertanto, per modificare il tipo di valore, è necessario aggiornare l'intero record.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)

$setha funzionato almeno in Mongo 4.2, quindi forse questo era un bug.
Cerbero

-10

Bene, è JavaScript, quindi quello che hai in 'value' è un numero, che può essere un numero intero o un float. Ma non c'è davvero una differenza in JavaScript. Dall'apprendimento di JavaScript :

Il tipo di dati numerici

I tipi di dati numerici in JavaScript sono numeri in virgola mobile, ma possono avere o meno un componente frazionario. Se non hanno un punto decimale o un componente frazionario, vengono considerati come numeri interi — base-10 numeri interi compresi tra –2 53 e 2 53 .


27
In realtà questo non è vero. Mentre JS non vede alcuna differenza, non appena ti connetti a mongo da un'altra lingua (ad esempio java) sentirai molto la differenza.
Omri Spector

2
La mia applicazione si è rotta in punti diversi solo per un motivo, int viene salvata e restituita come float. Ho il sospetto che la causa sia dovuta ad alcuni inserimenti manuali che ho fatto tramite la shell mongo che utilizza JavaScript.
Melsi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.