2011-09-30 10 views

Respuesta

5

Actualización: a prueba, esto no funciona en su forma actual, es la idea correcta de ir, tengo una sola migración a trabajar con considerables ajustes de la módulo en sí Pero no veo que funcione como está previsto sin algunos cambios importantes y de alguna manera no pierda de vista los diferentes esquemas.


suena como usted quiere mangosta-Data-migraciones

Se pretende migrar versiones de esquema antiguas de los documentos a medida que los utiliza, que es parece ser la mejor manera de manejar las migraciones en MongoDB.

En realidad, no desea ejecutar migraciones de conjunto de datos completos en una colección de documentos (tabla alter) ya que carga mucho sus servidores y podría requerir tiempo de inactividad de la aplicación/servidor. A veces puede necesitar escribir un script que simplemente tome todos los documentos aplicando el nuevo esquema/alteraciones y llamadas guardadas, pero necesita comprender cuándo/dónde hacer eso. Un ejemplo podría ser, agregar lógica de migración a doc init tiene más de un golpe de rendimiento que vale la pena tomar el servidor por 3 horas para ejecutar las secuencias de comandos de migración.

Encontré esto link bastante útil también, básicamente reitera lo anterior con más detalle y esencialmente implementa el concepto del paquete de nodos anterior en php.

N.B. El módulo tiene 5 meses de antigüedad, 0 tenedores, pero miro a mi alrededor y no puedo encontrar nada mejor/más útil que el estilo de respuesta de abdelsaid.

+0

Aceptado al menos hasta que surja algo mejor. ¿Puede agregar esa advertencia a su respuesta ya que no todos verán el comentario? – mahemoff

+1

Nota adicional, esto tendrá que hacer esto mañana, se bloqueó por otra cuestión, lo siento. – Louis

+1

Actualizado. Lamentablemente está bastante roto. Déjame saber aquí si alguna vez encuentras algo, tipo de querer una solución adecuada para el método de actualización sobre la marcha. Tengo la sensación de que necesitaría hacer un seguimiento de cada versión para cargar esquemas anteriores y permitir modificaciones como el módulo intenta hacer. Por desgracia, mi conocimiento de la mangosta es bastante deficiente hasta ahora. ¡Llegar allí! – Louis

32

Aunque es divertido, MongoDB nació para responder a los problemas de esquema en RDBMS. No tiene que migrar nada, todo lo que tiene que hacer es establecer el valor predeterminado en la definición del esquema si el campo es obligatorio.

new Schema({ 
    name: { type: string } 
}) 

a:

new Schema({ 
    name: { type: string }, 
    birthplace: { type: string, required: true, default: 'neverborn' } 
}); 
+1

Realmente estoy pensando en herramientas como las migraciones de Rails que te permiten manejar los aspectos de gestión de cambios, pero no creo que realmente haya algo así, así que lo aceptaré. – mahemoff

+0

Sé lo que quiere decir, pero no veo una utilidad para eso en bases de datos basadas en documentos o ¿me equivoco? Si mantiene sus esquemas bajo un control de fuente como Mercurial/Subversion/git, siempre puede volver a las revisiones anteriores. – vimdude

+3

No creo que sea tan diferente a las bases de datos SQL. Puede dividir "nombre" en "nombre" y "apellido" campos por ejemplo ... tendría que ejecutar esa transformación contra la base de datos de cada entorno y rastrear de alguna manera. – mahemoff

6

Acabo de tener este problema donde necesitaba actualizar mi base de datos para reflejar el cambios a mi esquema Después de algunas investigaciones, decidí probar la función updateMany() en la consola mongo para hacer las actualizaciones y creo que funcionó bastante bien.

Para aplicar esta el ejemplo de vimdude el código sería de la siguiente manera:

try { db.<collection>.updateMany({ birthplace: null }, { $set: {"birthplace": "neverborn" } }); } catch(e) { print(e); } 

El updateMany función() actualizará todos los documentos en una colección basada en un filtro. En este caso, el filtro está buscando todos los documentos donde el campo 'lugar de nacimiento' es nulo. Luego establece un nuevo campo en los documentos llamados 'birthplace' y establece su valor en 'neverborn'.

Después de ejecutar el código, modificado para reflejar sus circunstancias Run:

db.<collection>.find().pretty() 

para verificar que se hicieron los cambios. El nuevo campo "lugar de nacimiento" con el valor "neverborn" debe aparecer al final de cada documento en su colección.

Espero que ayude.

Cuestiones relacionadas