Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Define a Data Model

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.

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

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.

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

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:

data_sources/mongodb-atlas/example/pets/relationships.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 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:

data_sources/mongodb-atlas/example/people/relationships.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. Usa la notación de punto 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

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.

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

  • If you are using Device Sync, the foreign key must be the _id field of the foreign collection.

1

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.

2

Defines una relación para 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. 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.

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

  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:

  • Especifica la colección extranjera en el campo ref usando 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