Docs Menu
Docs Home
/ /
Referencia

Sincronización basada en particiones

Atlas Device Sync tiene dos modos de sincronización: Sincronización flexible y la antigua Partition-Based Sync. La sincronización basada en particiones ha quedado obsoleta y no está permitida para nuevas configuraciones de sincronización.

La información de esta página es para los usuarios que todavía utilizan la sincronización basada en particiones.

Nota

Migrar de la sincronización basada en particiones a la sincronización flexible

Recomendamos migrar las aplicaciones de sincronización basada en particiones a la sincronización flexible. Para obtener más información sobre la migración, consulte Migrar modos de sincronización de dispositivos.

En Partition-Based Sync, los documentos en un clúster sincronizado forman una "partición" al tener el mismo valor en un campo designado como "llave de partición". Todos los documentos en una partición tienen los mismos permisos de lectura/guardar para un usuario determinado.

Se define una clave de partición cuyo valor determina si el usuario puede leer o escribir en un documento. App Services evalúa un conjunto de reglas para determinar si los usuarios pueden leer o escribir en una partición determinada. App Services asigna directamente una partición a cada una de las particiones sincronizadas. .realm archivos. Cada objeto en un reino sincronizado tiene un documento correspondiente en la partición.

Ejemplo

Considere una aplicación de gestión de inventario que utiliza sincronización basada en particiones. Si utiliza store_number como clave de partición, cada tienda podrá leer y escribir documentos relacionados con su inventario.

Un ejemplo de los permisos para este tipo de aplicación podría ser:

{ "%%partition": "Store 42" }

Los empleados de la tienda podrían tener acceso de lectura y escritura a los documentos cuyo número de tienda sea Tienda 42.

Mientras tanto, los clientes podrían tener acceso de sólo lectura al inventario de la tienda.

En el cliente, se pasa un valor para la clave de partición al abrir un dominio sincronizado. App Services sincroniza entonces los objetos cuyo valor de clave de partición coincide con el valor pasado desde la aplicación cliente.

Ejemplo

Según el ejemplo anterior del inventario de la tienda, el SDK podría pasar store42 como partitionValue en la configuración de sincronización. Esto sincronizaría cualquier InventoryItem cuyo partitionValue fuera store42.

Puede usar datos de usuario personalizados para indicar si un usuario conectado es un empleado de la tienda o un cliente. Los empleados de la tienda tendrían permisos de lectura y escritura para el store42 conjunto de datos, mientras que los clientes solo tendrían permisos de lectura para el mismo conjunto de datos.

const config = {
schema: [InventoryItem], // predefined schema
sync: {
user: app.currentUser, // already logged in user
partitionValue: "store42",
},
};
try {
const realm = await Realm.open(config);
realm.close();
} catch (err) {
console.error("failed to open realm", err.message);
}

La sincronización de dispositivos requiere clústeres de MongoDB Atlas para ejecutar versiones específicas de MongoDB. La sincronización basada en particiones requiere MongoDB 4.4.0 o superior.

Una partición es una colección de objetos que comparten el mismo valor de clave de partición.

Un clúster de MongoDB Atlas consta de varios servidores remotos. Estos servidores proporcionan el almacenamiento para los datos sincronizados. El clúster Atlas almacena documentos en colecciones. Cada colección de MongoDB se asigna a un tipo de objeto Realm diferente. Cada documento de una colección representa un objeto Realm específico.

Un dominio sincronizado es un archivo local en un dispositivo. Un dominio sincronizado puede contener algunos o todos los objetos relevantes para el usuario final. Una aplicación cliente puede usar más de un dominio sincronizado para acceder a todos los objetos que necesita.

Las particiones vinculan objetos de la base de datos Realm con documentos de MongoDB. Al inicializar un archivo de dominio sincronizado, uno de sus parámetros es un valor de partición. La aplicación cliente crea objetos en el dominio sincronizado. Cuando estos objetos se sincronizan, el valor de partición se convierte en un campo en los documentos de MongoDB. El valor de este campo determina a qué documentos de MongoDB puede acceder el cliente.

A un alto nivel:

  • Una partición se asigna a un subconjunto de los documentos en un clúster sincronizado.

  • Todos los documentos de una partición tienen los mismos permisos de lectura y escritura para un usuario determinado.

  • Atlas App Services asigna cada partición a un archivo .realm sincronizado individual.

  • Cada objeto en un reino sincronizado tiene un documento correspondiente en la partición.

Diagrama que explica la partición mediante grupos de formas y colores. Las colecciones de MongoDB se agrupan por forma (equivalente a los tipos de objeto), mientras que los dominios se agrupan por color (equivalente al valor de la partición).

Particiones de datos de formas en un clúster Atlas. Cada forma representa un tipo de objeto. Las particiones se determinan por el color de cada forma: rojo, verde o azul.

Una clave de partición es un campo con nombre que se especifica al configurar Atlas Device Sync. Device Sync utiliza esta clave para determinar qué partición contiene un documento determinado.

Dependiendo de su modelo de datos y la complejidad de su aplicación, su clave de partición podría ser:

  • Una propiedad que ya existe en cada documento y que particiona los datos de forma lógica. Por ejemplo, considere una aplicación donde cada documento es privado para un usuario específico. Podría almacenar el valor del ID del usuario en un campo owner_id y usarlo como clave de partición.

  • Una propiedad sintética que se crea para particionar datos (p. ej., _partition). Puedes usarla cuando tu aplicación no incluye una clave de partición natural.

Puedes configurar la clave de partición como obligatoria u opcional en tus objetos. App Services asigna cualquier objeto que no incluya una clave de partición a una partición predeterminada: una partición nula.

Tenga en cuenta lo siguiente al elegir una clave de partición:

  • Las claves de partición deben ser de uno de estos tipos: String, ObjectID, Long o UUID.

  • Los clientes de App Services nunca deben modificar el valor de la partición directamente. No se puede usar ningún campo modificable por los clientes como clave de partición.

  • Las claves de partición usan el mismo nombre de campo en todos los documentos sincronizados. La clave de partición no debe coincidir con ningún nombre de campo en el modelo de ningún objeto.

Ejemplo

Los siguientes esquemas demuestran claves de partición naturales y sintéticas:

  • El campo owner_id es una clave natural porque ya es parte del modelo de datos de la aplicación.

  • El campo _partition es una clave sintética porque su único propósito es servir como clave de partición.

Una aplicación solo puede especificar una única clave de partición, pero cualquiera de estos campos podría funcionar dependiendo de tu caso de uso:

{
"title": "note",
"bsonType": "object",
"required": [
"_id",
"_partition",
"owner_id",
"text"
],
"properties": {
"_id": { "bsonType": "objectId" },
"_partition": { "bsonType": "string" },
"owner_id": { "bsonType": "string" },
"text": { "bsonType": "string" }
}
}
{
"title": "notebook",
"bsonType": "object",
"required": [
"_id",
"_partition",
"owner_id",
"notes"
],
"properties": {
"_id": { "bsonType": "objectId" },
"_partition": { "bsonType": "string" },
"owner_id": { "bsonType": "string" },
"notes": {
"bsonType": "array",
"items": { "bsonType": "objectId" }
}
}
}

La clave de partición de tu aplicación es fundamental en el modelo de datos de una aplicación con sincronización habilitada. Al configurar una clave de partición en la configuración de sincronización, no podrás reasignar posteriormente el campo de la clave. Si necesitas cambiar una clave de partición, debes finalizar la sincronización. Después, podrás volver a habilitarla con la nueva clave de partición. Sin embargo, esto requiere que todas las aplicaciones cliente se restablezcan y sincronicen los datos en los nuevos dominios.

Advertencia

Restaurar la sincronización después de finalizarla

Al finalizar y reactivar Atlas Device Sync, los clientes ya no podrán sincronizar. Su cliente debe implementar un controlador de restablecimiento de cliente para restaurar la sincronización. Este controlador puede descartar o intentar recuperar los cambios no sincronizados.

  • Restablecimiento del cliente - SDK de Flutter

  • Restablecimiento del cliente - SDK de Java

  • Restablecimiento del cliente - SDK de Kotlin

  • Restablecimiento de cliente - SDK .NET

  • Restablecimiento del cliente - Node SDK

  • Restablecimiento del cliente - SDK de React Native

  • Restablecimiento de cliente - Swift SDK

Un valor de partición es el valor del campo de clave de partición de un documento determinado. Los documentos con el mismo valor de partición pertenecen a la misma partición. Se sincronizan con el mismo archivo de dominio y comparten permisos de acceso a datos a nivel de usuario.

El valor de una partición es el identificador de su dominio sincronizado correspondiente. Se especifica al abrirla como dominio sincronizado en el cliente. Si se modifica el valor de una partición en Atlas, App Services interpreta el cambio como dos operaciones:

  • Una eliminación de la partición antigua.

  • Una inserción en la nueva partición.

Advertencia

Si cambia el valor de partición de un documento, perderá los cambios no sincronizados del lado del cliente en el objeto.

Necesitará lo siguiente para habilitar la sincronización basada en particiones:

1

Para definir las reglas de sincronización de dispositivos y habilitar la sincronización de dispositivos para su aplicación, navegue hasta la Device Sync Pantalla de configuración a través del menú de navegación izquierdo.

Nota

Las reglas de sincronización no se pueden cambiar

Las reglas de sincronización de dispositivos se definen al mismo tiempo que se habilita. Una vez habilitada, no se pueden cambiar las reglas de sincronización de dispositivos de la aplicación a menos que se cancele y se vuelva a habilitar con nuevas reglas.

2

Puede habilitar la sincronización de dispositivos para un solo clúster vinculado en su aplicación. Determine qué clúster desea usar y selecciónelo en el menú desplegable Select a Cluster To Sync.

El menú desplegable de selección de clúster
3

La clave de partición de Device Sync es un campo en cada documento sincronizado que asigna cada documento a un dominio del cliente. Las reglas de Device Sync se aplican a nivel de partición, por lo que es fundamental considerar el modelo de datos y los patrones de acceso. Para obtener más información sobre las claves de partición y cómo elegir una, consulte Particiones.

Nota

La clave de partición puede ser obligatoria u opcional. Si el campo de clave de partición es opcional, todos los documentos de MongoDB que excluyan la clave de partición o tengan un valor nulo para esta se enviarán a la partición nula. Si el campo de clave de partición es obligatorio, Device Sync ignora cualquier documento de MongoDB que no tenga un valor válido para la clave de partición. Recomendamos una clave de partición obligatoria a menos que desee sincronizar con Device Sync datos preexistentes con valores de partición no válidos o faltantes de una colección de MongoDB.

4

La Define Permissions sección le permite definir expresiones JSON que App Services evalúa dinámicamente para determinar los permisos de lectura y escritura de un usuario para los datos en una partición determinada.

Las expresiones de regla de sincronización de dispositivos tienen acceso a%%user, que se resuelve al usuario que abrió el dominio, y a%%partition, que se resuelve al valor de la clave de partición del dominio. También puede usar operadores, como%function, para gestionar casos más complejos. Para ver ejemplos, consulte Permisos basados ​​en roles.

Una vez que haya determinado cómo decidir los permisos de lectura y escritura de un usuario para una partición determinada, defina las expresiones JSON correspondientes en las entradas Read y Write.

5

Expandir la sección Advanced Configuration.

Servicios de aplicaciones Las aplicaciones proporcionan funciones de optimización avanzadas que están habilitadas de forma predeterminada:

Si desea cambiar el tiempo que un cliente puede estar sin conexión, puede hacerlo en la sección Advanced Configuration.

6

Ahora que has configurado las reglas para tu clúster sincronizado, solo queda activar la sincronización de dispositivos para las aplicaciones cliente. Haz clic en Enable Sync, toma nota de las recomendaciones que aparecen y confirma tu elección.

1

Utilice su clave API de administrador de MongoDB Atlas para iniciar sesión en la CLI:

appservices login --api-key="<my api key>" --private-api-key="<my private api key>"
2

Obtén una copia local de los archivos de configuración de tu aplicación. Para obtener la última versión, ejecuta el siguiente comando:

appservices pull --remote="<Your App ID>"

También puedes exportar una copia de los archivos de configuración de tu aplicación desde la interfaz de usuario o con la API de administración. Para saber cómo, consulta Exportar una aplicación.

3

Puedes habilitar la sincronización para un solo clúster vinculado en tu aplicación.

La aplicación Servicios de aplicaciones tiene un sync directorio donde se encuentra el archivo de configuración de sincronización. Si aún no ha habilitado la sincronización, este directorio está vacío.

Añade un config.json similar a:

{
"type": "partition",
"state": <"enabled" | "disabled">,
"development_mode_enabled": <Boolean>,
"service_name": "<Data Source Name>",
"database_name": "<Database Name>",
"partition": {
"key": "<Partition Key Field Name>",
"type": "<Partition Key Type>",
"permissions": {
"read": { <Expression> },
"write": { <Expression> }
}
},
"client_max_offline_days": <Number>,
"is_recovery_mode_disabled": <Boolean>
}
4

La clave de partición de sincronización es un campo en cada documento sincronizado que asigna cada documento a un dominio del lado del cliente. Las reglas de sincronización se aplican a nivel de partición, por lo que es especialmente importante considerar el modelo de datos y los patrones de acceso. Para obtener más información sobre las claves de partición y cómo elegir una, consulte Particiones.

Nota

La clave de partición puede ser obligatoria u opcional. Si el campo de clave de partición es opcional, todos los documentos de MongoDB que excluyan la clave de partición o tengan un valor nulo para esta se enviarán a la partición nula. Si el campo de clave de partición es obligatorio, Device Sync ignora cualquier documento de MongoDB que no tenga un valor válido para la clave de partición. Recomendamos una clave de partición obligatoria a menos que desee sincronizar datos preexistentes con valores de partición no válidos o faltantes de una colección de MongoDB.

Una vez que haya decidido qué campo utilizar, actualice sync.partition con el nombre del campo de clave de partición en el campo key y el tipo de clave de partición en el campo type, de manera similar a:

{
...
"partition": {
"key": "owner_id",
"type": "string",
"permissions": {
"read": {},
"write": {}
}
}
...
}
5

App Services le permite definir expresiones JSON que evalúa dinámicamente cada vez que un usuario abre un reino para determinar si el usuario tiene permisos de lectura o escritura para los datos en la partición.

Las expresiones de regla de sincronización tienen acceso a%%user, que se resuelve al usuario que abrió el dominio, y a%%partition, que se resuelve al valor de la clave de partición del dominio. También puede usar operadores, como%function, para gestionar casos más complejos. Para ver ejemplos, consulte Permisos de sincronización.

Una vez que haya determinado cómo decidir los permisos de lectura y escritura de un usuario para una partición determinada, defina las expresiones JSON correspondientes en los campos read y write de partition.permissions, de manera similar a:

{
...
"partition": {
"key": "owner_id",
"type": "string",
"permissions": {
"read": {
"$or": [
{ "%%user.id": "%%partition" },
{ "%%user.custom_data.shared": "%%partition" }
]
},
"write": {
"%%user.id": "%%partition"
}
}
}
...
}
6

Sync ofrece funciones que permiten optimizar el rendimiento de la sincronización y mejorar el proceso de recuperación de datos en el cliente. Estas funciones se representan mediante configuraciones adicionales:

  • client_max_offline_days

  • is_recovery_mode_disabled

Puedes establecer un valor numérico para client_max_offline_days. Al habilitar la sincronización mediante la interfaz de usuario de App Services, el valor predeterminado es 30, que representa 30 días.

Para obtener más información, consulte: Tiempo máximo sin conexión del cliente.

El modo de recuperación permite que Sincronización intente recuperar datos que aún no se han sincronizado al restablecer un cliente. Al habilitar Sincronización mediante la interfaz de usuario de App Services, el modo de recuperación se activa de forma predeterminada. Recomendamos activarlo para que el cliente se restablezca automáticamente. Si ha desactivado el modo de recuperación y desea volver a activarlo, configure is_recovery_mode_disabled en false.

Para obtener más información, consulta: Recuperar cambios no sincronizados.

{
"type": "partition",
"state": "enabled",
"development_mode_enabled": true,
"service_name": "mongodb-atlas",
"database_name": "my-test-database",
"partition": {
...
},
"client_max_offline_days": 30,
"is_recovery_mode_disabled": false
}
7

Ahora que ha definido la configuración de sincronización, incluidos los permisos de lectura y escritura, puede implementar los cambios para comenzar a sincronizar datos y aplicar reglas de sincronización.

Para implementar los cambios, importa la configuración de la aplicación en tu App Services Aplicación:

appservices push --remote="<Your App ID>"
1

Puede habilitar la sincronización para un solo clúster vinculado en su aplicación.

Necesitará el archivo de configuración del servicio del clúster para configurar la sincronización. Puede encontrarlo enumerando todos los servicios a través de la API de administración:

curl https://services.cloud.mongodb.com/api/admin/v3.0/groups/{GROUP_ID}/apps/{APP_ID}/services \
-X GET \
-h 'Authorization: Bearer <Valid Access Token>'

Identifica el servicio cuya configuración necesitas actualizar para habilitar sincronizar. Si aceptaste los nombres por defecto al configurar tu aplicación, este debería ser un servicio cuyo name es mongodb-atlas y type es mongodb-atlas. Necesitas el/la _id de este servicio.

Ahora puedes obtener el archivo de configuración para este servicio:

curl https://services.cloud.mongodb.com/api/admin/v3.0/groups/{GROUP_ID}/apps/{APP_ID}/services/{MongoDB_Service_ID}/config \
-X GET \
-h 'Authorization: Bearer <Valid Access Token>'

Una vez que tenga la configuración, agregue el objeto sync con la siguiente configuración de plantilla:

{
...
"sync": {
"type": "partition",
"state": "enabled",
"development_mode_enabled": <Boolean>,
"database_name": "<Database Name>",
"partition": {
"key": "<Partition Key Field Name>",
"type": "<Partition Key Type>",
"permissions": {
"read": { <Expression> },
"write": { <Expression> }
}
},
"client_max_offline_days": <Number>,
"is_recovery_mode_disabled": <Boolean>
}
...
}
2

La clave de partición de sincronización es un campo en cada documento sincronizado que asigna cada documento a un dominio del lado del cliente. Las reglas de sincronización se aplican a nivel de partición, por lo que es especialmente importante considerar el modelo de datos y los patrones de acceso. Para obtener más información sobre las claves de partición y cómo elegir una, consulte Particiones.

Puede obtener una lista de todas las claves de partición válidas y sus tipos correspondientes a través de la API de administración:

curl https://services.cloud.mongodb.com/api/admin/v3.0/groups/{GROUP_ID}/apps/{APP_ID}/sync/data?service_id=<MongoDB Service ID> \
-X GET \
-h 'Authorization: Bearer <Valid Access Token>'

Nota

La clave de partición puede ser obligatoria u opcional. Si el campo de clave de partición es opcional, todos los documentos de MongoDB que excluyan la clave de partición o tengan un valor nulo para esta se enviarán a la partición nula. Si el campo de clave de partición es obligatorio, Device Sync ignora cualquier documento de MongoDB que no tenga un valor válido para la clave de partición. Recomendamos una clave de partición obligatoria a menos que desee sincronizar datos preexistentes con valores de partición no válidos o faltantes de una colección de MongoDB.

Una vez que haya decidido qué campo utilizar, actualice sync.partition con el nombre del campo de clave de partición en el campo key y el tipo de clave de partición en el campo type.

{
...
"sync": {
"type": "partition",
"state": "enabled",
"development_mode_enabled": <Boolean>,
"database_name": "<Database Name>",
"partition": {
"key": "owner_id",
"type": "string",
"permissions": {
"read": { <Expression> },
"write": { <Expression> }
}
},
"client_max_offline_days": <Number>,
"is_recovery_mode_disabled": <Boolean>
}
...
}
3

App Services le permite definir expresiones JSON que evalúa dinámicamente cada vez que un usuario abre un reino para determinar si el usuario tiene permisos de lectura o escritura para los datos en la partición.

Las expresiones de regla de sincronización tienen acceso a%%user, que se resuelve al usuario que abrió el dominio, y a%%partition, que se resuelve al valor de la clave de partición del dominio. También puede usar operadores, como%function, para gestionar casos más complejos. Para ver ejemplos, consulte Permisos de sincronización.

Una vez que haya determinado cómo decidir los permisos de lectura y escritura de un usuario para una partición determinada, defina las expresiones JSON correspondientes en los campos read y write de sync.partition.permissions.

{
...
"sync": {
"type": "partition",
"state": "enabled",
"development_mode_enabled": <Boolean>,
"database_name": "<Database Name>",
"partition": {
"key": "owner_id",
"type": "string",
"permissions": {
"read": {
"$or": [
{ "%%user.id": "%%partition" },
{ "%%user.custom_data.shared": "%%partition" }
]
},
"write": {
"%%user.id": "%%partition"
}
}
},
"client_max_offline_days": <Number>,
"is_recovery_mode_disabled": <Boolean>
}
...
}
4

Sync ofrece funciones que permiten optimizar el rendimiento de la sincronización y mejorar el proceso de recuperación de datos del cliente. Estas funciones se representan mediante configuraciones adicionales:

  • client_max_offline_days

  • is_recovery_mode_disabled

Puedes establecer un valor numérico para client_max_offline_days. Al habilitar la sincronización mediante la interfaz de usuario de App Services, el valor predeterminado es 30, que representa 30 días.

Para obtener más información, consulte: Tiempo máximo sin conexión del cliente.

El modo de recuperación permite que Sincronización intente recuperar datos no sincronizados al restablecer un cliente. Al habilitar Sincronización mediante la interfaz de usuario de App Services, el modo de recuperación se activa de forma predeterminada. Recomendamos activarlo para gestionar automáticamente el restablecimiento del cliente. Para activarlo, configure is_recovery_mode_disabled en false.

Para obtener más información, consulta: Recuperar cambios no sincronizados.

{
...
"sync": {
"type": "partition",
"state": "enabled",
"development_mode_enabled": true,
"database_name": "my-test-database",
"partition": {
...
},
"client_max_offline_days": 30,
"is_recovery_mode_disabled": false
}
...
}
5

Ahora que ha definido la configuración de sincronización, incluidos los permisos de lectura y escritura, puede implementar los cambios para comenzar a sincronizar datos y aplicar reglas de sincronización.

Para implementar sus cambios, envíe una solicitud de API de administración que actualice la configuración del clúster con su configuración de sincronización:

curl https://services.cloud.mongodb.com/api/admin/v3.0/groups/{GROUP_ID}/apps/{APP_ID}/services/{MongoDB_Service_ID}/config \
-X PATCH \
-h 'Authorization: Bearer <Valid Access Token>' \
-d @/sync/config.json

Cada vez que un usuario abre un dominio sincronizado desde una aplicación cliente, App Services evalúa las reglas de la aplicación y determina si el usuario tiene permisos de lectura y escritura para la partición. Los usuarios deben tener permisos de lectura para sincronizar y leer datos en un dominio, y de escritura para crear, modificar o eliminar objetos. El permiso de escritura implica permiso de lectura; por lo tanto, si un usuario tiene permiso de escritura, también tiene permiso de lectura.

Las reglas de sincronización se aplican a particiones específicas y se vinculan al modelo de datos de la aplicación mediante la clave de partición. Tenga en cuenta el siguiente comportamiento al diseñar sus esquemas para garantizar la granularidad adecuada en el acceso a los datos y evitar la filtración accidental de información confidencial.

  • Las reglas de sincronización se aplican dinámicamente según el usuario. Un usuario puede tener acceso completo de lectura y escritura a una partición, mientras que otro solo tiene permisos de lectura o no puede acceder a ella por completo. Estos permisos se controlan mediante la definición de expresiones JSON.

  • Las reglas de sincronización se aplican por igual a todos los objetos de una partición. Si un usuario tiene permiso de lectura o escritura para una partición determinada, puede leer o modificar todos los campos sincronizados de cualquier objeto de la partición.

  • Los permisos de escritura requieren permisos de lectura, por lo que un usuario con acceso de escritura a una partición también tiene acceso de lectura independientemente de las reglas de permiso de lectura definidas.

Los Servicios de aplicación aplican permisos dinámicos de lectura y guardar específicos del usuario para proteger los datos en cada partición. Defines los permisos con expresiones de Expresión de regla JSON que controlan si un usuario determinado tiene acceso de lectura o escritura a los datos en una partición determinada. aplicación Services evalúa los permisos de un usuario cada vez que abre un realm sincronizado.

Tip

Sus expresiones de reglas pueden usar expansiones JSON como %%partition y para determinar dinámicamente los permisos de un usuario según el contexto de su %%user solicitud.

Un usuario con permisos de lectura para una partición determinada puede ver todos los campos de cualquier objeto en el dominio sincronizado correspondiente. Los permisos de lectura no permiten modificar los datos.

Un usuario con permisos de escritura para una partición determinada puede modificar el valor de cualquier campo de cualquier objeto en el dominio sincronizado correspondiente. Los permisos de escritura requieren permisos de lectura, por lo que cualquier usuario que pueda modificar datos también puede verlos antes y después de su modificación.

Importante

Las relaciones no pueden abarcar particiones

En una aplicación que utiliza sincronización basada en particiones, un objeto solo puede tener relación con otros objetos de la misma partición. Los objetos pueden existir en diferentes bases de datos y colecciones (dentro del mismo clúster) siempre que el valor de la clave de partición coincida.

Puedes estructurar tus expresiones de permisos de lectura y escritura como un conjunto de estrategias de permisos que se aplican a tu estrategia de partición. Las siguientes estrategias describen enfoques comunes que puedes utilizar para definir permisos de lectura y escritura sincronizados para tu aplicación.

Puede definir permisos globales que se apliquen a todos los usuarios en todas las particiones. En esencia, esto implica optar por no implementar permisos específicos de usuario y, en cambio, por permisos universales de lectura o escritura que se apliquen a todos los usuarios.

Para definir un permiso global de lectura o escritura, especifique un valor booleano o una expresión JSON que siempre evalúe el mismo valor booleano.

Ejemplo
Descripción
true

La expresión true significa que todos los usuarios tienen los permisos de acceso dados para todas las particiones.

false

La expresión false significa que ningún usuario tiene los permisos de acceso dados para ninguna partición.

{ "%%true": true }

Esta expresión siempre se evalúa como true, por lo que es efectivamente lo mismo que especificar directamente true.

Puede definir permisos que se apliquen a una partición específica o a un grupo de particiones especificando explícitamente sus valores de partición.

Ejemplo
Descripción
{ "%%partition": "PUBLIC" }

Esta expresión significa que todos los usuarios tienen los permisos de acceso otorgados para los datos con un valor de partición de "Public".

{
"%%partition": {
"$in": [
"PUBLIC (NA)",
"PUBLIC (EMEA)",
"PUBLIC (APAC)"
]
}
}

Esta expresión significa que todos los usuarios tienen los permisos de acceso dados para los datos con cualquiera de los valores de partición especificados.

Puedes definir permisos que apliquen a un usuario específico o a un grupo de usuarios especificando explícitamente sus valores ID.

Ejemplo
Descripción
{ "%%user.id": "5f4863e4d49bd2191ff1e623" }

Esta expresión significa que el usuario con id "5f4863e4d49bd2191ff1e623" tiene los permisos de acceso dados para los datos en cualquier partición.

{
"%%user.id": {
"$in": [
"5f4863e4d49bd2191ff1e623",
"5f48640dd49bd2191ff1e624",
"5f486417d49bd2191ff1e625"
]
}
}

Esta expresión significa que cualquier usuario con uno de los valores de ID de usuario especificados tiene los permisos de acceso dados para los datos en cualquier partición.

Puede definir permisos que se apliquen a los usuarios en función de datos específicos definidos en su documento de datos de usuario personalizado, campos de metadatos u otros datos de un proveedor de autenticación.

Ejemplo
Descripción
{ "%%user.custom_data.readPartitions" : "%%partition" }

Esta expresión significa que un usuario tiene acceso de lectura a una partición si el valor de la partición aparece en el campo readPartitions de sus datos de usuario personalizados.

{ "%%user.data.writePartitions" : "%%partition" }

Esta expresión significa que un usuario tiene acceso de escritura a una partición si el valor de la partición aparece en el campo data.writePartitions de su objeto de usuario.

Puedes definir permisos dinámicos complejos evaluando una función que retorna un valor booleano. Esto resulta útil en esquemas de permisos que requieren acceder a sistemas externos u otra lógica personalizada que no se puede expresar únicamente en expresiones JSON.

Ejemplo
Descripción
{
"%%true": {
"%function": {
"name": "canReadPartition",
"arguments": ["%%partition"]
}
}
}
// canReadPartition
exports = async (partition) => {
const cluster = context.services.get("mongodb-atlas");
const permissions = cluster
.db("myApp")
.collection("permissions");
const { canRead } = await permissions.findOne({ partition });
return canRead.includes(context.user.id);
}

Esta expresión llama a la función canReadPartition y pasa el valor de la partición como su primer y único argumento. La función consulta los permisos del usuario para la partición en una colección de MongoDB y luego devuelve un valor booleano que indica si el usuario puede leer datos en la partición solicitada.

Si migra su aplicación de sincronización basada en particiones a sincronización flexible, sus reglas de acceso a datos también deben migrarse.

Algunas estrategias de reglas de sincronización basadas en particiones no se pueden traducir directamente a reglas de App Services. Es posible que deba migrar manualmente los permisos que incluyen:

  • %function operador.

    Las reglas de función no son compatibles con Flexible Sync y no se pueden migrar.

  • %%partition expansión.

    Las reglas de servicios de aplicaciones no tienen una expansión equivalente %%partition para, por lo que no se pueden migrar.

  • %or, %not, %nor, %and expansiones.

    Estos permisos pueden funcionar, pero presentan suficientes matices como para que deba probarlos para garantizar el comportamiento esperado. Probar nuevos permisos no funcionará en la aplicación que está migrando. Necesitará una aplicación nueva para probar los permisos migrados manualmente.

Consulte la lista de expansiones compatibles con Flexible Sync para ver todas las expansiones admitidas.

También debe consultar la Guía de permisos de sincronización de dispositivos para obtener más información sobre cómo trabajar con permisos.

Una estrategia de partición es un patrón clave-valor para dividir objetos en particiones. Distintos casos de uso requieren diferentes estrategias de partición. Puedes crear estrategias de partición dentro de la misma aplicación para formar una estrategia más amplia. Esto te permite gestionar casos de uso de complejidad arbitraria.

La estrategia a utilizar depende del modelo de datos y los patrones de acceso de tu aplicación. Considera una aplicación con datos públicos y privados. Podrías colocar algunos datos, como los anuncios, en una partición pública. Podrías restringir otros datos, como la información personal, a usuarios con privilegios.

Al desarrollar una estrategia de partición, considere:

  • Seguridad de datos: Los usuarios pueden necesitar diferentes permisos de lectura y escritura para subconjuntos de datos. Considere los permisos que necesitan los usuarios para cada tipo de documento. Un usuario tiene los mismos permisos para todos los documentos de una partición.

  • Capacidad de almacenamiento: Es posible que sus aplicaciones cliente tengan almacenamiento limitado en algunos dispositivos y plataformas. Una estrategia de partición debe tener en cuenta las limitaciones de almacenamiento. Asegúrese de que el usuario pueda almacenar los datos sincronizados en su dispositivo.

Tip

Combinar estrategias

Puedes usar un nombre de clave de partición como _partition con una cadena de consulta como valor. Esto te permite usar varias estrategias en la misma aplicación. Por ejemplo:

_partitionKey: "user_id=abcdefg"
_partitionKey: "team_id=1234&city='New York, NY'"

Puede usar funciones y expresiones de regla para analizar la cadena. Sync puede determinar si un usuario tiene acceso a una partición según la estrategia combinada.

Una estrategia de partición Firehose agrupa todos los documentos en una sola partición. Con esta estructura, cada usuario sincroniza todos los datos de la aplicación con su dispositivo. Este enfoque, en la práctica, implica no particionar los datos. Funciona para aplicaciones básicas o pequeños conjuntos de datos públicos.

  • Seguridad de datos. Todos los datos son públicos para los clientes con un dominio que usa la partición. Si un usuario tiene acceso de lectura o escritura a la partición, puede leer o escribir cualquier documento.

  • Capacidad de almacenamiento. Cada usuario sincroniza todos los documentos de la partición. Todos los datos deben caber dentro de su límite de almacenamiento máximo. Utilice esta estrategia solo cuando los conjuntos de datos sean pequeños y no crezcan rápidamente.

Una forma de crear una manguera contra incendios es establecer la clave de partición como campo opcional. No incluya un valor para este campo en ningún documento. App Services asigna cualquier documento que no incluya un valor de partición a la partición nula.

También puede establecer un valor de partición estático. En este caso, el valor de partición no cambia según el usuario ni los datos. Por ejemplo, los dominios de todos los clientes podrían usar el valor de "MyPartitionValue" partición.

Ejemplo

Una aplicación permite a los usuarios consultar los resultados y las estadísticas de los partidos de béisbol de las escuelas secundarias locales. Considere los siguientes documentos en las colecciones games y teams:

collection games: [
{ teams: ["Brook Ridge Miners", "Southside Rockets"], score: { ... }, date: ... }
{ teams: ["Brook Ridge Miners", "Uptown Bombers"], score: { ... }, date: ... }
{ teams: ["Brook Ridge Miners", "Southside Rockets"], score: { ... }, date: ... }
{ teams: ["Southside Rockets", "Uptown Bombers"], score: { ... }, date: ... }
{ teams: ["Brook Ridge Miners", "Uptown Bombers"], score: { ... }, date: ... }
{ teams: ["Southside Rockets", "Uptown Bombers"], score: { ... }, date: ... }
]
collection teams: [
{ name: "Brook Ridge Miners" }
{ name: "Southside Rockets" }
{ name: "Uptown Bombers" }
]

El número total de partidos es reducido. Un pequeño número de equipos locales solo juega unos pocos partidos al año. La mayoría de los dispositivos deberían poder descargar todos los datos de los partidos para facilitar el acceso sin conexión. En este caso, la estrategia de "firehose" es adecuada. Los datos son públicos y los documentos no necesitan una clave de partición.

La estrategia asigna las colecciones a los siguientes ámbitos:

realm null: [
Game { teams: ["Brook Ridge Miners", "Southside Rockets"], score: { ... }, date: ... }
Game { teams: ["Brook Ridge Miners", "Uptown Bombers"], score: { ... }, date: ... }
Game { teams: ["Brook Ridge Miners", "Southside Rockets"], score: { ... }, date: ... }
Game { teams: ["Southside Rockets", "Uptown Bombers"], score: { ... }, date: ... }
Game { teams: ["Brook Ridge Miners", "Uptown Bombers"], score: { ... }, date: ... }
Game { teams: ["Southside Rockets", "Uptown Bombers"], score: { ... }, date: ... }
Team { name: "Brook Ridge Miners" }
Team { name: "Southside Rockets" }
Team { name: "Uptown Bombers" }
]

Una estrategia de partición de usuarios agrupa los documentos privados de cada usuario. Estos documentos se guardan en una partición específica para ese usuario. Esto funciona cuando cada documento tiene un propietario y nadie más necesita los datos. Un nombre de usuario o ID que identifica al propietario constituye una clave de partición natural.

  • Seguridad de datos. Los datos de una partición de usuario son específicos de cada usuario. Pueden contener información privada. Cada usuario sincroniza únicamente su propia partición. Los demás usuarios no pueden acceder a los documentos de la partición.

  • Capacidad de almacenamiento. Cada usuario solo sincroniza datos de su propia partición. Sus datos deben ajustarse a las limitaciones de almacenamiento de su dispositivo. Utilice esta estrategia solo cuando cada usuario tenga una cantidad de datos manejable.

Ejemplo

Una aplicación de streaming de música almacena datos sobre listas de reproducción y calificaciones de canciones de cada usuario. Considere los siguientes documentos en las colecciones playlists y ratings:

collection playlists: [
{ name: "Work", owner_id: "dog_enthusiast_95", song_ids: [ ... ] }
{ name: "Party", owner_id: "cat_enthusiast_92", song_ids: [ ... ] }
{ name: "Soup Tunes", owner_id: "dog_enthusiast_95", song_ids: [ ... ] }
{ name: "Disco Anthems", owner_id: "PUBLIC", song_ids: [ ... ] }
{ name: "Deep Focus", owner_id: "PUBLIC", song_ids: [ ... ] }
]
collection ratings: [
{ owner_id: "dog_enthusiast_95", song_id: 3, rating: -1 }
{ owner_id: "cat_enthusiast_92", song_id: 1, rating: 1 }
{ owner_id: "dog_enthusiast_95", song_id: 1, rating: 1 }
]

Cada documento incluye el campo owner_id. Esta es una buena clave de partición para una estrategia de partición de usuarios. Asigna los documentos a usuarios individuales de forma natural. Esto limita los datos de cada dispositivo a las listas de reproducción y las calificaciones del usuario.

  • Los usuarios tienen acceso de lectura y escritura a su dominio de usuario. Este contiene las listas de reproducción que han creado y las calificaciones que han otorgado a las canciones.

  • Cada usuario tiene acceso de lectura al dominio para la partición PUBLIC. Esta contiene listas de reproducción disponibles para todos los usuarios.

La estrategia asigna las colecciones a los siguientes ámbitos:

realm dog_enthusiast_95: [
Playlist { name: "Work", owner_id: "dog_enthusiast_95", song_ids: [ ... ] }
Playlist { name: "Soup Tunes", owner_id: "dog_enthusiast_95", song_ids: [ ... ] }
Rating { owner_id: "dog_enthusiast_95", song_id: 3, rating: -1 }
Rating { owner_id: "dog_enthusiast_95", song_id: 1, rating: 1 }
]
realm cat_enthusiast_92: [
Playlist { name: "Party", owner_id: "cat_enthusiast_92", song_ids: [ ... ] }
Rating { owner_id: "cat_enthusiast_92", song_id: 1, rating: 1 }
]
realm PUBLIC: [
Playlist { name: "Disco Anthems", owner_id: "PUBLIC", song_ids: [ ... ] }
Playlist { name: "Deep Focus", owner_id: "PUBLIC", song_ids: [ ... ] }
]

Una estrategia de partición de equipo agrupa documentos privados compartidos por un equipo de usuarios. Un equipo puede incluir a los empleados de una tienda o a los miembros de una banda. Cada equipo tiene una partición específica. Todos los usuarios del equipo comparten el acceso y la propiedad de los documentos.

  • Seguridad de datos. Los datos de una partición de equipo son específicos de cada equipo. Pueden contener datos privados del equipo, pero no de sus miembros. Cada usuario sincroniza las particiones de los equipos a los que pertenece. Los usuarios que no pertenecen a un equipo no pueden acceder a los documentos de la partición.

  • Capacidad de almacenamiento: Cada usuario solo sincroniza los datos de sus propios equipos. Los datos de los equipos de un usuario deben ajustarse a las limitaciones de almacenamiento de su dispositivo. Utilice esta estrategia cuando los usuarios pertenezcan a un número razonable de equipos. Si los usuarios pertenecen a varios equipos, los dominios combinados podrían contener una gran cantidad de datos. Es posible que deba limitar el número de particiones de equipo que se sincronizan simultáneamente.

Ejemplo

Una aplicación permite a los usuarios crear proyectos para colaborar con otros usuarios. Considere los siguientes documentos en las colecciones projects y tasks:

collection projects: [
{ name: "CLI", owner_id: "cli-team", task_ids: [ ... ] }
{ name: "API", owner_id: "api-team", task_ids: [ ... ] }
]
collection tasks: [
{ status: "complete", owner_id: "api-team", text: "Import dependencies" }
{ status: "inProgress", owner_id: "api-team", text: "Create app MVP" }
{ status: "inProgress", owner_id: "api-team", text: "Investigate off-by-one issue" }
{ status: "todo", owner_id: "api-team", text: "Write tests" }
{ status: "inProgress", owner_id: "cli-team", text: "Create command specifications" }
{ status: "todo", owner_id: "cli-team", text: "Choose a CLI framework" }
]

Cada documento incluye el campo owner_id. Esta es una buena clave de partición para una estrategia de partición de equipos. Asigna documentos a equipos individuales de forma natural. Esto limita los datos en cada dispositivo. Los usuarios solo tienen proyectos y tareas relevantes para ellos.

  • Los usuarios tienen acceso de lectura y escritura a las particiones propiedad de los equipos de los que son miembros.

  • Los datos almacenados en una colección teams o users pueden asignar usuarios a la membresía del equipo:

    collection teams: [
    { name: "cli-team", member_ids: [ ... ] }
    { name: "api-team", member_ids: [ ... ] }
    ]
    collection users: [
    { name: "Joe", team_ids: [ ... ] }
    { name: "Liz", team_ids: [ ... ] }
    { name: "Matt", team_ids: [ ... ] }
    { name: "Emmy", team_ids: [ ... ] }
    { name: "Scott", team_ids: [ ... ] }
    ]

La estrategia asigna las colecciones a los siguientes ámbitos:

realm cli-team: [
Project { name: "CLI", owner_id: "cli-team", task_ids: [ ... ] }
Task { status: "inProgress", owner_id: "cli-team", text: "Create command specifications" }
Task { status: "todo", owner_id: "cli-team", text: "Choose a CLI framework" }
]
realm api-team: [
Project { name: "API", owner_id: "api-team", task_ids: [ ... ] }
Task { status: "complete", owner_id: "api-team", text: "Import dependencies" }
Task { status: "inProgress", owner_id: "api-team", text: "Create app MVP" }
Task { status: "inProgress", owner_id: "api-team", text: "Investigate off-by-one issue" }
Task { status: "todo", owner_id: "api-team", text: "Write tests" }
]

Una estrategia de partición de canales agrupa documentos para un tema o dominio común. Cada tema o dominio tiene su propia partición. Los usuarios pueden acceder o suscribirse a canales específicos. Un nombre o ID puede identificar estos canales en una lista pública.

  • Seguridad de datos. Los datos de una partición de canal son específicos de un tema o área. Los usuarios pueden elegir acceder a estos canales. Puede limitar el acceso de un usuario a un subconjunto de canales. También puede impedir que los usuarios accedan a los canales por completo. Si un usuario tiene permiso de lectura o escritura en un canal, puede acceder a cualquier documento de la partición.

  • Capacidad de almacenamiento. Los usuarios pueden sincronizar datos desde cualquier canal permitido. Todos los datos de los canales de un usuario deben ajustarse a las limitaciones de almacenamiento de su dispositivo. Utilice esta estrategia para particionar conjuntos de datos públicos o semiprivados. Esta estrategia divide los conjuntos de datos que no se ajustan a las limitaciones de almacenamiento.

Ejemplo

Una aplicación permite a los usuarios crear salas de chat basadas en temas. Pueden buscar y unirse a canales sobre cualquier tema que les interese. Considere estos documentos en las colecciones chatrooms y messages:

collection chatrooms: [
{ topic: "cats", description: "A place to talk about cats" }
{ topic: "sports", description: "We like sports and we don't care who knows" }
]
collection messages: [
{ topic: "cats", text: "Check out this cute pic of my cat!", timestamp: 1625772933383 }
{ topic: "cats", text: "Can anybody recommend a good cat food brand?", timestamp: 1625772953383 }
{ topic: "sports", text: "Did you catch the game last night?", timestamp: 1625772965383 }
{ topic: "sports", text: "Yeah what a comeback! Incredible!", timestamp: 1625772970383 }
{ topic: "sports", text: "I can't believe how they scored that goal.", timestamp: 1625773000383 }
]

Cada documento incluye el campo topic. Esta es una buena clave de partición para una estrategia de partición de canales. Asigna documentos a canales individuales de forma natural. Esto reduce los datos en cada dispositivo. Los datos solo contienen mensajes y metadatos de los canales que el usuario ha seleccionado.

  • Los usuarios tienen acceso de lectura y escritura a las salas de chat a las que están suscritos. Pueden modificar o eliminar cualquier mensaje, incluso los enviados por otros usuarios. Para limitar los permisos de escritura, puedes otorgarles acceso de solo lectura. Después, gestiona el envío de mensajes con una función sin servidor.

  • Almacene los canales suscritos del usuario en la colección chatrooms o users:

    collection chatrooms: [
    { topic: "cats", subscriber_ids: [ ... ] }
    { topic: "sports", subscriber_ids: [ ... ] }
    ]
    collection users: [
    { name: "Joe", chatroom_ids: [ ... ] }
    { name: "Liz", chatroom_ids: [ ... ] }
    { name: "Matt", chatroom_ids: [ ... ] }
    { name: "Emmy", chatroom_ids: [ ... ] }
    { name: "Scott", chatroom_ids: [ ... ] }
    ]

La estrategia asigna las colecciones a los siguientes ámbitos:

realm cats: [
Chatroom { topic: "cats", description: "A place to talk about cats" }
Message { topic: "cats", text: "Check out this cute pic of my cat!", timestamp: 1625772933383 }
Message { topic: "cats", text: "Can anybody recommend a good cat food brand?", timestamp: 1625772953383 }
]
realm sports: [
Chatroom { topic: "sports", description: "We like sports and we don't care who knows" }
Message { topic: "sports", text: "Did you catch the game last night?", timestamp: 1625772965383 }
Message { topic: "sports", text: "Yeah what a comeback! Incredible!", timestamp: 1625772970383 }
Message { topic: "sports", text: "I can't believe how they scored that goal.", timestamp: 1625773000383 }
]

Una estrategia de partición regional agrupa documentos relacionados con una ubicación o región. Cada partición contiene documentos específicos de esas áreas.

  • Seguridad de los datos. Los datos son específicos de una determinada área geográfica. Puede limitar el acceso de un usuario a su región actual. Alternativamente, conceda acceso a los datos por región.

  • Capacidad de almacenamiento. Las necesidades de almacenamiento varían según el tamaño y los patrones de uso de la región. Es posible que los usuarios solo sincronicen datos en su propia región. Los datos de cualquier región deben ajustarse a las limitaciones de almacenamiento del dispositivo. Si los usuarios sincronizan varias regiones, divídanlas en subregiones más pequeñas. Esto ayuda a evitar sincronizar datos innecesarios.

Ejemplo

Una aplicación permite a los usuarios buscar restaurantes cercanos y pedir de sus menús. Considere los siguientes documentos de la colección restaurants:

collection restaurants: [
{ city: "New York, NY", name: "Joe's Pizza", menu: [ ... ] }
{ city: "New York, NY", name: "Han Dynasty", menu: [ ... ] }
{ city: "New York, NY", name: "Harlem Taste", menu: [ ... ] }
{ city: "Chicago, IL", name: "Lou Malnati's", menu: [ ... ] }
{ city: "Chicago, IL", name: "Al's Beef", menu: [ ... ] }
{ city: "Chicago, IL", name: "Nando's", menu: [ ... ] }
]

Cada documento incluye el campo city. Esta es una buena clave de partición para una estrategia de partición regional. Asigna documentos de forma natural a áreas físicas específicas. Esto limita los datos a los mensajes y metadatos de la ciudad actual del usuario. Los usuarios tienen acceso de lectura a los restaurantes de su región actual. Puede determinar la región del usuario en la lógica de su aplicación.

La estrategia asigna las colecciones a los siguientes ámbitos:

realm New York, NY: [
{ city: "New York, NY", name: "Joe's Pizza", menu: [ ... ] }
{ city: "New York, NY", name: "Han Dynasty", menu: [ ... ] }
{ city: "New York, NY", name: "Harlem Taste", menu: [ ... ] }
]
realm Chicago, IL: [
{ city: "Chicago, IL", name: "Lou Malnati's", menu: [ ... ] }
{ city: "Chicago, IL", name: "Al's Beef", menu: [ ... ] }
{ city: "Chicago, IL", name: "Nando's", menu: [ ... ] }
]

Una estrategia de partición de buckets agrupa los documentos por rango. Cuando los documentos se extienden a lo largo de una dimensión, una partición contiene un subrango. Considere rangos de buckets basados ​​en el tiempo. Los desencadenadores mueven los documentos a nuevas particiones cuando caen fuera de su rango de bucket.

  • Seguridad de datos. Limite la lectura o escritura de los usuarios a solo buckets específicos. Los datos pueden fluir entre buckets. Considere los permisos de acceso para un documento en todos los buckets posibles.

  • Capacidad de almacenamiento. Las necesidades de almacenamiento varían según el tamaño y los patrones de uso de cada bucket. Considere a qué buckets necesitan acceder los usuarios. Limite el tamaño de los buckets para que se ajuste a las limitaciones de almacenamiento del dispositivo. Si los usuarios sincronizan muchos buckets, divídalos en buckets más pequeños. Esto ayuda a evitar la sincronización de datos innecesarios.

Ejemplo

Una aplicación de IoT muestra vistas en tiempo real de las lecturas de los sensores varias veces por segundo. Los intervalos se calculan a partir de la cantidad de segundos transcurridos desde la recepción de la lectura. Considere estos documentos en la colección readings:

collection readings: [
{ bucket: "0s<t<=60s", timestamp: 1625773000383 , data: { ... } }
{ bucket: "0s<t<=60s", timestamp: 1625772970383 , data: { ... } }
{ bucket: "0s<t<=60s", timestamp: 1625772965383 , data: { ... } }
{ bucket: "60s<t<=300s", timestamp: 1625772953383 , data: { ... } }
{ bucket: "60s<t<=300s", timestamp: 1625772933383 , data: { ... } }
]

Cada documento incluye el campo bucket. Este campo asigna los documentos a intervalos de tiempo específicos. El dispositivo del usuario solo contiene las lecturas de los sensores de la ventana que visualiza.

  • Los usuarios tienen acceso de lectura a las lecturas de los sensores para cualquier período de tiempo.

  • Los sensores utilizan aplicaciones cliente con acceso de escritura para cargar lecturas.

La estrategia asigna las colecciones a los siguientes ámbitos:

realm 0s<t<=60s: [
Reading { bucket: "0s<t<=60s", timestamp: 1625773000383 , data: { ... } }
Reading { bucket: "0s<t<=60s", timestamp: 1625772970383 , data: { ... } }
Reading { bucket: "0s<t<=60s", timestamp: 1625772965383 , data: { ... } }
]
realm 60s<t<=300s: [
Reading { bucket: "60s<t<=300s", timestamp: 1625772953383 , data: { ... } }
Reading { bucket: "60s<t<=300s", timestamp: 1625772933383 , data: { ... } }
]

Laingesta de datos es una función de Flexible Sync y no se puede habilitar en aplicaciones que usan sincronización basada en particiones.

Cuando utiliza la sincronización basada en particiones, su aplicación Atlas App Services utiliza esta configuración de sincronización:

sincronización/config.json
{
"type": "partition",
"state": <"enabled" | "disabled">,
"development_mode_enabled": <Boolean>,
"service_name": "<Data Source Name>",
"database_name": "<Development Mode Database Name>",
"partition": {
"key": "<Partition Key Field Name>",
"type": "<Partition Key Type>",
"permissions": {
"read": { <Expression> },
"write": { <Expression> }
}
},
"last_disabled": <Number>,
"client_max_offline_days": <Number>,
"is_recovery_mode_disabled": <Boolean>
}
Campo
Descripción
type
String

El modo de sincronización. Hay dos modos de sincronización: la sincronizaciónflexible y la sincronización basada en particiones, más antigua.

Opciones válidas para una configuración de sincronización basada en particiones:

  • "partition"

state
String

El estado actual del protocolo de sincronización para la aplicación.

Opciones válidas:

  • "enabled"

  • "disabled"

service_name
String

El nombre de la fuente de datos de MongoDB que se sincronizará. No se puede usar la sincronización con una instancia sin servidor ni con una instancia de base de datos federada.

development_mode_enabled
Boolean

Si true es, elmodo de desarrollo está habilitado para la aplicación. Mientras esté habilitado, App Services almacena automáticamente los objetos sincronizados en una base de datos específica (especificada database_name en) y refleja los tipos de objetos en los esquemas de colección de esa base de datos.

database_name
String

El nombre de una base de datos en el clúster sincronizado donde App Services almacena datos en modo de desarrollo. App Services genera automáticamente un esquema para cada tipo sincronizado y asigna cada tipo de objeto a una colección dentro de la base de datos.

partition.key
String

El nombre del campo de la clave de partición de tu aplicación. Este campo debe estar definido en el esquema para los tipos de objeto que quieras sincronizar.

partition.type
String

El tipo de valor del campo de llave de partición. Esto debe coincidir con el tipo definido en el esquema del objeto.

Opciones válidas:

  • "string"

  • "objectId"

  • "long"

partition.permissions.read
Expression

Una expresión que evalúa a true cuando un usuario tiene permiso para leer objetos en una partición. Si la expresión evalúa false a, App Services no permite al usuario leer un objeto ni sus propiedades.

partition.permissions.write
Expression

Una expresión que se evalúa true como cuando un usuario tiene permiso para escribir objetos en una partición. Si la expresión se evalúa false como, App Services no permite al usuario modificar un objeto ni sus propiedades. El permiso de escritura requiere permiso de lectura. Un usuario no puede escribir en un documento que no puede leer.

last_disabled
Number

La fecha y hora en que se pausó o deshabilitó la sincronización por última vez, representada por la cantidad de segundos desde la época de Unix (enero 1, 1970, 00:00:00 UTC).

client_max_offline_days
Number

Controla cuánto tiempo espera el proceso de compactación de backend antes de podar agresivamente los metadatos que algunos clientes necesitan sincronizar desde una versión anterior de un reino.

is_recovery_mode_disabled
Boolean

Si false es, el modo de recuperación está habilitado para la aplicación. Mientras esté habilitado, los SDK de Realm que admiten esta función intentan recuperar los cambios no sincronizados al restablecer el cliente. El modo de recuperación está habilitado de forma predeterminada.

Debes Terminar Device Sync y Volver a habilitar Device Sync para realizar cambios en tu configuración de sincronización de dispositivos basada en particiones. Mientras vuelves a habilitar Atlas Device Sync, puedes especificar una nueva clave de partición o realizar cambios en tus permisos de lectura/escritura. Realizar cambios en tu configuración de Device Sync mientras terminas y vuelves a habilitar Device Sync activará un restablecimiento del cliente. Para saber más sobre cómo lidiar con los restablecimientos del cliente, lee la documentación de restablecimiento del cliente.

Los siguientes errores pueden ocurrir cuando su aplicación utiliza sincronización basada en particiones.

Nombre del error
Descripción

ErrorIllegalRealmPath

Este error indica que el cliente intentó abrir un dominio con un valor de partición de tipo incorrecto. Por ejemplo, podría aparecer el mensaje de error "Intento de enlace en una partición de dominio ilegal: se esperaba que la partición tuviera el tipo objectId, pero se encontró una cadena".

Para recuperarse de este error, asegúrese de que el tipo de valor de partición utilizado para abrir el reino coincida con el tipo de clave de partición en su configuración de sincronización de dispositivo.

Atlas Device Sync utiliza espacio en el clúster Atlas sincronizado de tu aplicación para almacenar metadatos para la sincronización. Esto incluye un historial de cambios en cada dominio. Atlas App Services minimiza este uso de espacio en tu clúster Atlas. Minimizar los metadatos es necesario para reducir el tiempo y los datos necesarios para la sincronización.

Las aplicaciones que utilizan la sincronización basada en particiones realizan una compactación del backend para reducir la cantidad de metadatos almacenados en un clúster Atlas. La compactación del backend es un proceso de mantenimiento que se ejecuta automáticamente para todas las aplicaciones que utilizan la sincronización basada en particiones. Mediante la compactación, el backend optimiza el historial de un dominio eliminando metadatos innecesarios del conjunto de cambios. El proceso elimina cualquier instrucción cuyo efecto se sobrescriba posteriormente con una instrucción más reciente.

Ejemplo

Consideremos la siguiente historia del reino:

Historial original
CREATE table1.object1
UPDATE table1.object1.x = 4
UPDATE table1.object1.x = 10
UPDATE table1.object1.x = 42

La siguiente historia también convergería al mismo estado, pero sin cambios intermedios innecesarios:

Historia compactada
CREATE table1.object1
UPDATE table1.object1.x = 42

Nota

La sincronización basada en particiones utiliza la compactación del backend para reducir el historial de sincronización de dispositivos almacenado en Atlas. La sincronización flexible logra esto mediante la optimización y el tiempo máximo sin conexión del cliente.

Volver

¿Quién soy?