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.
You define a relationship on a source MongoDB collection and link to documents in a foreign collection. Atlas App Services automatically resolves relationships in synced SDK data models by replacing the values in a source field with the foreign documents that they reference.
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
Consider an application that has two collections:
La
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" } }, ... } }
The app defines this relationship on the customers collection. It points from the array of account id values stored in the accounts field to the account_id field of each document in the accounts collection.
{ "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
A relationship's cardinality determines the number of foreign documents that it can reference. App Services supports two relationship cardinalities: "to-one" and "to-many".
To-One
A to-one relationship links each source document with either a single document or an array of documents from the foreign collection.
To indicate that a relationship has "to-one" cardinality, set is_list to 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" } }
To-Many (A muchos)
Una relación de muchos vincula cada documento fuente con una lista de documentos de la colección externa.
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. Usa la notación de punto para acceder a las propiedades de los objetos incrustados.
Objeto incrustado a 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
Primitives versus lists, dictionaries, and sets in relationships
In the example above, is_list is set to false. The field at the end of the relationship string here is a primitive, not a list. The embedded object is contained in a list, but the favoriteToyBrand property itself is not a dictionary, set, or list.
Define a Relationship
When you define a relationship, keep these limitations in mind:
El campo de referencia (fuente) no puede
_idser.The reference (source) field cannot be a
requiredfield.If you are using Device Sync, the foreign key must be the
_idfield of the foreign collection.
Definir esquemas
Para definir una relación, debes tener un esquema definido tanto para la colección fuente como para la colección externa. Para aprender a definir esquemas, ver Definir y aplicar un esquema.
Crea una nueva relación
Defines una relación para 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:
Especifica el campo en la colección de origen desde el que se asigna la relación. A esto se le conoce como el elemento principal en la interfaz de usuario.
Especifique la base de datos externa, la colección y el campo en la colección externa que desea mapear al campo de origen. En la interfaz de usuario, se les denomina vinculados. Si está utilizando Device Sync, el campo vinculado debe ser
_id.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:
Especifica la colección extranjera en el campo
refusando 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.