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

Patrón de Colección Única

Cree un modelo de datos que utilice un arreglo de Referencias para agrupar documentos relacionados de diferentes tipos en una sola colección. El patrón de colección única puede ser especialmente útil para modelar relaciones de muchos a muchos con una sola copia de los datos. Este patrón puede reducir la duplicación de datos en casos donde el costo de la duplicación es un problema.

Las siguientes características definen el Patrón de Colección Única:

  • Almacena todos los documentos de acceso frecuente juntos en una sola colección.

  • Almacena las relaciones entre documentos como punteros o estructuras dentro de cada documento.

  • Mapea las relaciones entre documentos mediante índices en el campo o arreglo. Este índice admite la recuperación de documentos relacionados en una sola query sin el uso de operaciones JOIN de bases de datos.

Considera usar el Single Collection patrón al modelar sistemas con operaciones de alta velocidad, requisitos de baja latencia y operaciones de escritura frecuentes. Dividir el documento en partes más pequeñas, en lugar de grandes documentos incrustados, permite que la base de datos realice operaciones de escritura más pequeñas y mejore el rendimiento.

En el siguiente ejemplo, una aplicación permite a los estudiantes ver el estado de las clases en las que se inscriben durante el semestre. Es posible que el sistema deba actualizar con frecuencia varios campos para cada clase, como el current_topic. upcoming_session_summary, o next_class_time. Para evitar duplicar información para varios estudiantes que asisten a la misma clase, queremos mantener a los estudiantes y las clases como documentos separados en la misma colección.

Considera los siguientes esquemas de ejemplo para una clase y un estudiante. Para modelar su relación, los documentos de clase y estudiante contienen el arreglo links. Este arreglo incluye los campos doc_type y target para hacer referencia a la relación entre los estudiantes y los elementos de la clase.

Documento de la clase:

{
_id : "CS101-001",
doc_type : "class",
class_name : "Introduction to Programming",
course_id : "CS101",
instructor : {
name : "Dr. Emily Smith",
email : "emily.smith@example.com",
office_hours : "Tuesdays and Thursdays 2:00 PM - 4:00 PM"
},
semester : "Spring 2025",
schedule : [
{
day_time : "Monday 10:00 AM - 11:30 AM",
location : "Room 101, Science Building"
},
{
day_time : "Wednesday 10:00 AM - 11:30 AM",
location : "Room 101, Science Building"
},
{
day_time : "Friday 10:00 AM - 11:30 AM",
location : "Room 101, Science Building"
}
],
current_topic : "Loops and Iterations",
next_class_time : "2025-01-09T10:00:00Z",
upcoming_session_summary : "We will explore different types of loops (for, while) and how to use them effectively in Python.",
links : [
{ target : "CS101-001", doc_type : "class" },
{ target : "S10023", doc_type : "student" },
{ target : "S12345", doc_type : "student" },
...
{ target : "S12355", doc_type : "student" }
]
}

Documento estudiantil:

{
_id : "S12345",
doc_type : "student",
name : "Jane Doe",
major : "Computer Science",
semester : "Spring 2025",
registered_classes : [
{
course_id : "CS101",
class_instance_id : "CS101-001",
class_name : "Introduction to Programming"
},
{
course_id : "MATH201",
class_instance_id : "MATH201-002",
class_name : "Calculus II"
}
],
links : [
{ target : "CS101-001", doc_type : "class" },
{ target : "MATH201-002", doc_type : "class" },
{ target : "S12345", doc_type : "student" }
]
}

Para optimizar las consultas, indexa el campo links:

db.students_classes.createIndex({ "links.target": 1, "links.doc_type": 1 })

Se puede query la información de un estudiante y todas las clases que toma sin tener que realizar ninguna operación de unión:

db.students_classes.find({ "links.target": "S12345" })

De manera similar, puede query todos los estudiantes inscritos en una determinada clase:

db.students_classes.find({ "doc_type": "student", "links.target": "CS101-001" })

Volver

Archive Data

En esta página