MongoDB inserta flotante cuando intenta insertar un entero

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

¿Cómo consigo que Mongo inserte un número entero?

Gracias

soñador
fuente
¿Qué versión de mongodb usas?
kamaradclimber
1
tenga en cuenta que en mi caso, cuando quería {$ set: {val: NumberInt (0)}} en algún "val" que ya está configurado como Long, no lo cambió. Primero tuve que cambiarlo a otro valor, luego volver a cambiarlo a 0, para que NumberInt (0) surta efecto
kommradHomer
Tuve el mismo problema, después de darme cuenta de que había cambiado por error un int32 a doble, volver a configurarlo usando NumberInt () no solucionó el tipo a menos que primero lo cambiara a un valor diferente.
user1055568

Respuestas:

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

También puedes usar NumberLong.

Bernie Hackett
fuente
1
pero en findOne dice NumberLong (0) no como 0
daydreamer
11
Por defecto, el shell mongo trata todos los números como valores de punto flotante. Por lo tanto, debemos especificar explícitamente qué tipo de número queremos usar, por ejemplo, NumberInt o NumberLong. docs.mongodb.org/manual/core/shell-types
Yadu
12
Tengo una pregunta. NumberInt solo se proporciona en mongo shell, ¿cómo se hace en lenguaje JavaScript como node.js?
萧 易 客
@Shawyeok aquí hay una respuesta stackoverflow.com/a/21870772/3815843
GRiMe2D
Es importante tener en cuenta que las entradas tienen límites. Si el número es grande, considere usar NumberLong
Tim Givois
17

Una sintaxis un poco más simple (al menos en Robomongo) funcionó para mí:

db.database.save({ Year : NumberInt(2015) });
Grid Trekkor
fuente
5

Si el tipo de valor ya es doble, entonces actualizar el valor con el comando $ set no puede cambiar el tipo de valor doble a int cuando se utiliza la función NumberInt () o NumberLong (). Entonces, para cambiar el tipo de valor, debe actualizar todo el registro.

var re = db.data.find({"name": "zero"})
re['value']=NumberInt(0)
db.data.update({"name": "zero"}, re)
Ethan Zhang
fuente
$setfuncionó al menos en Mongo 4.2, así que tal vez esto fue un error.
Cerberus
-10

Bueno, es JavaScript, así que lo que tienes en 'valor' es un Número, que puede ser un número entero o flotante. Pero no hay realmente una diferencia en JavaScript. De Learning JavaScript :

El tipo de datos numéricos

Los tipos de datos numéricos en JavaScript son números de coma flotante, pero pueden tener o no un componente fraccionario. Si no tienen un punto decimal o un componente fraccionario, se tratan como números enteros: números enteros de base 10 en un rango de –2 53 a 2 53 .

Christian Horsdal
fuente
27
En realidad eso no es cierto. Si bien JS no ve la diferencia, tan pronto como se conecte a mongo desde otro idioma (por ejemplo, Java), sentirá la diferencia.
Omri Spector
2
Mi aplicación se ha roto en diferentes puntos solo por una razón, int se guarda y se devuelve como flotante. Sospecho que la causa debe ser algunas inserciones manuales que hice a través de mongo shell que usa javascript.
Melsi