Cambiar el tipo de un campo MongoDB a entero desde su consola
Frecuentes
Visto 15,475 equipos
5
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?
3 Respuestas
9
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! - Георги Кременлиев
9
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
0
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 javascript c++ mongodb or haz tu propia pregunta.
Vuelva a guardar los valores usando parseFloat() o simplemente no coloque marcas de voz alrededor del valor: Sammaye
De hecho, intente parseInt () lo siento - Sammaye