node.js - route - Mangosta cambiando el formato del esquema
node express tutorial (4)
Estamos desarrollando rápidamente una aplicación que está usando Mongoose, y nuestros esquemas están cambiando a menudo. Parece que no puedo encontrar la manera adecuada de actualizar un esquema para los documentos existentes, sin eliminarlos y volver a crearlos completamente desde cero.
Me encontré con http://mongoosejs.com/docs/api.html#schema_Schema-add , que parece ser el correcto. Hay poca o ninguna documentación sobre cómo implementar esto realmente, lo que es muy difícil para alguien que es nuevo en MongoDB.
Simplemente quiero agregar un nuevo campo llamado habilitado. Mi definición de esquema es:
var sweepstakesSchema = new Schema({
client_id: {
type: Schema.Types.ObjectId,
ref: ''Client'',
index: true
},
name: {
type: String,
default: ''Sweepstakes'',
},
design: {
images: {
type: [],
default: []
},
elements: {
type: [],
default: []
}
},
enabled: {
type: Boolean,
default: false
},
schedule: {
start: {
type: Date,
default: Date.now
},
end: {
type: Date,
default: Date.now
}
},
submissions: {
type: Number,
default: 0
}
});
No hay nada integrado en Mongoose con respecto a la migración de documentos existentes para cumplir con un cambio de esquema. Debe hacer eso en su propio código, según sea necesario. En un caso como el nuevo campo enabled
, es probable que sea más limpio escribir su código para que trate un campo enabled
faltante como si estuviera configurado como false
para que no tenga que tocar los documentos existentes.
En lo que respecta al cambio del esquema en sí, simplemente actualiza su definición de Schema
como lo ha mostrado, pero los cambios como los nuevos campos con valores default
solo afectarán a los documentos nuevos en el futuro.
También estaba buscando algo así como migraciones, pero no lo encontré. Como alternativa, puede usar los valores predeterminados. Si una clave tiene un valor predeterminado y la clave no existe, usará el valor predeterminado.
Los valores predeterminados se aplican cuando se construye el esqueleto del documento. Esto significa que si crea un nuevo documento (nuevo MyModel) o si encuentra un documento existente (MyModel.findById), ambos tendrán los valores predeterminados siempre que falte cierta clave.
Tuve exactamente el mismo problema y descubrí que el uso de findOneAndUpdate()
lugar de llamar a save
nos permitía actualizar el archivo de esquema, sin tener que eliminar primero todos los documentos antiguos.
Puedo publicar un fragmento de código si así lo solicita.
db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
function (doc) {
doc.enabled = false;
db.sweepstakesModel.save(doc);
}
)
considerando su nombre de modelo de mangosta como "sweepstakesModel", este código agregará el campo "enabled" con valor booleano "falso " a todos los documentos preexistentes en su colección.