Cambiar el tipo de un campo MongoDB a entero desde su consola

Tenemos una aplicación que almacena algunos valores de configuración de C/C++ en MongoDB y tiene la capacidad de reiniciarse (es decir, se ejecuta durante un tiempo, alguien interrumpe la aplicación, cambia la configuración, luego ejecuta la aplicación nuevamente y continúa donde se quedó). Esto funciona de maravilla para configuraciones booleanas y de cadena.

Pero luego tenemos algunos números enteros (en nuestra implementación actual de C/C++ - valores de 32 bits). Y cuando uso la consola de MongoDB para modificar esos valores enteros, Mongo siempre los almacena como Número (que es el doble en la implementación de C/C++). Cambiaremos la aplicación para que tome valores dobles donde espera números enteros, pero me preguntaba si hay alguna manera de obligar a Mongo a almacenar números enteros desde su consola de JavaScript.

¿Alguna sugerencia?

preguntado el 01 de julio de 12 a las 12:07

Vuelva a guardar los valores usando parseFloat() o simplemente no coloque marcas de voz alrededor del valor:

De hecho, intente parseInt () lo siento -

3 Respuestas

En el "sentido de la palabra" de C/C++, los ints son en realidad no está garantizado ser valores de 32 bits. Un int debe tener al menos 16 bits, pero generalmente coincide con la arquitectura de la plataforma (p. ej., 32 o 64 bits).

Como mencionó @Jasd, JavaScript solo tiene un tipo numérico que es un punto flotante (double C ª).

Desde el shell de MongoDB, debería poder usar las funciones NumberInt(..) conseguir un Valor entero BSON de 32 bits or NumberLong(..) para obtener un entero BSON de 64 bits.

contestado el 23 de mayo de 17 a las 13:05

buena captura sobre el tamaño int! - Георги Кременлиев

Puede corregir los tipos de todos los valores para un determinado campo en la consola con algo como:

db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) {
  x.kodoId = NumberInt(x.kodoId);
  db.Statistic.save(x);
});

Esto solo cargará documentos que tengan la kodoId campo y convertirlos a int y volver a guardar. Podrías hacer algo como:

db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) {
   db.Statistic.update({ _id: x._id },
      {$set: {
        kodoId: NumberInt(x.kodoId)
      }});
});

con un segundo parámetro que , solamente cargue el valor de kodoId (con suerte desde un índice). Esto debería ser mucho más rápido ya que no necesita cargar y volver a guardar todo el documento, solo ese campo.

Respondido 25 Feb 14, 15:02

Podrías agregar un try .. catch (err) alrededor del segundo ejemplo en caso de que haya algunos valores que ya son NumberInt, ya que arrojará un error. - nic cottrell

Funcionó como un encanto para mí. ¡Gracias! - Mika Andrianarijaona

Volví a esta respuesta más de lo que me gustaría admitir... - Nicolás Martínez

Solo una observación, ¡NO mezcle la primera y la segunda solución! He hecho eso, proyectando el campo pero llamando a guardar en lugar de establecer... horrible desastre - Nicolás Martínez

El shell de MongoDB funciona con un motor de JavaScript. Y JavaScript no tiene tipo para integer. solo sabe Number, que es un tipo para números de coma flotante.
Puedes intentar usar el tipo MongoDB NumberLong, pero no funcionó para mí cuando una vez tuve el mismo problema.

Respondido 01 Jul 12, 12:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.