# data[].attributes.body
En MongoDB, existen dos enfoques principales para relacionar datos entre colecciones: embeber (embedding) y referenciar (referencing). A continuación, te explico las diferencias entre ambos enfoques:

1.     Embeber (Embedding):

·         Enfoque de datos anidados: Con este enfoque, los datos relacionados se almacenan directamente dentro de un único documento.

·         Estructura denormalizada: Los datos relacionados se integran en la misma estructura de documento, evitando la necesidad de realizar consultas adicionales para obtener los datos relacionados.

·         Mejor rendimiento en lectura: Al tener todos los datos relacionados en un solo documento, las consultas de lectura suelen ser más eficientes, ya que se puede acceder a la información completa de manera rápida.

·         Actualizaciones más complejas: Si los datos relacionados se actualizan con frecuencia, es necesario actualizar todos los documentos que contengan esos datos embebidos. Esto puede ser más complicado y costoso en términos de rendimiento.

2.     Referenciar (Referencing):

·         Enfoque de referencias: En lugar de almacenar los datos relacionados directamente, se almacena una referencia (generalmente el _id) a otro documento.

·         Estructura normalizada: Los datos relacionados se mantienen en colecciones separadas, lo que permite un mayor grado de normalización de los datos.

Mayor flexibilidad en actualizaciones: Al utilizar referencias, las actualizaciones de los datos relacionados son más sencillas, ya que solo es necesario actualizar el documento referenciado en lugar de todos los documentos que lo utilizan.

Mayor complejidad en lecturas: Para obtener los datos relacionados, es necesario realizar una consulta adicional utilizando la referencia almacenada. Esto puede afectar el rendimiento, especialmente cuando hay muchas referencias y consultas en cascada.

En general, el enfoque de embeber es adecuado cuando los datos relacionados son pequeños, no cambian con frecuencia y se acceden juntos con frecuencia. El enfoque de referenciar es útil cuando los datos relacionados son grandes, cambian con frecuencia o se acceden de manera independiente con frecuencia.

Realice un ejemplo en donde explique para qué sirve la sentencia ALTER

La sentencia ALTER se utiliza en lenguajes de consulta de bases de datos, como SQL, para modificar la estructura de una tabla existente. Puede servir para agregar, modificar o eliminar columnas, así como para cambiar las propiedades de una tabla, como su nombre o restricciones.

Aquí tienes un ejemplo para ilustrar su uso:

Supongamos que tienes una tabla llamada "trabajadores" en una base de datos de recursos humanos, con las siguientes columnas: "ID" (identificación única), "Nombre", "Apellido" y "Salario".

# data[].attributes.body
En MongoDB, puedes aplicar diferentes tipos de validaciones en los datos almacenados en tus colecciones. Estos tipos de validaciones te permiten garantizar la integridad de los datos y asegurarte de que cumplan con ciertas reglas o restricciones. A continuación, se presentan algunos de los tipos de validaciones que puedes utilizar en MongoDB:

1. Validación de tipo de datos: Puedes especificar el tipo de dato esperado para un campo en particular, como String, Number, Date, Boolean, Array, Object, entre otros. Esto asegura que los datos ingresados cumplan con el tipo de dato definido.

2. Validación de rango: Puedes establecer límites o rangos específicos para un campo numérico, de fecha o de otro tipo. Por ejemplo, puedes definir que un campo numérico debe estar dentro de un rango determinado.

3. Validación de expresiones regulares: Puedes utilizar expresiones regulares para validar campos de texto y asegurarte de que cumplan con un patrón específico. Esto es útil, por ejemplo, para validar direcciones de correo electrónico o números de teléfono.

4. Validación de longitud: Puedes establecer restricciones en la longitud mínima y máxima de un campo de texto. Esto es útil para campos como nombres, apellidos o descripciones.

5. Validación de existencia: Puedes verificar si un campo o un conjunto de campos existen en un documento. Esto es útil para asegurarte de que los datos requeridos estén presentes.

6. Validación personalizada: Puedes definir funciones de validación personalizadas utilizando JavaScript. Esto te permite realizar validaciones más complejas basadas en la lógica de negocio específica de tu aplicación.

Estas validaciones se pueden aplicar utilizando la característica de Validación de MongoDB, que utiliza las reglas de validación definidas en el esquema de una colección para garantizar la coherencia de los datos. Puedes definir las reglas de validación al crear una colección o modificarlas posteriormente utilizando comandos o métodos específicos de MongoDB.

Es importante tener en cuenta que las validaciones en MongoDB son opcionales y dependen de las necesidades y requisitos de tu aplicación. Puedes decidir qué tipo de validaciones aplicar en función de la integridad y consistencia que desees garantizar en tus datos.

# data[].attributes.body
En MongoDB, una base de datos NoSQL, se utiliza un enfoque de modelado de datos diferente al de las bases de datos relacionales. MongoDB se basa en el modelo de datos orientado a documentos, lo que implica que los datos se almacenan en documentos JSON (JavaScript Object Notation) flexibles y sin esquema fijo.

A diferencia del enfoque Entidad-Relación utilizado en bases de datos relacionales, en MongoDB se recomienda seguir la metodología de diseño de datos denominada "Modelo de Dominio de Aplicación" (Application Domain Model).

El Modelo de Dominio de Aplicación se centra en comprender el dominio de la aplicación y cómo se utilizarán los datos en el contexto específico. Algunas pautas recomendadas para el modelado de datos en MongoDB son:

1. Diseño basado en casos de uso: Comprender los casos de uso y las consultas que se realizarán con mayor frecuencia en la aplicación. Esto ayudará a definir la estructura y los índices necesarios para optimizar el rendimiento de las consultas.

2. Denormalización: En MongoDB, a diferencia de las bases de datos relacionales, se permite y se alienta la denormalización de los datos. Esto significa que es posible duplicar datos en diferentes documentos para mejorar el rendimiento de las consultas y evitar las operaciones de JOIN.

3. Considerar las consultas: Diseñar la estructura de los documentos y los campos en función de las consultas que se realizarán con mayor frecuencia. Esto implica tener en cuenta los patrones de acceso a los datos y las necesidades de indexación para mejorar la eficiencia de las consultas.

4. Escalabilidad horizontal: MongoDB es conocido por su capacidad de escalabilidad horizontal, lo que significa que puede manejar grandes volúmenes de datos distribuyendo la carga en múltiples servidores. Al diseñar el modelo de datos, es importante considerar la escalabilidad horizontal y la distribución de datos en clústeres.

5. Iteración y adaptación: Al igual que en cualquier metodología de diseño de datos, el modelado en MongoDB también es un proceso iterativo. Es recomendable diseñar y probar diferentes enfoques, evaluar el rendimiento de las consultas y ajustar el modelo según sea necesario.

Es importante destacar que en MongoDB no hay una metodología única y estricta para el modelado de datos, ya que la flexibilidad del esquema permite adaptarse a las necesidades específicas de cada proyecto. Se alienta a los desarrolladores a comprender las características y capacidades de MongoDB, así como las mejores prácticas recomendadas, y adaptar el modelado de datos según las necesidades de la aplicación.

# data[].attributes.body
Son símbolos especiales que ayudan a los compiladores a realizar tareas matemáticas o lógicas, hay nueve tipos de operadores:

Operadores lógicos son utilizados en función de las condiciones dadas, también permiten la evaluación de muchas condiciones.

1.Operadores lógicos

$and:

Realiza una operación lógica en una matriz de dos o más condiciones

Me devuelve los documentos que cumplan todos y cada uno de los selectores o de las condiciones o cláusulas que yo utilice osea quiero que se cumplan dos cosas al mismo tiempo si no, no funcionaria, por ejemplo, si yo creo una base de datos que se llama test1 y ahí le creo una colección llamada publicaciones y en esta colección le guardo unos datos digamos que se me imprima un titulo que se llama mongo DB y que además también si tiene una duración de 12 me lo muestre esto se me imprimiría si se cumplen las dos funciones si no, no me arrojaría nada.

Ejemplo:

Test1> db.publicaciones.find( {$and:[ { titulo:"curso de mongo DB"} , {duracion:{$gt:11} }  ]  }  )

Lo que estamos diciendo en esta operación  es que valla ala base de datos test1 y mire si en la colección publicaciones  se encuentra un titulo llamado curso mongo DB y además con el símbolo (and ), que si tiene una duración menor ($gt) que 11, que si es asi que muestre el documento

$Or

Una condición <<or>> realiza una operación lógica <<or>> en una matriz de dos o mas expresiones.  Selecciona los documentos donde una de las expresiones es verdadera.

Ejemplo:

db.publicaciones.find({$or:[{titulo:"curso de mongo DB"},{duración:{$lt:1}} ]})

Aquí lo que está diciendo este codigo es que si en la colección publicaciones hay un documento con titulo curso de mongo DB lo imprima o si hay algún otro que tenga una duración (lt) menor que uno.  Pero en dado caso que la duración sea de uno o más, y cumple con una condición que sería el titulo curso mongoDB, el documento se mostraría ya que cumple con una de las condiciones propuestas

$Nor

El operador lógico nor hace lo contrario de de or solo muestra los documentos que no contengan lo que hallamos puesto en esa condición esa (nor)

Ejemplo:

db.usuarios.find({ $nor: [{ nombre: "huxley" }] })

Aquí lo que estoy diciendo con nor es que es que los documentos que se encuentren en la colección usuarios que no tengan($nor) como nombre Huxley los muestre

$ Not

El operador lógico (not) es igual que el (nor) la diferencia es que solo sirve si está acompañado de un operador relacional de los cuales más adelante hablaremos.

Ejemplo:

db.usuarios.find({nombre:{$not:{$eq:"huxley"}}})

aquí lo que yo le estaría diciendo a mi programa mongo db compass es que con el operador lógico not es que me muestre aquellos documentos que no tengan un documento que contengan algo igual($eq) a: nombre Huxley

con el operador relacional ($eq).

2. Operadores de comparación o no relacionales

Se usan para comparar valores en uno o mas documentos

$eq

Este operador de comparación significa igual que

Ejemplo:

db.usuarios.find({nombre:{$eq: "huxley"}})

Aquí lo que le estamos diciendo a la consola es que valla a una colección llamada usuarios que busque en algún documento de esa colección algo que sea igual a:  nombre:”Huxley” y si lo hay pues lo mostraría.

$Ne

NO es igual que

Este operador devuelve los documentos en los que el valor especificado no es igual:

Ejemplo:

db.usuarios.find({nombre:{eq:”Huxley”}})

Aquí lo que le estamos pidiendo a ala consola es que valla ala colección usuarios y me busque en los documentos y me muestro solos los que no sean

db.usuarios.find({"edad": { $gt: 2}})

gt

Mayor que

Este operador devuelve los valores que son mayores que el valor dado

Ejemplo:

db.usuarios.find({"edad": { $gt: 2}})

devuelve el documento o documentos que tengan una edad de 3 para arriba

$lt

Menor que

Como su nombre lo indica devuelve los valores que sean menores que los dados ejemplo:

db.usuarios.find({"edad": { $lt: 3}})

gte

$gte

Mayor o igual que:

Este operador coincide cuando los valores son mayores o iguales que el valor dado:

Ejemplo:

db.publicaciones.find( {"duracion":{$gte:11}}  )

aquí lo que nos dice es que si en la colección publicaciones hay algo que se llame duración: 11 o que se llame igual pero el numero sea mayor lo muestre

$lte

Menor o igual que

Mostraria los documentos que son menores o iguales que el valor dado:

Ejemplo:

db.publicaciones.find( {"duracion":{$gte:11}}  )

aquí seria igual pero el caso contrario si se llama duración : 10 lo mostraria por que este operador nos dice que si el valor es igual o menor que lo muestre

A estos dos últimos también se les suele llamar operadores de pertenecia

$in

Este operador devuelve los documentos que coinciden con los valores especificados:

Ejemplo:

db.usuarios.find({ email: { $in: ["muybien@"] } })

Aquí lo que le estoy diciendo ala colección usuarios es que me devuelva todos los documentos que contengan un email llamado muybien@

$nin

Este operador lo contrario de in.

Ejemplo:

db.usuarios.find({ email: { $in: ["muybien@"] } })

en este caso le estoy diciendo que me devuelva o me muestre todos los documentos que no contengan email:”muybien@”

Operadores de elementos:

Los operadores de consulta de elementos pueden identificar los documentos

Utilizando los campos del documento y son dos exists y type

$exists

Muestra lso documentos que tienen la palabra o numero que le hallamos especificado o lo que le hallamos especificado y tiene un valor booleano que puede ser true o false

Ejemplo con true:

db.usuarios.find({email:{$exists:true}})

Aquí lo que le estoy indicando ala consola es que si es verdad(true) que existe un documento o varios en la colección usuarios que me los muestre

Ejemplo con false:

db.usuarios.find({email:{$exists:false}})

Aquí lo que le estoy diciendo es que me muestre los documentos en donde no exista (email)osea su existencia sea falsa(false) lo que quiere decir que me mostrara todos los documentos si existen, en donde no exista “email”

Ejemplo 3:

db.usuarios.find({ edad: { $exists: true, $eq: 3 } })

Finalmente aquí le digo ala consola que me muestre si hay un documento o documentos donde la edad sea 3 o igual a 3 .

Operadores de tipo

$type

En mongo db el operador type se utiliza para buscar el documento por su tipo

Que puede ser $type number

Ej:

$Type number

db.usuarios.find({ edad: { $type: "number" } })

Esto nos dice que nos arroje todos los documentos que tenga un numero

Osea un campo que sea especifico de tipo numero

$type string

db.usuarios.find({ email: { $type: "string" } })

Este codigo nos indica con type string que me muestre todos los documentos de tipo cadena osea que contengan textos palabras letras

$type object

En mongo db , un documento es considerado como tipo objeto cuando contiene Un campo anidado cuyo valor es un objeto anidado cuando digo campo anidado, me refiero a que campo es esto por ejemplo “nombre”:”

Y valor:  “huxley”.

La diferencia es que cuando el campo contiene el valor anidado, ese valor es otro documento con sus propios valores

Ejemplo:

{

"nombre": "huxley",

"edad": 25,

"ubicación": {

"ciudad": "Cartagena",

"país": "Colombia"

}

}

Como pueden ver el campo nombre tiene su valor Huxley, el campo edad tiene su valor 25, pero ubicación cuando va a recibir su valor se abren dos llaves, y ahí dentro de esas llaves hay dos campos que son ciudad y país con los valores Cartagena y Colombia como están dentro de esas llaves, pero a su vez pertenecen a ubicación, pero están como separados osea anidados se le llama a este tipo de documento objeto

db.usuarios.find({direccion:{$type:"object"}})

por ejemplo, acá estoy buscando en la colección usuarios si el campo dirección

es de tipo objeto si es asi la consola me mostraría ese documento

Otro ejemplo de tipo objeto es este:

{

_id: ObjectId("645db3a39795a2dd45c39f0f"),

mail: 'muybien@',

edad: 3,

nombre: {

'$mergeObjects': [

{

mail: 'muybien@'

},

{

edad: 3,

nombre: true

}

]

}

}

Porque si observamos al llegar a al atributo o campo que es nombre  que esta después de edad: 3,   justo ahí se abren otras llaves  y se agrega el operdor de agregación     '$mergeObjects' anidando un objeto y luego se cierran y hay una coma se abren otras llaves y sea intriducen otros elementos o datos que están anidados, hay que agregar que esto es permitido el que varios elementos se aniden en diferentes parte gracias al valor   de agregación  '$mergeObjects'

Y para comprobarlo podrías hacerlo en tu colección y mandar a mostrar estos documentos asi por el campo

db.usuarios.find({nombre:{$type:"object"}})

$Type booleano

Esta consulta devolverá los documentos donde el campo es de tipo booleano es decir donde su valor es verdadero o falso

db.usuarios.find({feliz:{$type:"bool"}})

Por ejemplo, aquí estamos diciéndole a la colección usuarios que si tiene un documento con el campo feliz de tipo booleano me muestre el documento

$Type date

Un documento tipo date en mongo dB es una forma de representar fechas y horas en un formato especifico

Ejemplo:

fecha: 2023-05-14T00:00:00.000Z,

aquí el 2023 representa el año, el 05 el mes, el 14 el día, la t es un separador que indica que la siguiente parte indica la hora los primeros ceros son la hora osea media noche los otros dos cero los minutos y los últimos tres ceros los milisegundos y la z indicador de zona horaria también conocida como tiempo universal coordinado

En documento tipo date si qusieramos que no lo msotrara deberías escribir algo asi en nuestra base de datos:

db.usuarios.find({ fecha: { $type: "date" } })

osea le digo que si la colección usuarios tiene un documento que sea de tipo date que me lo muestre y este seria un ejemplo de un documento tipo date:

{

_id: ObjectId("6460f34db6c27ad421fd0270"),

nombre: 'francia',

descripción: 'puente en un lago',

fecha: 2023-05-14T00:00:00.000Z,

categoría: 'viajes'

}

Operadores de matrices

Hay 3 tipos principales son:

$all

El operador all en mongo db se utiliza para encontrar documentos donde un campo de tipo arreglo contenga todos los elementos especificados en la consulta. N0 importa el orden de los elementos, siempre y cuando esten presentes todos ellos

db.usuarios.find({ "direcciones.pais": { $all: ["Reino Unido", "Estados Unidos"] } })

aquí me buscaría el arreglo o atributo direcciones y lleva el punto porque pais esta anidado dentro de direcciones entonces me buscaría específicamente el documento que tenga o los documentos que contenga el campo, atributo o arreglo que se llame direcciones y tenga anidados a reino unido y estados unidos

$size

El operador si size

Se utiliza para verificar si un campo tiene un numero especifico de elementos

Y si el campo tiene exactamente esos números la consulta devolverá los documentos si tiene mas o tiene menos no devolvería nada.

En mongo db no son inherentemente matrices mongo db almacena datos en forma de documentos json, que son estructuras flexibles para clave valor.

En los caso donde el documento no tiene matriz size no  funcionaria para encontrarlo ejemplo este:

{

"_id": 1,

"nombre": "Ejemplo 1",

"edad": 30,

"direccion": {

"calle": "Calle Principal",

"ciudad": "Ciudad Ejemplo"

}

}

Donde cada clave, o campo  y con campo nos referimos a nombre, edad, dirección, calle, y ciudad tienen un solo valor  que para nombre el valor seria ejemplo 1, para edad seria 30, etc, este seria un documento sin matriz.

Size solo serviría para los documento con matriz ejemplo :

{

"_id": 2,

"nombre": "Ejemplo 2",

"hobbies": ["fútbol", "guitarra", "lectura"]

}

Como podemos ver el campo hobbies contiene 3 valores por lo que en este caso si funcionaria.

db.usuarios.find({ "direcciones": { $size: 3 } })

LO que estoy diciendo aquí es que me muestre el documento que tiene 3 elementos en el campo direcciones, sea que direcciones tenga los elementos en forma de lista o anidados si tiene mas de 3 menos de 3 no me arrojaría nada.

$elemMatch

Este operador  coincide con los documentos que contienen un campo de matriz con al menos un elemento que coincide con todos los criterios de consulta especificados:

No puedes especificar una expresión $where en una operación $elemMatch. Este operador permite utilizar expresiones javascript personalizdas para realizar consultas, pero no se puede combinar con $elemMatch.

No puedes especificar una expresión de consulta $text en una operación $elemMatch. El operador $text se utiliza para realizar búsquedas de texto completo en campos de texto y no se puede utilizar junto con $elemMatch.

·         El uso de $elemMatch es útil cuando deseas realizar consultas más complejas en campos de matriz, especialmente cuando necesitas buscar documentos que cumplan con múltiples criterios en un solo campo.

Supongamos que tienes una colección de libros en MongoDB, y cada libro tiene un campo de matriz llamado "autores" que contiene los nombres de los autores del libro. Además, tienes otro campo de matriz llamado "temas" que almacena los temas relacionados con el libro.

"_id": 1,

"titulo": "El Gran Gastor",

"autores": ["F. Scott Fitzgerald"],

"temas": ["Ficción", "Clásico", "Década de 1920"]

}

{

"_id": 2,

"titulo": "1984",

"autores": ["jorge"],

"temas": ["Ficción", "Distopía", "Política"]

}

{

"_id": 3,

"titulo": "Cien años de soledad",

"autores": ["Gabriel García Márquez"],

"temas": ["Ficción", "Realismo mágico", "Familia"]

}

Ahora, supongamos que quieres buscar libros que tengan como autor "Gabriel García Márquez" y que pertenezcan al tema "Ficción". Aquí es donde puedes utilizar $elemMatch para realizar una consulta más compleja:

db.libros.find({

autores: "Gabriel García Márquez",

temas: { $elemMatch: { $eq: "Ficción" } }

})

En este ejemplo, estamos utilizando $elemMatch para combinar múltiples criterios dentro del campo de matriz "temas". $eq se utiliza para verificar que al menos uno de los elementos del campo "temas" sea igual a "Ficción". Al mismo tiempo, especificamos que el campo de matriz "autores" debe contener el valor "Gabriel García Márquez".

El resultado de esta consulta sería el siguiente documento:

"_id": 3,

"titulo": "Cien años de soledad",

"autores": ["Gabriel García Márquez"],

"temas": ["Ficción", "Realismo mágico", "Familia"]

}

Este ejemplo muestra cómo puedes utilizar $elemMatch para buscar documentos que cumplan con múltiples criterios en campos de matriz en una sola consulta.

db.usuarios.find({

nombres: { $all: ["Alexandra"] },

})

Aquí le digo ami consola que el campo nombres es una matriz y dentro contiene a Alexandra me muestre el documento.

Si deseas utilizar el operador $all en MongoDB, es necesario que al menos uno de los campos en tus documentos sea una matriz.

Operadores geoespaciales:

MongoDB te permite almacenar datos geoespaciales en forma de tipos GeoJSON. GeoJSON es un formato de estándar abierto basado en la notación de objetos de JavaScript que puede representar características geográficas y admitir atributos no espaciales. Hay dos tipos de operadores geoespaciales de los que hablaremos en este artículo: los especificadores de geometría y los selectores de consulta.

$geometry:

Permite mencionar una geometría GeoJSON para su uso con otros operadores geoespaciales.

Ejemplo:

{ location: { $geoIntersects: { $geometry: { type: "Point", coordinates: [ 40, -73 ] } } } }

$polygon:

Se utiliza para especificar un polígono para la consulta geoespacial

Ejemplo:

{ location: { $geoWithin: { $polygon: [ [ 0, 0 ], [ 1, 5 ], [ 3, 3 ] ] } } }

$geoWithin.

Selecciona documentos cuyos datos geoespaciales están completamente contenidos en una forma específica.

Ejemplo:

{ location: { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [ 0, 0 ], [ 1, 5 ], [ 3, 3 ], [ 0, 0 ] ] ] } } } }

$box:

Especifica un rectángulo para la consulta geoespacial $geoWithin.

Ejemplo:

{ location: { $geoWithin: { $box: [ [ 0, 0 ], [ 30, 30 ] ] } } }

$nearSphere:

Encuentra documentos geoespaciales más cercanos a un punto específico en orden de cercanía.

Ejemplo:

{ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] }, $maxDistance: 1000 } } }

$geoIntersects:

Selecciona documentos cuyos datos geoespaciales se intersectan con un objeto GeoJSON específico.

Ejemplo:

{ location: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ 0, 0 ], [ 2, 6 ], [ 4, 1 ], [ 0, 0 ] ] ] } } } }

Estas ejemplos ilustran cómo funcionan los operadores geoespaciales y cómo se relacionan con los datos geoespaciales almacenados en MongoDB.

Operadores de proyección

El operador $elemMatch

se utiliza para limitar el contenido de un campo en los resultados de una consulta, de modo que solo se incluya el primer elemento que cumpla con una condición específica.

Ahora, veamos un ejemplo concreto para comprender mejor cómo funciona:

Supongamos que tienes una colección llamada "schools" con los siguientes documentos:

{ _id: 1, zipcode: "63108", students: [ { name: "mark", school: 102, age: 9 },

{ name: "geoff", school: 101, age: 13 }, { name: "frank", school: 104, age: 12 } ] }

{ _id: 2, zipcode: "63110", students: [ { name: "harry", school: 103, age: 14 }, { name: "george", school: 103, age: 7 }, ] } { _id: 3, zipcode: "63108",

students: [

{ name: "harry", school: 103, age: 14 }, { name: "george", school: 103, age: 7 }, ] } { _id: 4, zipcode: "63110", students: [ { name: "jim", school: 103, age: 9 }, { name: "michael", school: 103, age: 12 }, ] }

Si queremos encontrar todos los documentos en los que el valor del campo "zipcode" sea "63110" y, al mismo tiempo, proyectar solo el primer elemento coincidente de la matriz "students" en el que el campo "school" tenga el valor 103, podemos usar el operador $elemMatch de la siguiente manera:

db.schools.find( { zipcode: "63110" }, { students: { $elemMatch: { school: 103 } } } )

El resultado de esta consulta sería:

{ "_id" : 2, "students" : [ { "name" : "harry", "school" : 103, "age" : 14 } ] } { "_id" : 4, "students" : [ { "name" : "jim", "school" : 103, "age" : 9 } ] }

$slice

El operador $slice en MongoDB se utiliza para obtener una porción específica de un array almacenado en un documento. Puedes usar este operador en una consulta de actualización o en una proyección para obtener un subconjunto de elementos de un array.

recuerda que el operador $slice se utiliza para limitar los elementos de un array en los resultados de la consulta. Puedes ajustar los valores dentro del operador $slice según tus necesidades para obtener diferentes porciones de los array

Ejemplo:

El operador $slice en MongoDB se utiliza para limitar los elementos de un array devuelto en una consulta. Permite especificar cuántos elementos del array se deben incluir en el resultado y también permite omitir un número determinado de elementos al principio del array.

La sintaxis básica del operador $slice es la siguiente:

{ campo: { $slice: [skip, limit] } }

Donde:

campo es el nombre del campo que contiene el array.

skip es el número de elementos que se deben omitir al principio del array.

limit es el número de elementos que se deben incluir en el resultado.

Aquí tienes un ejemplo que muestra cómo usar el operador $slice:

Supongamos que tenemos el siguiente documento en una colección llamada usuarios:

{ "_id": 1, "nombres": ["Alexandra", "José", "Carlos", "María", "Luis"], "edades": [25, 30, 42, 28, 35] }

Si queremos obtener solo los primeros 3 elementos del array "nombres", podemos usar el operador $slice de la siguiente manera:

db.usuarios.find({}, { "nombres": { "$slice": [0, 3] } })

Esto devolverá el siguiente resultado:

{ "_id": 1, "nombres": ["Alexandra", "José", "Carlos"] }

En este ejemplo, especificamos un valor de 0 para skip, lo que significa que no se omiten elementos al principio del array. Y especificamos un valor de 3 para limit, lo que significa que se deben incluir solo los primeros 3 elementos del array en el resultado.

$proyect

En MongoDB, el operador de proyección, representado por el símbolo "$project", se utiliza para especificar qué campos o atributos de un documento deseas incluir o excluir en los resultados de una consulta. Este operador te permite dar forma y estructurar la salida de una consulta, mostrando solo los datos relevantes para tus necesidades.

Aquí tienes un ejemplo de cómo se utiliza el operador de proyección en MongoDB:

Supongamos que tienes una colección llamada "usuarios" con los siguientes documentos:

{ "_id": 1, "nombre": "Juan", "apellido": "Pérez", "edad": 30, "correo": "juan@example.com" }, { "_id": 2, "nombre": "María", "apellido": "Gómez", "edad": 25, "correo": "maria@example.com" }

Si deseas proyectar solo el nombre y el correo de los usuarios, puedes usar el operador de proyección de la siguiente manera:

db.usuarios.find({}, { nombre: 1, correo: 1, _id: 0 })

El primer parámetro vacío {} en la función find() especifica que no hay condiciones de filtrado adicionales, por lo que obtendrás todos los documentos de la colección "usuarios". El segundo parámetro { nombre: 1, correo: 1, _id: 0 } indica qué campos incluir o excluir.

En este caso, se proyecta el campo "nombre" con valor 1, el campo "correo" con valor 1 y el campo "_id" con valor 0. Cuando el valor es 1, indica que se debe incluir ese campo en los resultados, mientras que 0 indica que se debe excluir.

El resultado de la consulta sería:

{ "nombre": "Juan", "correo": "juan@example.com" } { "nombre": "María", "correo": "maria@example.com" }

Como puedes ver, los resultados solo contienen los campos proyectados "nombre" y "correo", excluyendo el campo "_id".

El operador de proyección es muy útil para controlar la salida de las consultas y evitar la transmisión de datos innecesarios, lo que puede mejorar el rendimiento y la eficiencia de tus consultas en MongoDB.

Operadores de evaluación

$mod

El operador de evaluación $mod en MongoDB se utiliza para realizar una operación de módulo en una consulta. Permite seleccionar documentos cuyo campo tenga un valor que sea divisible de forma exacta por un divisor específico.

La sintaxis del operador $mod es la siguiente:

{ campo: { $mod: [ divisor, residuo ] } }

Donde:

campo es el nombre del campo en el que se realizará la evaluación.

divisor es el número por el cual se debe dividir el campo.

residuo es el residuo esperado de la operación de división.

Aquí tienes un ejemplo que muestra cómo usar el operador $mod:

Supongamos que tenemos una colección llamada productos con documentos que representan productos, y queremos encontrar los productos cuyo precio sea divisible por 5 sin dejar residuo:

db.productos.find({ precio: { $mod: [5, 0] } })

Esto devolverá todos los productos cuyo precio es divisible por 5 sin dejar residuo.

Si tenemos un documento con el siguiente contenido:

javascriptCopy code

{ "_id": 1, "nombre": "Producto 1", "precio": 15 }

El documento cumpliría la condición ya que 15 dividido por 5 da un residuo de 0.

Es importante tener en cuenta que el operador $mod solo funciona con valores enteros y no con decimales. Además, el rendimiento de las consultas que utilizan el operador $mod puede verse afectado si se utiliza en un gran número de documentos o en campos indexados.

$JsonSchema

El operador de evaluación $jsonSchema en MongoDB se utiliza para realizar validaciones de esquema en consultas. Permite definir un esquema JSON que especifica la estructura y restricciones de los documentos que se deben cumplir para que sean considerados válidos en una consulta.

El $jsonSchema se utiliza junto con el operador $expr para evaluar documentos en función de un esquema JSON definido.

La sintaxis básica del operador $jsonSchema es la siguiente:

{ $jsonSchema: { schema } }

Donde schema es un objeto JSON que define el esquema de validación.

Aquí hay un ejemplo que muestra cómo usar el operador $jsonSchema:

Supongamos que tenemos una colección llamada personas con documentos que representan información de personas, y queremos encontrar las personas cuya edad sea mayor o igual a 18 y tengan un campo nombre que sea de tipo string y sea obligatorio:

db.personas.find({ $expr: { $jsonSchema: { required: ['nombre'], properties: { nombre: { type: 'string' } } } }, edad: { $gte: 18 } })

En este ejemplo, estamos utilizando $jsonSchema junto con $expr para realizar una validación de esquema. El esquema JSON especifica que el campo nombre debe ser obligatorio y de tipo string. Además, utilizamos el operador $gte para seleccionar las personas cuya edad sea mayor o igual a 18.

Si tenemos un documento con el siguiente contenido:

javascriptCopy code

{ "_id": 1, "nombre": "John Doe", "edad": 25 }

El documento cumpliría la condición ya que cumple con el esquema definido (tiene el campo nombre de tipo string y la edad es mayor o igual a 18).

Es importante tener en cuenta que el operador $jsonSchema requiere una validación completa del esquema y puede tener un impacto en el rendimiento, especialmente en colecciones con un gran número de documentos.

Ejemplo:

db.usuarios.find({ nombre: { $exists: true, $type: 'string' }, edad: { $gte: 2 } })

Estás indicando a tu programa lo siguiente:

1. Buscar en la colección "usuarios".

2. Filtrar los documentos que tienen el campo "nombre" presente y de tipo "string".

3. Filtrar los documentos cuyo campo "edad" sea mayor o igual a 2.

En resumen, la consulta busca documentos en la colección "usuarios" que tengan un campo "nombre" de tipo "string" y una edad mayor o igual a 2.

$text

Cuando se utiliza el operador "$text", MongoDB realiza una búsqueda de texto completo en los campos especificados y devuelve los documentos que coinciden con los términos de búsqueda proporcionados. Utiliza un algoritmo de búsqueda especializado que tiene en cuenta factores como la relevancia y la puntuación de los términos encontrados.

Aquí tienes un ejemplo de cómo se utiliza el operador "$text" en MongoDB:

Supongamos que tienes una colección llamada "productos" con los siguientes documentos:

{ "_id": 1, "nombre": "Laptop HP", "descripcion": "Laptop de alta calidad con pantalla HD", "categoria": "Electrónica" }, { "_id": 2, "nombre": "Camiseta", "descripcion": "Camiseta de algodón para hombres", "categoria": "Ropa" }, { "_id": 3, "nombre": "Teléfono Samsung", "descripcion": "Teléfono inteligente con cámara de alta resolución", "categoria": "Electrónica" }

Para buscar productos que contengan el término "Laptop", puedes utilizar el operador "$text" de la siguiente manera:

db.productos.find({ $text: { $search: "Laptop" } })

En este ejemplo, estamos utilizando la función find() para buscar documentos en la colección "productos". El operador "$text" se utiliza como criterio de búsqueda, y dentro de él, utilizamos el operador "$search" para especificar el término que queremos buscar, en este caso, "Laptop".

El resultado de la consulta sería:

{ "_id": 1, "nombre": "Laptop HP", "descripcion": "Laptop de alta calidad con pantalla HD", "categoria": "Electrónica" }

MongoDB devuelve el documento que contiene el término "Laptop" en los campos indexados con un índice de texto.

Es importante tener en cuenta que para utilizar el operador "$text", necesitas haber creado previamente un índice de texto en los campos relevantes. Puedes crear un índice de texto utilizando el método createIndex() en la colección correspondiente.

El operador "$text" es útil cuando deseas realizar búsquedas de texto completo en MongoDB, permitiéndote encontrar documentos que coincidan con los términos buscados y clasificarlos según su relevancia.

$regex

El operador $regex se utiliza para buscar documentos en una colección que contienen una cadena de texto que coincide con una expresión regular. El operador toma dos argumentos: el patrón de expresión regular y las opciones.

También podemos utilizar el operador $regex con opciones adicionales, como "i" para que la búsqueda sea insensible a mayúsculas y minúsculas. Por ejemplo:

db.usuarios.find({email:{$regex: "mail", $options: "i"}})

db.usuarios.find({ email: { $regex: /muybien@/i } })

db.usuarios.find({email:{$regex: "muybien@", $options: "i"}})

estas dos formas lo que están diciendo es que valla y busque los documentos que tienen un email y en el segundo caso que el email es muybien @ y que me los muestre.

$expr

El operador te permite aprovechar las expresiones de agregación dentro del lenguaje de consulta.

También puedes utilizar $expr para construir expresiones de consulta que comparen campos del mismo documento en una etapa match. Si la etapa $match forma parte de una etapa $lookup, $expr puede comparar campos con la ayuda de variables let.

Ejemplo de cómo se podría usar expr:

El operador $expr en MongoDB permite evaluar expresiones en tiempo de consulta. Se utiliza para realizar operaciones de comparación o cálculos más complejos utilizando operadores y funciones de MongoDB dentro de la etapa de consulta.

El operador $expr toma una expresión como valor y puede contener cualquier operador o función de MongoDB válido. La expresión se evalúa para cada documento durante la consulta y los documentos que cumplan la expresión serán devueltos como resultado.

Aquí tienes un ejemplo sencillo de cómo se usa el operador $expr:

Supongamos que tenemos una colección "ventas" que almacena documentos de ventas con los campos "cantidad" y "precio_unitario". Queremos encontrar todas las ventas donde el monto total (cantidad * precio_unitario) sea mayor o igual a 1000.

db.ventas.find({ $expr: { $gte: [{ $multiply: ["$cantidad", "$precio_unitario"] }, 1000] } })

En este ejemplo, estamos utilizando el operador $expr para evaluar la expresión $gte (mayor o igual que). La expresión compara el resultado de multiplicar el campo "cantidad" por el campo "precio_unitario" con el valor 1000. Solo se devolverán las ventas que cumplan esta condición.

Ten en cuenta que el operador $expr es útil cuando necesitas realizar comparaciones o cálculos más complejos en tus consultas y no puedes utilizar directamente los operadores de consulta regulares.

El operador $where en MongoDB permite ejecutar expresiones de JavaScript dentro de una consulta. A diferencia de otros operadores que utilizan el lenguaje de consulta de MongoDB, como $eq o $gt, el operador $where permite escribir expresiones más flexibles utilizando JavaScript.

Cuando se utiliza el operador $where, se puede proporcionar una función o una cadena de texto como expresión. La función o la cadena de texto serán evaluadas para cada documento durante la consulta, y los documentos que cumplan la expresión serán devueltos como resultado.

Aquí tienes un ejemplo de cómo se usa el operador $where:

Supongamos que tenemos una colección "empleados" que almacena documentos con los campos "nombre" y "edad". Queremos encontrar todos los empleados cuyas edades sean mayores a 30 y además sus nombres contengan la letra "a".

db.empleados.find({ $where: function() { return this.edad > 30 && this.nombre.includes('a'); } })

En este ejemplo, estamos utilizando el operador $where y proporcionando una función como expresión. La función evalúa la condición this.edad > 30 && this.nombre.includes('a') para cada documento. Solo se devolverán los empleados que cumplan esta condición.

Es importante tener en cuenta que el uso del operador $where puede tener un impacto en el rendimiento de las consultas, ya que requiere la evaluación de expresiones JavaScript en cada documento. Se recomienda utilizarlo con precaución y considerar alternativas más eficientes utilizando los operadores y funciones nativas de MongoDB siempre que sea posible.

Operadores Bitwise:

Los operadores Bitwise en MongoDB se utilizan para realizar operaciones en los bits de valores numéricos o binarios y devolver resultados en función de las condiciones de posición de los bits.

1. Operador $bitsAllSet:

·         Función: Coincide con los documentos en los que todas las posiciones de bits proporcionadas están establecidas (es decir, 1) en el campo especificado.

·         Ejemplo: Supongamos que tenemos una colección "datos" con campos "a" y "binaryValueofA". Para encontrar documentos en los que los bits en las posiciones 1 y 5 del campo "a" estén establecidos, podemos utilizar el operador $bitsAllSet de la siguiente manera:

db.datos.find({ a: { $bitsAllSet: [1, 5] } })

2. Operador $bitsAllClear:

·         Función: Coincide con los documentos en los que todas las posiciones de bits proporcionadas están claras o tienen valor 0 en el campo especificado.

·         Ejemplo: Utilizando el mismo ejemplo de la colección "datos", para encontrar documentos en los que los bits en las posiciones 1 y 5 del campo "a" estén claros, podemos utilizar el operador $bitsAllClear de la siguiente manera:

db.datos.find({ a: { $bitsAllClear: [1, 5] } })

En ambos casos, se deben proporcionar las posiciones de bits deseadas como un arreglo de números. Los operadores $bitsAllSet y $bitsAllClear se utilizan para realizar consultas basadas en condiciones específicas de bits en campos numéricos o binarios.

Aquí tienes un breve resumen de cada operador de metaconsulta en MongoDB junto con un ejemplo para ilustrar su uso:

1. Operador $hint:

·         Función: Permite forzar al optimizador de consultas a utilizar un índice específico para ejecutar una consulta.

·         Ejemplo: Supongamos que tenemos una colección "usuarios" con un índice en el campo "edad". Podemos utilizar el operador $hint para aprovechar ese índice al realizar una consulta de la siguiente manera:

db.usuarios.find().hint({ edad: 1 })

2. Operador $comment:

·         Función: Permite adjuntar un comentario a una consulta, lo que facilita la interpretación y el seguimiento en el registro de perfil.

·         Ejemplo: Podemos utilizar el operador $comment para añadir un comentario a una consulta de la siguiente manera:

·

db.collection.find({}).comment("Consulta para obtener todos los         documentos")

3.          Operador $max:

·         Función: Permite especificar el límite superior exclusivo de un índice específico para restringir los resultados de una consulta.

·         Ejemplo: Supongamos que tenemos una colección "datos" con un índice en el campo "valor". Podemos utilizar el operador $max para limitar los documentos a aquellos cuyo campo "valor" sea menor que un valor específico:

·

db.datos.find({}).max({ valor: 100 })

4. Operador $explain:

·         Función: Proporciona información sobre el plan de ejecución de una consulta, lo cual es útil para optimizar consultas.

·         Ejemplo: Podemos utilizar el operador $explain para obtener información sobre el plan de ejecución de una consulta de la siguiente manera:

db.collection.find({}).explain()

Estos operadores de metaconsulta permiten controlar el comportamiento y obtener información adicional sobre las consultas en MongoDB.

Espero que este resumen y los ejemplos te ayuden a comprender mejor el uso de estos operadores de metaconsulta en MongoDB.

https://kinsta.com/es/blog/operadores-mongodb/#mayor-que-gt

# data[].attributes.body
Una base de datos relacional es una colección de información en donde se organizan los datos en tablas, filas y columnas.Tablas (relaciones)Filas (registros)Columnas (campos)Normalizaciòn de base de datos:Es un proceso para organizar los conjuntos de datos para evitar las duplicaciones y redundancias de ellos. Para realizar esto hay reglas las cuales son llamadas "Forma normal".Primera forma normal (1FN): Una tabla que no contiene datos repetidos y contiene una clave única.

# data[].attributes.body
DML:  Lenguaje de manipulación de datos.

Las sentencias DML son esenciales en la programación de bases de datos, ya que permiten a los programadores manipular los datos almacenados en las tablas.

. Estas son las sentencias que permiten a los usuarios realizar consultas, modificaciones, inserciones y procesos de eliminación de los datos que se hayan guardado en los distintos objetos que forman parte de la base de datos con la que estemos trabajando.

Una de las particularidades de las sentencias DML se encuentra en que es posible deshacerlas.

1. Inserción de datos: La sentencia INSERT se utiliza para añadir nuevos registros a una tabla. Permite especificar los valores a insertar o seleccionarlos desde otra tabla.

2. Modificación de datos: La sentencia UPDATE se utiliza para modificar los datos existentes en una o varias filas de una tabla. Permite cambiar los valores de una o varias columnas basándose en ciertas condiciones.

3. Eliminación de datos: La sentencia DELETE se utiliza para eliminar filas específicas de una tabla. Permite especificar condiciones para determinar qué registros deben ser eliminados.

4. Consulta de datos: La sentencia SELECT es utilizada para recuperar datos de una o varias tablas. Permite especificar qué columnas se desean obtener y aplicar condiciones para filtrar los resultados.

# data[].attributes.body
La sentencia TRUNCATE se utiliza en SQL para eliminar todos los registros de una tabla de una base de datos de manera rápida y eficiente. A diferencia de la sentencia DELETE, que elimina los registros uno por uno, TRUNCATE elimina todos los registros de la tabla en una sola operación.

Aquí tienes un ejemplo para ilustrar su uso:

Supongamos que tienes una tabla llamada "clientes" que contiene información sobre los clientes de una tienda. La tabla tiene las siguientes columnas: "id" (identificador único del cliente), "nombre" (nombre del cliente) y "email" (dirección de correo electrónico del cliente).

Si deseas borrar todos los registros de la tabla "clientes" para comenzar desde cero, puedes utilizar la sentencia TRUNCATE de la siguiente manera:

TRUNCATE TABLE personas;

Esta sentencia eliminará todos los registros de la tabla "personas", pero conservará la estructura de la tabla, incluyendo las columnas y las restricciones definidas en ella. Es importante tener en cuenta que TRUNCATE no puede ser revertido, es decir, no puedes recuperar los datos una vez que se ha ejecutado la sentencia.

La sentencia TRUNCATE es especialmente útil cuando necesitas eliminar todos los registros de una tabla en una base de datos, por ejemplo, cuando deseas reiniciar una tabla, borrar datos de prueba o limpiar una tabla temporal. Además, TRUNCATE es más rápido y requiere menos recursos que DELETE, especialmente en tablas grandes, ya que no registra las eliminaciones individuales en el registro de transacciones, lo que conlleva a un menor impacto en el rendimiento del sistema.

# data[].attributes.headline
La sentencia drop permite eliminar tablas y base de datos    • Eliminar una tabla

# data[].attributes.subject
La sentencia drop permite eliminar tablas y base de datos    • Eliminar una tabla

# data[].attributes.body
Agregar una columna: Si deseas agregar una nueva columna llamada "ocupación" para almacenar la información del departamento al que pertenece cada empleado, puedes utilizar la sentencia ALTER de la siguiente manera:

# data[].attributes.headline
La sentencia create permite crear bases de datos, tablas en las bases de datos un ejemplo de esto seria.

# data[].attributes.subject
La sentencia create permite crear bases de datos, tablas en las bases de datos un ejemplo de esto seria.

# data[].attributes.body
La sentencias DDL permite modificar las estructura de una base de datos como crear, modificar, eliminar una tabla, una columna y configurar su estructura como el tipo de dato si es primary key, etc. Se utilizan los siguientes comandos:

• Create: para crear tablas y bases de datos

• Alter: permite crear, modificar y eliminar columnas o cambiar sus valores (nombre, longitud, tipo de dato)

• Drop: para eliminar ya sea bases de datos o tablas

• Partition: permite dividir una tabla

# data[].attributes.body
El lenguaje SQL es gestor de base de datos relacionales que nos permite almacenar, modificar, eliminar y administrar la base de datos, suelen ser usados por analistas, científicos e ingeniaros y desarrolladores, las ventajas que tiene son las siguientes:

• Lenguaje estandarizado: todas las bases de datos relacionales están basadas en este lenguaje y cuentan con muy pocas diferencias, lo que facilita su gestión con frameworks.

• Integridad de los datos: preserva los datos asegurándose de que sean validos, correctos y que estén completos, protege contra corrupciones provocadas por fallos en el sistema o actualizaciones inconsistentes.

• Flexibilidad: es muy versátil a la hora de implementar soluciones y permite ver los datos de manera que necesite el cliente.

• Sencillez y claridad: el SQL es un lenguaje unificado, claro y fácil de comprender, la estructura incluye un alto nivel de ingles, lo que permite que sus sentencias son fáciles de entender.

# data[].attributes.body
Para crear un modelo entidad relación se debe de usar un diagrama entidad relación, este modelo permite saber cómo se relacionan las tablas entre sí. Para crear un modelo entidad relación se siguen los siguientes pasos:

1. Recopilar toda la información del cliente: se necesita saber toda la información que se va guardar en la base de datos, para esto hay que realizar muchas entrevistas.

2. Diseño del diagrama entidad – relación: consiste en colocar las entidades, atributos y relaciones recogidas en los requerimientos, los componentes de un diagramas entidad relación son:

◦ Entidad: se refiere al objeto que va contener la tablas como persona, producto o empleado se representa con un rectángulo, cuando varias entidades se combinan compartiendo atributos o valores en común se convierten en un conjunto de entidades.

◦ Atributos: son las características de la entidad ejemplo la entidad personas tiene los atributos nombre, apellido, edad, los atributos se dividen en 4:

1. simple: es un atributo que no se puede dividir en otros.

2. Compuesto: que se puede dividir como nombre completo en nombre y apellido

3. Derivado: que no existe en la base de datos pero se pueden obtener de otros    atributos como año de nacimiento sacado de edad.

4. Multivalores: son atributos que se pueden varios valores, como una persona puede tener varios correos electrónicos.

◦ Relación: se utiliza para saber que relación tiene las entidades que están relacionadas entre sí y cuales dependen una de otra, se puede saber cómo están relacionadas gracias a la cardinalidad.

◦ Símbolos:

▪ Entidades se representa con  rectángulo

▪ Entidades débiles  se representan por un rectángulo dentro de otro y son aquellos en que no se necesita clave primaria.

▪ Entidad asociativa en un rombo que va dentro de un rectángulo y se usa cuando se necesitan hacer varias relaciones.

▪ Relación se representa con un rombo

▪ Relación débil se representa con un rombo dentro de otro son relaciones entre una entidad débil  y su propietario

▪ atributo se identifica con un óvalo los atributos con claves llevan una línea debajo del nombre

▪ atributo doble es un ovalo dentro de otro  es cuanto un atributo puede tener varios valores.

▪ Atributo derivado se representa con un ovalo con las lineas entre cortadas, se utiliza cuando un atributo sale de otro atributo como año de nacimiento con edad.

▪ Lineas: son las que unen los atributos con las relaciones entre entidades e identifican el numero de relaciones que pueden tener

◦ De uno a muchos: esto quiere decir por ejemplo que un libro puede ser leído por muchas personas se describe de la siguiente manera:        1: m                   .

◦ De uno a uno: quiere decir que un libro solo puede ser leído por una persona se describe de la siguiente manera          1:1           .

◦ De cero a uno: indica que ninguna o una persona leerá el libro, se describe de la siguiente manera:            n:1        .

◦ De cero a muchos: indica que  ninguna o muchas  personas leerán el libro, se describe de la siguiente manera:       n:m       .

◦ De muchos a muchos: indica que muchas personas leerán muchos libros, se representa así:         m:m           .

◦ Campos: contiene la entidad o tablas  y los atributos o campos, también puede tener primary key(Llave primaria, PK)  y foraning key (Llave secundaria, FK)

# data[].attributes.headline
Qué es el El modelo relacional se trata de la gestión de la información por medio de tablas que pueden estar relacionadas entre sí, el modelo relacional contiene lo siguientes atributos

# data[].attributes.subject
Qué es el El modelo relacional se trata de la gestión de la información por medio de tablas que pueden estar relacionadas entre sí, el modelo relacional contiene lo siguientes atributos

# data[].attributes.body
• Tablas: es donde se guarda la información se componen de filas(tuplas) y columnas(campos)

• Claves: Indica que una columna sólo puede tener ese dato una única vez no se puede repetir

• Clave primaria: sólo puede haber una por tablas y debe ser única, esta es la que se utiliza como ID para relacionarla con otras tablas e identificar la fila.

• Claves externas o secundarias: se utiliza para asociar una clave primaria en otra tabla y así crear la relación.

• Restricciones de integridad: se refiere a unas reglas para hacer que las tablas sean entendibles y fáciles de usar estas reglas son:

◦ Datos requeridos: las columnas siempre deben poseer un atributo o valor quiere decir que no deben quedar vacías.

◦ Comprobación de validez: las tablas solo deben contenido relacionado con su nombre por ejemplo la tabla personas no debe tener campos o información de la tabla productos.

◦ Integridad de entidad y referencia: quiere decir que la clave primaria debe ser única para cada fila y que en las segundas claves deben estar relacionado con esta.

# data[].attributes.body
MongoDB es una base de datos NoSQL orientada a documentos que apareció a mediados de la década de 2000. Se utiliza para almacenar volúmenes masivos de datos. A diferencia de una base de datos relacional SQL tradicional, MongoDB no se basa en tablas y columnas. Los datos se almacenan como colecciones y documentos.

# data[].attributes.body
MySQL permite almacenar y acceder a los datos a través de múltiples motores de almacenamiento, incluyendo InnoDB, CSV y NDB. MySQL también es capaz de replicar datos y particionar tablas para mejorar el rendimiento y la durabilidad.

# data[].attributes.body
La base de datos relacionales: son organizadas como un conjunto de tablas con columnas y filas. La base de datos proporciona eficiencia y flexibilidad ala hora de acceder a la información estructurada, por el contrario, las no relacionales permiten almacenar y manejar la información sin ser estructurada o que este semiestructurada. A diferencia de la base de datos relacional, que estas se definen como se componen todos los datos proporcionados.

# data[].attributes.body
Las bases de datos son conjuntos de información que se almacenan y se consultan con un sistema. Los gestores de bases de datos son un tipo de software que permite estructurar una base de datos, almacenar la información y consultarla.

# data[].attributes.headline
MongoDB Atlas: Es la base de datos líder mundial para aplicaciones modernas como un servicio en la nube totalmente automatizado, diseñado y ejecutado por el mismo equipo .

# data[].attributes.subject
MongoDB Atlas: Es la base de datos líder mundial para aplicaciones modernas como un servicio en la nube totalmente automatizado, diseñado y ejecutado por el mismo equipo .

# data[].attributes.attachment_link.title
Mongodb — ¿Como crear y configurar una cuenta en mongodb atlas?

# data[].attributes.attachment_link.description
MongoDB Atlas ofrece la base de datos líder mundial para aplicaciones modernas como un servicio en la nube totalmente automatizado…

# data[].attributes.body
Nos dirigimos a la página oficial de MongoDB y seleccionamos TRY FREE y nos registramos con un correo.

# data[].attributes.body
Colecciones (collections): almacenan registros individuales, también llamados documentos. Permite agrupar elementos que sean similares. Documentos (documents): el término documento se refiere a la forma en que los datos son encapsulados y codificados.

# data[].attributes.body
Esto significa que los documentos de la misma colección no necesitan tener el mismo numero de campos o estructura. Cada documento solo necesita contener un numero relevante de campos de la entidad u objeto que el documento representa.

Ejemplo pueden existir distintos tipos de usuarios en una aplicación, donde un cliente necesita información personal, mientras que un administrador solo le basta con los datos credenciales.

# data[].attributes.body
https://adrianalonso.es/desarrollo-web/estrategias-de-modelado-en-mongodb/#:~:text=Esquema%20Flexible%20con%20MongoDb&text=Esto%20significa%20que%20los%20documentos,objeto%20que%20el%20documento%20representa.

# data[].attributes.attachment_link.title
Estrategias de Modelado de Datos en MongoDB

# data[].attributes.attachment_link.description
En este nuevo artículo comenzaremos a ver estrategias de modelado de colecciones en MongoDB. Como ya sabemos ya no existen tuplas ni tablas, ahora trabajamos

# data[].attributes.headline
Mangosta Es un Object Document Mapper (ODM). Esto significa que Mongoose le permite definir objetos con un esquema fuertemente tipado que se asigna a un documento MongoDB.

# data[].attributes.subject
Mangosta Es un Object Document Mapper (ODM). Esto significa que Mongoose le permite definir objetos con un esquema fuertemente tipado que se asigna a un documento MongoDB.

# data[].attributes.body
Es una base de datos que almacena sus datos documentos, lo mas común de las estructuras es similar es JSON.

Mongoose actualmente contiene ocho SchemaTypes que una propiedad se guarda como cuando se conserva a MongoDB. Son:

1. String (Cadena)

2. Number (Número)

3. Date (Fecha)

4. Buffer

5. Boolean (Booleano)

6. Mixed (Mixto)

7. ObjectId

8. Array (Matriz)

Cada tipo de datos le permite especificar:

un valor predeterminado

una función de validación personalizada

indica que se requiere un campo

una función get que le permite manipular los datos antes de que se devuelva como un objeto

una función de conjunto que le permite manipular los datos antes de guardarlos en la base de datos

crear índices para permitir que los datos se obtengan más rápido

# data[].attributes.body
Segunda forma normal (2FN): Tener la primera forma normal, crear tablas independientes para conjuntos de valores que se apliquen a varios registros, relacionar tablas solo con una clave externa.

# data[].attributes.body
Una vez puesto los datos y haber presionado en el botón “Get started free” nos redireccionará a la siguiente ventana donde nos muestra lo que tendrá nuestro clúster.

# data[].attributes.headline
Creación de tablas: al crear las tablas de debe colocar a qué base de datos se va insertar un punto para separarlo, 	luego el nombre de las tablas y dentro de los paréntesis irán los 	campos de la tabla.

# data[].attributes.subject
Creación de tablas: al crear las tablas de debe colocar a qué base de datos se va insertar un punto para separarlo, 	luego el nombre de las tablas y dentro de los paréntesis irán los 	campos de la tabla.

# data[].attributes.body
◦ Primary keys(PK): no se pueden repetir y solo puede existir una por tabla.

# data[].attributes.headline
Continuamos dando clic en Create clúster.

# data[].attributes.subject
Continuamos dando clic en Create clúster.

# data[].attributes.attachment_caption
◦ Foreign key (FK): esta es una llave que une la clave primaria en una base de datos en otra tablas para relacionarlas

# data[].attributes.body
ALTER TABLE Empleados CHANGE ocupación Salario DECIMAL (10,2);

Con esta sentencia, se modificará el tipo de dato de la columna "Salario" a DECIMAL con una precisión de 10 dígitos y 2 decimales.

2. Eliminar una columna: Si deseas eliminar la columna "salario" de la tabla "Empleados" porque ya no es necesaria, puedes utilizar la sentencia ALTER de la siguiente manera:

ALTER TABLE autores DROP COLUMN salario;

Con esta sentencia, se eliminará la columna "Apellido" de la tabla "Empleados".

En resumen, la sentencia ALTER es útil para modificar la estructura de una tabla existente, permitiendo agregar, modificar o eliminar columnas, así como cambiar otras propiedades de la tabla. Esto brinda flexibilidad y capacidad de adaptación a los cambios en los requisitos de una base de datos.

# data[].attributes.headline
	 ◦ Eliminar solo si existe para evitar errores

# data[].attributes.subject
	 ◦ Eliminar solo si existe para evitar errores

# data[].attributes.body
Tercera forma normal (3FN): Tener la segunda forma normal. Las columnas de estas tablas sólo pueden depender de otras columnas que sean la clave principal.

# data[].attributes.headline
Nos redireccionará a un dashboard donde el clúster aún se seguirá creando, pero podemos explorar mientras se crea en segundo plano. Una vez finalizado la creación realizamos lo siguiente:

# data[].attributes.subject
Nos redireccionará a un dashboard donde el clúster aún se seguirá creando, pero podemos explorar mientras se crea en segundo plano. Una vez finalizado la creación realizamos lo siguiente:

# data[].attributes.headline
Después del paso anterior procedemos a obtener la cadena de conexión, nos mostrará 3 opciones de la cual seleccionamos la siguiente:

# data[].attributes.subject
Después del paso anterior procedemos a obtener la cadena de conexión, nos mostrará 3 opciones de la cual seleccionamos la siguiente:

# data[].attributes.body
◦ Tipos:  se refiere al tip de dato que va tener el campo se identifica por ejemplo int son números enteros, Varchar son cadenas, etc. En algunos casos como en el modelo entidad relación de MySQL estos contienen números que indican cuántos caracteres van a almacenar.

# data[].attributes.body
Punto 1: MongoDB Atlas nos ofrece una seguridad de conexión por IP, esto quiere decir que podemos configurar de 2 maneras.

Add You Current IP Address con esta opción podemos poner nuestra IP, lo malo de configurar esta opción es que cada vez que nos cambiamos de laptop o PC debemos de volver a configurar.

Add a Different IP Address con esta opción podemos configurar una IP que permita las conexiones de cualquier laptop o PC, por ejemplo podemos colocar la siguiente IP 0.0.0.0/0.

# data[].attributes.body
◦ Cardinalidad y ordinalidad: cardinalidad es el número máximo de veces que una entidad se puede relacionar con otra y ordinalidad es el número mínimo que una entidad se puede relacionar con otra.
▪ Uno a uno: por ejemplo que una persona solo puede escribir un libro y que un libro solo lo puede ser escrito por una persona, ejemplo

# data[].attributes.headline
Al realizar todo lo anterior, va quedando así:

# data[].attributes.subject
Al realizar todo lo anterior, va quedando así:

# data[].attributes.headline
Después del paso anterior procedemos a obtener la cadena de conexión, nos mostrará 3 opciones de la cual seleccionamos la siguiente:

# data[].attributes.subject
Después del paso anterior procedemos a obtener la cadena de conexión, nos mostrará 3 opciones de la cual seleccionamos la siguiente:

# data[].attributes.body
Con la URI copiada podras acceder desde tu GUI para MongoDB preferida.

Listo! ya tienes un servidor de MongoDB, ahora solo queda crear base de datos y colecciones.

# data[].attributes.attachment_caption
      ▪ Uno a muchos: por ejemplo una persona puede escribir muchos libros y un libro solo puede ser escrito por una persona, ejemplo

# data[].attributes.body
Muchos a muchos: por ejemplo un libro puede sr escrito por muchas personas y una persona puede escribir muchos libros, en MySQL los dos deben de llevar claves primarias y se crea una nueva tabla que guardar las claves ejemplo.

4. SGBD: Lo siguiente es escoger el Sistema de Gestión de Base de Datos

5. Implementar el modelo relacional en el Sistema de Gestión de Base de Datos