MongoDB: empezando por el principio. Insertando datos

MongoDB: empezando por el principio. Insertando datos
Sin comentarios Facebook Twitter Flipboard E-mail

En el pasado artículo, ya hicimos una introducción a MongoDB. En él vimos las características generales de esta base de datos NoSQL.

Cualquier base de datos que se precie, tiene que permitirnos realizar las típcias operaciones: inserciones, modificaciones, eliminaciones y consultas. MongoDB no es diferente, y aunque tiene algunas peculariades que iremos describiendo, permite realizar dichas operaciones. Eso sí, nos tenemos que olvidar de SQL.

En este artículo, voy a explicar como se pueden insertar datos. El resto de operaciones, las dejamos para futuros artículos.

Lo primero, es lo primero. Insertando datos

Como ya dijimos MongoDB es una base de datos orientada a documentos. Los documentos los guarda en BSON, que es una forma de representar de forma binaria objetos JSON.

Insertar documentos es muy sencillo. Solo hay que conectarse la consola y escribir el comando db.nombre_coleccion.insert. Como parámetro pasaremos el objeto JSON que queremos insertar. Por ejemplo, si queremos insertar en la colección genbetadev:

    db.genbetadev.insert(
    {
        name:"Tyrion",
        hobbyes:["books","girls","wine"],
        friends:
        [
            {name:"Bronn", ocuppation:"sellsword"},
            {name:"Shae", ocuppation:"handmaiden"}
        ]
    }

Si la colección no existe, MongoDB la creará automáticamente. Si ahora hacemos un find, veremos que el documento está insertado en la nueva colección.

    db.genbetadev.find()
    {
        "_id" : ObjectId("52f602d787945c344bb4bda5"),
        "name" : "Tyrion",
        "hobbies" : [ 
            "books", 
            "girls", 
            "wine"
        ],
        "friends" : [ 
            {
                "name" : "Bronn",
                "ocuppation" : "sellsword"
            }, 
            {
                "name" : "Shae",
                "ocuppation" : "handmaiden"
            }
        ]
    }

De momento no nos preocupamos por el comando find, porque lo explicaremos en artículos posteriores. Digamos que hemos hecho algo parecido a un SELECT * FROM genbetadev.

En el documento que devuelve el comando find, además de los campos que hemos creado, aparece uno denominado _id. Este campo lo generá MongoDB automáticamente, siempre que no lo especifiquemos en la inserción. Digamos que es como la clave principal que todo documento debe tener. Todos los documentos tienen este campo y tiene que ser único. El campo _id, como cualquier campo de MongoDB, puede ser de cualquier tipo. Podemos insertar números, texto o como hace MongoDB un ObjectId. Una vez insertado, el campo _id no se puede modificar. Si queremos hacer algo parecido, tenemos que borrar el documento, e insertarlo otra vez, pero con un _id distinto.

Cómo se genera un ObjectId

El campo _id del ejemplo anterior es del tipo ObjectId. Este objeto está especialmente pensado para garantizar unicidad en entornos distribuidos como MongoDB. El campo está compuesto por 12 bytes. Los cuatro primeros bytes son un timestamp con los segundos desde el epoch de Unix; los tres siguientes bytes representan el identificador único de la máquina; los dos siguientes el identificador del proceso; y para finalizar los últimos tres bytes, son un campo incremental.

Bytes del ObjectId

En definitiva los nueve primeros bytes nos garantizan un identificador único por segundo, máquina y proceso. Los tres últimos bytes, nos garantizan que cada segundo podemos insertar 2^24 = 16.777.216 documentos con un identificador distinto. Aunque técnicamente un _id podría repetirse, en la práctica es un número tan alto que es muy difícil que eso suceda.

Que el ObjectId esté compuesto de esa manera, nos da algunas funcionalidades muy útiles. La primera es que nos puede dar una indicación de el orden de creación de los documentos. No es algo del todo fiable si estamos tratando con documentos creados en el mismo margen de tiempo, pero sí en tramos de tiempo más largos.

También nos sirve para obtener la fecha de creación del documento. Por ejemplo, vamos a crear un ObjectId y vamos a extraer su fecha de creación desde la consola:

    > var myObjectId = new ObjectId();
    > myObjectId.getTimestamp();
    ISODate("2014-02-08T23:23:41Z")

En el ejemplo vemos, que no solo MongoDB puede crear campos ObjectId. Nosotros también podemos hacerlo usando el new ObjectId(). Además con el método getTimestamp() podemos extraer la fecha en la que se creo el documento.

Insertando documentos de forma masiva

Si queremos insertar una gran cantidad de ellos, nos conviene usar el comando insert, pero pasando como parámetro un array de documentos. De esta manera MongoDB optimizará las inserciones, haciendo que sean mucho más rápidas.

    db.genbetadev.insert(
    [
      {name:"Jaime"},
      {name:"Rob"},
      {name:"Sansa"}
    ])

En el ejemplo hemos creado solo tres documentos, pero podemos insertar miles de ellos. Tan solo hay que tener en cuenta que MongoDB no acepta comandos de más de 48 MB. Si los insertamos desde la consola, tendremos que separarlos de forma manual para no superar ese espacio. Si lo hacemos con el driver de algún lenguaje de programación, algunos de ellos son capaces de partir los documentos de forma automática.

Generar documentos aleatorios con un esquema un poco complejo puede ser bastante aburrido, así que os recomiendo que uséis algún generador online de JSON como JSON Generator. Así podréis hacer pruebas con una gran cantidad de datos, ricos y bien estructurados.

16 MB de tamaño máximo

Ya hemos visto que los documentos pueden tener cualquier tipo de esquema. Además de los típicos números o cadenas, también pueden contener arrays o subdocumentos. Pero además hay que tener en cuenta que los documentos no pueden tener un tamaño superior a 16 MB. Es algo con lo que tendremos que tener cuidado cuándo todos nuestros datos estén dentro del mismo documento. Por ejemplo, imaginemos que estamos desarrollando el típico foro de internet. Decidimos que existirá una colección que almacenará todos los post, y que cada documento de dicha colección tendrá todos los mensajes incluidos en el documento que representa al post. Esto es algo posible, pero deberemos tener cuidado si un post tiene demasiados mensajes. El documento que los contiene no podrá superar los 16 MB.

De momento lo dejamos aquí. Recordad que instalar MongoDB para hacer pruebas es muy sencillo, pero si no queréis complicaros, siempre podéis probar la consola sin instalar nada desde aquí.

En GenbetaDev | Bases de datos NoSQL. Elige la opción que mejor se adapte a tus necesidades, NoSQL: clasificación de las bases de datos según el teorema CAP Imagen | Marcin Wichary Más información | MongoDB

Comentarios cerrados
Inicio