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.