Overview
Una relación es una conexión entre dos documentos. Permite referenciar y consultar documentos relacionados en operaciones de lectura y escritura, incluso si se encuentran en bases de datos o colecciones independientes.
Se define una relación en una colección de origen de MongoDB y se vincula a documentos de una colección externa. Atlas App Services resuelve automáticamente las relaciones en los modelos de datos del SDK sincronizados reemplazando los valores de un campo de origen con los documentos externos a los que hacen referencia.
Las relaciones son unidireccionales y no aplican unicidad ni otras restricciones de claves foráneas. Si se referencia un valor foráneo inexistente en un campo de origen, Servicios de aplicación omite automáticamente la referencia de las relaciones resueltas.
Ejemplo
Consideremos una aplicación que tiene dos colecciones:
El
accountsLa colección contiene documentos que describen cada uno una cuenta de cliente.Esquema de cobro de cuentas{ "title": "Account", "properties": { "_id": { "bsonType": "objectId" }, "account_id": { "bsonType": "string" }, "products": { "bsonType": "array", "items": { "bsonType": "string" } }, ... } } La colección
customerscontiene documentos que describen a cada cliente individual que puede tener una o más cuentas. Cada documento en la coleccióncustomerstiene un campoaccountsque contiene un arreglo de todos los valoresaccount_idde la colecciónaccountsque aplican al cliente.Esquema de colección del cliente{ "title": "Customer", "properties": { "username": { "bsonType": "string" }, "accounts": { "bsonType": "array", "items": { "bsonType": "string" } }, ... } }
La aplicación define esta relación en la colección customers. Apunta desde la matriz de valores de ID de cuenta almacenados en el campo accounts al campo account_id de cada documento de la colección accounts.
{ "accounts": { "ref": "#/relationship/mongodb-atlas/sample_analytics/accounts", "foreign_key": "account_id", "is_list": true } }
Con esta relación definida, App Services puede devolver un cliente y todas sus cuentas en las consultas de cliente. Sin una relación, las consultas devolverían una lista de solo valores account_id en lugar de los objetos Account completos.
Cardinalidad
La cardinalidad de una relación determina la cantidad de documentos externos a los que puede hacer referencia. App Services admite dos cardinalidades de relación: "a uno" y "a muchos".
A uno
Una relación de uno a uno vincula cada documento fuente con un solo documento o con un conjunto de documentos de la colección extranjera.
Para indicar que una relación tiene cardinalidad "a uno", establezca is_list en false:
{ "owner": { "ref": "#/relationship/mongodb-atlas/example/people", "foreign_key": "_id", "is_list": false } }
App Services reemplaza automáticamente los valores de origen con los objetos referenciados o un valor nulo en los modelos SDK:
{ "name": "Pet", "properties": { "name": "string", "owner": "Person" } } { "name": "Person", "properties": { "name": "string" } }
Demasiados
Una relación de varios vincula cada documento fuente con una lista de documentos de la colección extranjera.
Para indicar que una relación tiene cardinalidad "a muchos", establezca is_list en true:
{ "pets": { "ref": "#/relationship/mongodb-atlas/example/pets", "foreign_key": "_id", "is_list": true } }
App Services reemplaza automáticamente los valores de origen con los objetos referenciados o un valor nulo en los modelos SDK:
{ "name": "Pet", "properties": { "name": "string" } } { "name": "Person", "properties": { "name": "string", "pets": "Pet[]" } }
Relaciones de objetos incrustados
Los objetos incrustados pueden tener relaciones con colecciones externas. Utilice la notación de puntos para acceder a las propiedades de los objetos incrustados.
Objeto incrustado en otra colección
Un objeto incrustado puede tener una relación con un objeto de una colección externa.
{ "title": "Person", "properties": { "_id": { "bsonType": "objectId" }, "pet": { "bsonType":"object", "properties": { "favoriteToyBrand": { "bsonType": "objectId" } } } // ...additional model properties } }
Utilice la notación de puntos para especificar la propiedad del objeto incrustado relacionada con la colección externa. A continuación, puede especificar los detalles de la colección externa y el campo de clave externa.
{ "pet.favoriteToyBrand": { "ref": "#/relationship/mongodb-atlas/example/ToyBrand", "foreign_key": "_id", "is_list": false } }
Objeto incrustado dentro de una lista
Un objeto incrustado que está dentro de una propiedad de lista puede tener una relación con una colección externa.
{ "title": "Person", "properties": { "_id": { "bsonType": "objectId" }, "pets": { "bsonType":"array", "items": { "bsonType": "object", "properties": { "favoriteToyBrand": { "bsonType": "objectId" } } } } // ...additional model properties } }
Para acceder a una propiedad de objeto incrustado en una lista, utilice field1.[].field2 (por ejemplo, pets.[].favoriteToyBrand). Desde ahí, puede especificar los detalles de la colección externa y el campo de clave externa.
Tip
Utilice la misma sintaxis con diccionarios y conjuntos
Puede utilizar esta misma sintaxis field1.[].field2 al crear relaciones dentro de diccionarios y conjuntos.
{ "pets.[].favoriteToyBrand": { "ref": "#/relationship/mongodb-atlas/example/ToyBrand", "foreign_key": "_id", "is_list": false } }
Nota
Primitivos versus listas, diccionarios y conjuntos en relaciones
En el ejemplo anterior, is_list se establece como falso. El campo al final de la cadena de relación es una primitiva, no una lista. El objeto incrustado está contenido en una lista, pero la favoriteToyBrand propiedad en sí no es un diccionario, un conjunto ni una lista.
Definir una relación
Al definir una relación, tenga en cuenta estas limitaciones:
El campo de referencia (fuente) no puede
_idser.El campo de referencia (fuente) no puede ser un
requiredcampo.Si está utilizando Device Sync, la clave externa debe ser el
_idcampo de la colección externa.
Definir esquemas
Para definir una relación, debe tener un esquema definido tanto para la colección de origen como para la colección externa. Para aprender a definir esquemas, consulte Definir y aplicar un esquema.
Crea una nueva relación
Define una relación para las colecciones en una fuente de datos MongoDB vinculada junto con el esquema.
Para crear una nueva relación:
Haga clic Schema en el menú de navegación de la izquierda.
Desde la pestaña Collections, seleccione la colección de origen.
Cambie View a la vista JSON y haga clic en + Add Relationship.
Para crear una nueva relación, añade un objeto de configuración de relación al archivo relationships.json de la colección de origen:
{ "<source field>": { "ref": "#/relationship/<data source>/<db>/<collection>", "foreign_key": "<foreign field>", "is_list": <boolean> } }
Configurar la relación
Una definición de relación se asigna desde un campo de referencia en el esquema de la colección de origen a un campo externo del mismo tipo en el esquema de la colección externa.
Para configurar la relación:
Especifique el campo de la colección de origen desde el que se asigna la relación. En la interfaz de usuario, se denomina "principal".
Especifique la base de datos externa, la colección y el campo de la colección externa que se asignarán al campo de origen. Estos se denominan "vinculados" en la interfaz de usuario. Si utiliza Sincronización de dispositivos, el campo vinculado debe
_idser.Haga clic en Add.
Para configurar la relación, especifique el nombre del campo de origen como un campo de nivel raíz en relationships.json, luego agregue las siguientes opciones de configuración en el valor del campo:
Especifique la colección extranjera en el campo
refutilizando el siguiente formato:#/relationship/<data source>/<db>/<collection> Especifique el campo que
foreign_keydebe coincidir en el campo. Si utiliza Sincronización de dispositivos, debe_idser.Si el campo de origen contiene una matriz, establezca
is_listentrue; de lo contrario, configúrelo enfalse.