> For the complete documentation index, see [llms.txt](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://medellin-js.gitbook.io/workshop-fullstack-js-developer/backend/mongoose-js.md).

# Mongoose.js 🍃

"Elegant mongodb object modeling for node.js" 🍃

Mongoose es una librería object-document mapping (ODM) para MongoDB. Las ventajas de utilizar un ODM son muchas y van mas allá de la organización del código o del desarrollo sencillo. Abstrae todo de la base de datos, y el código de la aplicación interactúa solo con los objetos y sus métodos. Los ODM también permiten especificar las relaciones entre diferentes tipos de objetos y poner sobre estos lógica dentro de clases.‌

Además, posee un sistema de validación y de tipado que puede ser extendido y personalizado acorde a sus necesidades. Cuando se usa en conjunto con Express.js, Mongoose convierte este conjunto en uno orientado al concepto de MVC (Modelo Vista Controlador).‌

Mongoose utiliza una interface similar a la de la shell de Mongo, el driver nativo de Mongo, y Mongoskin. Por esta razón, las funciones principales como find(), update(), insert(), save(), remove(), etc, lucen y actúan de una forma similar, lo que permite aprender Mongoose y empezarlo a utilizar con mayor sencillez y rapidez.

![Object Mapping between Node and MongoDB managed via Mongoose‌](https://blobscdn.gitbook.com/v0/b/gitbook-28427.appspot.com/o/assets%2F-Lgyno4NC7rhy49BAEjN%2F-LhG9DEVs8SwLCeJEcfU%2F-LhGtGcuBJkXh1PvrGMc%2Fimage.png?alt=media\&token=ffbdf867-0eae-4378-a609-50fae3e8904a)

### Terminologías <a href="#terminologias" id="terminologias"></a>

**Collections**‌

Las "colecciones" en Mongo son equivalentes a las tablas en bases de datos relacionales. Pueden contener varios documentos JSON.‌

**Documents**‌

Los "documentos" son equivalentes a registros o filas de datos en SQL. Mientras que una fila de SQL puede hacer referencia a datos en otras tablas, los documentos de Mongo generalmente combinan eso en un documento.‌

**Fields**‌

Los "campos" o los atributos son similares a las columnas en una tabla SQL.‌

**Schema**‌

Si bien Mongo no tiene esquema, SQL define un esquema a través de la definición de la tabla. Un "esquema" de Mongoose es una estructura de datos de documento (o forma del documento) que se aplica a través de la capa de aplicación.‌

**Models**‌

Los "modelos" son constructores de orden superior que toman un esquema y crean una instancia de un documento equivalente a los registros en una base de datos relacional.‌

### Instalar Mongoose <a href="#instalar-mongoose" id="instalar-mongoose"></a>

Instalemos mongoose en el directorio de nuestro proyecto `backend-js-shopping`y guárdelo en la lista de dependencias.

```bash
npm i -S mongoose 
```

### Esquemas en Mongoose <a href="#esquemas-en-mongoose" id="esquemas-en-mongoose"></a>

Un esquema en mongoose es una estructura JSON que contiene información acerca de las propiedades de un documento. Puede también contener información acerca de la validación y de los valores por default, y si una propiedad en particular es requerida. Los esquemas pueden contener lógica y otro tipo de información importante.

```javascript
const productSchema = mongoose.Schema({ name: String,})
```

Los esquemas en Mongoose soportan estos tipos de datos.‌

* **String** : Cadena de caracteres.
* **Number** : Números que pueden ir hasta 64 bit.
* **Boolean** : True o false.
* **Buffer** : Tipos binarios como imagenes, pdfs, etc.
* **Date** : Fechas en formato ISO.
* **Array** : Arreglos.
* **Schema.Types.ObjectId** : String hexadecimal utilizado por MongoDB como identificador.
* **Schema.Types.Mixed** : Cualquier tipo de datos (flexible).

### Construyendo modelos <a href="#construyendo-modelos" id="construyendo-modelos"></a>

Para compilar un esquema en un modelo, utiliza mongoose.model.

```javascript
const product = mongoose.model('Product', productSchema);
```

Los modelos son utilizados para crear documentos (datos).‌

### Métodos de modelos <a href="#metodos-de-modelos" id="metodos-de-modelos"></a>

Estos son algunos de los métodos del modelo que pueden ser invocados en Mongoose.‌

* **Model.create(data, callback(err, doc))** : Crea un nuevo documento y guarda la información en la base de datos.
* **Model.remove(query, callback(err))** : Remueve documentos de una colección que coincida con el query.
* **Model.find(query, campos, callback(err, docs))** : Localiza los documentos que coincidan con el query provisto.
* **Model.update(query, update, options, callbacl(err, num, raw))** : Actualiza los documentos que coincidan con el query.
* **Model.findOne(query, campos, options, callback(err, doc))** : Realiza una consulta entre los documentos que coincidan con el query pero regresa solo uno.
