Docs Menu
Docs Home
/ /
Datos del modelo

Cambiar un modelo de objeto - SDK de Node.js

Una versión de esquema identifica el estado de un esquema de dominio en un momento dado. Realm rastrea la versión de esquema de cada dominio y la utiliza para asignar los objetos de cada dominio al esquema correcto.

Las versiones del esquema son números enteros ascendentes que se pueden incluir opcionalmente en la configuración del dominio al abrirlo. Si una aplicación cliente no especifica un número de versión al abrir un dominio, este se configura de forma predeterminada como la versión. 0.

Importante

Incrementar versiones monótonamente

Las migraciones deben actualizar un dominio a una versión de esquema superior. El dominio generará un error si una aplicación cliente abre un dominio con una versión de esquema inferior a la actual, o si la versión de esquema especificada coincide con la actual, pero incluye esquemas de objetos diferentes.

Una migración es una función que actualiza un dominio y los objetos que contiene de una versión de esquema a una versión más reciente. Las migraciones ofrecen la flexibilidad de cambiar los esquemas de objetos con el tiempo para incorporar nuevas funciones y refactorizaciones.

Tip

Evitar la migración durante el desarrollo

Al desarrollar o depurar tu aplicación, puede preferirse borrar el realm en lugar de migrarlo. Utiliza el indicador deleteRealmIfMigrationNeeded para borrar la base de datos automáticamente cuando una discrepancia de esquema requiera una migración.

Nunca publique una aplicación en producción con esta marca configurada en true.

Al abrir un dominio existente con una versión de esquema posterior a la actual, Realm ejecuta una función de migración definida por usted. Esta función tiene acceso al número de versión del dominio y actualiza incrementalmente los objetos para que se ajusten al nuevo esquema.

Realm migra automáticamente ciertos cambios, como propiedades nuevas y eliminadas, pero no establece automáticamente valores para las nuevas propiedades a menos que el esquema de objeto actualizado especifique un valor predeterminado. Puede definir lógica adicional en la función de migración para personalizar aún más los valores de las propiedades.

Nota

Modificar las propiedades del esquema de un dominio sincronizado

La siguiente página muestra cómo modificar las propiedades del esquema de un dominio local. Aprenda a... modificar las propiedades del esquema de un reino sincronizado.

Para agregar una propiedad a un esquema, agregue la nueva propiedad a la clase del objeto y establezca un schemaVersion del objeto de configuración del reino.

Ejemplo

Un dominio que usa la versión de esquema 1 tiene un tipo de objeto Person con propiedades firstName y lastName. El desarrollador decide añadir una propiedad age a la clase Person.

Para migrar el reino para Person que se ajuste al esquema actualizado, el desarrollador establece la versión del esquema del reino 2 en.

const Person = {
name: 'Person',
properties: {
firstName: 'string',
lastName: 'string',
age: 'int'
}
}
const realm = await Realm.open({
schema: [Person],
schemaVersion: 2
});

Para eliminar una propiedad de un esquema, elimínela de la clase del objeto y establezca un valor en el objeto schemaVersion de configuración del dominio. Eliminar una propiedad no afecta a los objetos existentes.

Ejemplo

Un dominio que usa la versión de esquema 1 tiene un tipo de objeto Dog con una propiedad weight. El desarrollador decide eliminar la propiedad del esquema.

Para migrar el reino para Dog que se ajuste al esquema actualizado, el desarrollador establece la versión del esquema del reino 2 en.

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2
});

Para cambiar el nombre de una propiedad de objeto, cambie el nombre de la propiedad en el esquema del objeto y luego abra el ámbito con una versión de esquema incrementada y una función de migración que actualice los objetos existentes para usar el nuevo nombre de propiedad.

Las migraciones no permiten cambiar el nombre de una propiedad directamente. En su lugar, se puede crear una nueva propiedad con el nombre actualizado, copiar el valor de la propiedad anterior y, a continuación, eliminarla.

Ejemplo

Un dominio que usa la versión de esquema 1 tiene un tipo de objeto Person. El esquema original tenía un campo firstName y un campo lastName. Posteriormente, el desarrollador decide que la clase Person debe usar un campo fullName combinado y elimina los campos firstName y lastName.

Para migrar el reino para que se ajuste al Person esquema actualizado, el desarrollador establece la versión del esquema del reino en 2 y define una función de migración para establecer el valor de en función de fullName firstName las lastName propiedades y existentes.

Realm.open({
schema: [Person],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
// only apply this change if upgrading to schemaVersion 2
if (oldRealm.schemaVersion < 2) {
const oldObjects = oldRealm.objects('Person');
const newObjects = newRealm.objects('Person');
// loop through all objects and set the fullName property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject.fullName = `${oldObject.firstName} ${oldObject.lastName}`;
}
}
}
});

Importante

Realms sincronizados

Los dominios sincronizados solo admiten cambios continuos (también llamados aditivos) para garantizar que los clientes antiguos puedan sincronizarse con los nuevos. Dado que los cambios de nombre completos requieren la eliminación de la propiedad anterior, no es posible cambiar el nombre de una propiedad sincronizada sin reiniciar el cliente. En su lugar, considere agregar la propiedad renombrada sin eliminar la anterior. Como alternativa, use mapTo para almacenar datos con el nombre interno existente, pero permita que su código use un nombre diferente.

Para modificar el tipo de una propiedad, configure el tipo de propiedad del campo que desea modificar con el nuevo tipo de dato. A continuación, configure schemaVersion una migration función de devolución de llamada y una del objeto de configuración del dominio.

Nota

Los dominios sincronizados solo admiten cambios permanentes para garantizar que los clientes antiguos puedan sincronizarse con los nuevos. Esto significa que los dominios sincronizados no permiten modificar el tipo de propiedad de un esquema.

Ejemplo

Un dominio que usa la versión de esquema 1 tiene un tipo de objeto Dog. El esquema original tenía un _id con un tipo de propiedad Object ID. Posteriormente, el desarrollador decide que el campo _id de la clase Dog debe ser de tipo string y actualiza el esquema.

Para migrar el reino para que se ajuste al Dog esquema actualizado, el desarrollador establece la versión del esquema del reino en 2 y define una función de migración para convertir el Object ID tipo en un string tipo.

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
if(oldRealm.schemaVersion < 2){
const oldObjects = oldRealm.objects('Dog');
const newObjects = newRealm.objects('Dog');
// loop through all objects and set the _id property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject._id = oldObject._id.toHexString();
}
}
},
});

Volver

Relaciones y objetos incrustados

En esta página