No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Relaciones 1 a 1 referenciadas

14/22
Recursos

Aportes 4

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el 90% de los casos, cuando hay una relación 1:1, esta suele estar EMBEBIDA.

PERO: Uno de los casos donde se usa la relación REFERENCIADA, es cuando el documento ya es muy grande, cerca del límite de 16 mb y mejor se saca información para mejorar el rendimiento.

También se pueden usar combinados, si usas el ObjectId, para referenciar el total de datos y agregar los 2 o 3 campos de los más comunes que se usan juntas para evitar la consulta a la 2da colección.

Agregando otro bloque al aggregate podemos (en este caso) obtener el detalle como un objeto en vez de un arreglo.

db.stores.aggregate([
	{
		$lookup: {
			form: 'stores_details',
			localField: 'storeId',
			foreignField: 'storeId',
			as: 'detail'
		}
	},
	{
		$unwind: '$detail'
	}
])

Relaciones 1 a 1 referenciadas

Este se usa cuando se superan las restricciones, como pueden ser:

  • Peso maximo de 16MB: Esto podria pasar si se llena con muchas propiedades y/o muy pesadas, como pueden ser binarios, imagenes, videos, etc.
  • Consultas lentas: Al realizar una peticion, puede que se procese informacion innecesaria (Se puede superar con restringir las propiedades que se entregaran) o muy pesada.
  • Se requieran acelerar ciertas consultas: Puede que se requieran hacer consultas que requieran mucha velocidad para grandes cantidad de documentos y dejemos apartado los detalles que no se requiren para esas consultas. Como puede ser en productos y el detalle de esos productos.

Ejemplo

<h5>Insertar</h5>
db.stores.insertOne({
    storeId: "ST001", // permitira la relacion
    name: "PamplonaStore",
    address:  "Calle falsa 123",
    city: "Sprinfield",
    state: "Londres",
    zip: "1234"
})

db.stores_details.insertOne({
    storeId: "ST001", // repetimos el storeID, ya que es 1-1
    description: "PamplonaStore asdasdasd",
    services: ["Ropa", "Deportivo"],
    manager: {
        name: "Mario",
        cellphone: "123412412"
    }
})
<h5>Consultar</h5>
// Se puede consultar por separado

db.stores.findOne({ // consultar la tienda
    storeId: "ST001"
})

db.stores_details.findOne({ // consultar los detalles de tienda
    storeId: "ST001"
})

// Oooo.. Usar el agregation framework lookup
<h5>Agregation framework lookup</h5>

Permite consultar otros documentos y formar una relacion.

PD: Si no estan los campos puede que se agreguen datos no esperados. Ya que funciona como: si estan los datos en los documentos correspondientes se comprueba, si faltan ambos no funciona y agrega elementos no esperados. Puede que este detectando cuando faltan propiedades como valores nulos que compara. Parece ser esto ultimo. Esto puede retornar matrices 2d de los que encuentre nulos en ambos colecciones.

// Consulta
db.stores.aggregate([ // desde stores, usamos el aggregate
    {
        $lookup: { // parte desde stores
          from: 'stores_details', // agregamos cual coleccion queremos conectar
          localField: 'storeId', // que campo los enlaza, en stores
          foreignField: 'storeId', // que campo los enlaza, en stores_details
          as: 'detail' // donde dejara la relacion
        }
    }
])


// Respuesta
[
  {
    "_id": {
      "$oid": "64966b333b1e45e51454558d"
    },
    "storeId": "ST001",
    "name": "PamplonaStore",
    "address": "Calle falsa 123",
    "city": "Sprinfield",
    "state": "Londres",
    "zip": "1234",
    "detail": [ // Desde aqui se agrega el detalle, como un array
      {
        "_id": {
          "$oid": "64966b343b1e45e51454558e"
        },
        "storeId": "ST001",
        "description": "PamplonaStore asdasdasd",
        "services": [
          "Ropa",
          "Deportivo"
        ],
        "manager": {
          "name": "Mario",
          "cellphone": "123412412"
        }
      }
    ]
  }
]

Cuando alcanzamos el limite de almacenamiento de documentos podemos usar la tecnica de referencia, o tambien cuando las consultas ya se vuelven lentas. Esto teniendo en cuenta que es de una relacion - entidad 1-1