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


¿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.


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) });

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)

$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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.