Curiosidades del tipo de datos de MongoDB
Tags: mongodb
Published: 2021-02-10 17:27:06

Hoy voy ha hablar sobre los distintos tipos de datos que acepta MongoDB. 

Sabemos que existen los datos tipo *Null*, *Number*, *String*, *Boolean* y *Array* entre otros. Bien, pues MongoDB acepta todos estos y también documentos embebidos, expresiones regulares, datos tipo fecha, tipo *ObjectID*, datos binarios e incluso código Javascript!! 

![wow](https://media.giphy.com/media/VelhDI6pdStJ4fvAtJ/giphy.gif)

Sí, puedes almacenar en un dato una función escrita en Javascript ya que, al fin y al cabo la terminal de mongo es un intérprete de Javascript.

```javascript
{"algun_dato": function(){...}}
```
Me parece interesante el tipo *ObjectID*. `{"_id":ObjectId("601d90b9414ff5d41b3e0eb3")}`
Podemos ver que es un conjunto de 24 números y letras pero, ¿qué son estos números y letras?. 
Estos números tienen su sentido aunque no lo parezca. Los 18 primeros hacen referencia al *timestamp*, es decir, el tiempo en milisegundos correspondientes al momento de creación del documento. Y los 6 últimos es un contador que se va autoincrementando por cada nueva inserción. 
![objectidMongo](https://dev-to-uploads.s3.amazonaws.com/i/wlym9gomyy3g8n94u7ht.png)

También es curioso el tipo de dato documento embebido. Esto significa que dentro del documento hay otro documento.
```javascript
{
  "nombre":"Enki",
  "edad": 6,
  "direccion": {
     "calle": "Calle Mayor, 5",
     "poblacion": "Alicante",
     "provincia": "Alicante",
     "pais": "Spain"
  }
}
```
En este caso la dirección es el segundo documento. Dependiendo de la magnitud del documento principal y de la lógica empleada, podría ser conveniente separarlo en otro documento y referenciarlo.


### :bulb: ¿Qué hace mongo por detrás?

Si quieres saber qué hace por detrás una función de mongo, simplemente ejecútala pero sin paréntesis.
```javascript
> db.mascotas.find
function (query, fields, limit, skip, batchSize, options) {
    var cursor = new DBQuery(this._mongo,
                             this._db,
                             this,
                             this._fullName,
                             this._massageObject(query),
                             fields,
                             limit,
                             skip,
                             batchSize,
                             options || this.getQueryOptions());

    {
        const session = this.getDB().getSession();

        const readPreference = session._serverSession.client.getReadPreference(session);
        if (readPreference !== null) {
            cursor.readPref(readPreference.mode, readPreference.tags);
        }

        const readConcern = session._serverSession.client.getReadConcern(session);
        if (readConcern !== null) {
            cursor.readConcern(readConcern.level);
        }
    }

    return cursor;
}

```
 
Así podrás ver cómo es la función que actúa por detrás cuando realizas este comando :wink:

Como he dicho antes, la terminal de mongo es un intérprete de Javascript, ¿qué significa esto? Significa que podemos ejecutar código Javascript en su terminal e incluso *scripts*. 
Realmente, cuando ejecutamos estos *helpers* de mongo 
```javascript
> use db
> show dbs
> show tables
```
por detrás se está ejecutando respectivamente
```javascript
> db.getSisterDB('db')
> db.getMongo().getDBs()
> db.getCollectionNames()
```
------------------

Os animo a que probéis este último apartado y así entender un poco más cómo funciona MongoDB.

Espero que os haya servido y os haya parecido interesante. Cualquier duda o aportación, ya sabéis, dejar un comentario abajo :point_down: