Docs Menu
Docs Home
/ /
Definir un modelo de datos

Relaciones

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 accounts La 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 customers contiene documentos que describen a cada cliente individual que puede tener una o más cuentas. Cada documento en la colección customers tiene un campo accounts que contiene un arreglo de todos los valores account_id de la colección accounts que 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.

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".

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:

fuentes_de_datos/mongodb-atlas/ejemplo/mascotas/relaciones.json
{
"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"
}
}

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:

fuentes_de_datos/mongodb-atlas/ejemplo/personas/relaciones.json
{
"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[]"
}
}

Los objetos incrustados pueden tener relaciones con colecciones externas. Utilice la notación de puntos para acceder a las propiedades de los objetos incrustados.

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 }
}

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.

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 required campo.

  • Si está utilizando Device Sync, la clave externa debe ser el _id campo de la colección externa.

1

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.

2

Define una relación para las colecciones en una fuente de datos MongoDB vinculada junto con el esquema.

Para crear una nueva relación:

  1. Haga clic Schema en el menú de navegación de la izquierda.

  2. Desde la pestaña Collections, seleccione la colección de origen.

  3. 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>
}
}
3

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:

  1. 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".

  2. 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.

  3. 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 ref utilizando el siguiente formato:

    #/relationship/<data source>/<db>/<collection>
  • Especifique el campo que foreign_key debe coincidir en el campo. Si utiliza Sincronización de dispositivos, debe _id ser.

  • Si el campo de origen contiene una matriz, establezca is_list en true; de lo contrario, configúrelo en false.

4

Haz clic en Save, y luego implementa tu aplicación actualizada.

Guarde el archivo de configuración de la relación y envíe los cambios para implementarlos:

appservices push

Volver

Tipos de datos de esquema

En esta página