Documentos MongoDB con Python

Vamos a trabajar con documentos MongoDB con Python y para eso debemos conocer previamente cómo crear una base de datos con PyMongo y cómo crear colecciones MongoDB.

Documentos MongoDB con PyMongo

Lo primero que debemos recordar es que los documentos en las bases de datos MongoDB son los registros en otras bases de datos. Puede costarnos un poco recordarlo cuando estamos comenzando a trabajar con MongoDB.

Importante → No olvidemos que dentro de nuestra base de datos están las colecciones (tablas) y dentro de estas colecciones los documentos (registros).

Insertar documento MongoDB con PyMongo

Vamos a insertar un documento en una colección ya existente, en entradas anteriores creamos esta colección y la renombramos, ahora mismo se llama ‘consolas_portatiles’, vamos a verificarlo.

Para insertar un solo documento utilizaremos insert_one().

print(mi_ddbb.list_collection_names())
# 'consolas_portatiles']

Puedes ver la documentación oficial de list_collection_names().

Lo primero que tenemos que hacer es conectar nuestra aplicación Python con la base de datos e indicarle la colección en la que queremos insertar el documento.

import pymongo

mi_compass = pymongo.MongoClient('mongodb+srv://user:[email protected]/test?authMechanism=DEFAULT')
mi_ddbb = mi_compass['ddbb_oyoladev']

mi_coleccion = mi_ddbb['consolas_portatiles']

Ahora crearemos el documento que vamos a insertar en nuestra colección ‘consolas_portatiles’ y lo insertaremos.

una_portatil = {
                    'marca': 'Nintendo',
                    'modelo': 'Gameboy',
                    'lanzamiento': 1989,
                    'vendidas': 118.6,
                    'procesador': 2.19,
                    'soporte': 'cartuchos',
                }
insertando = mi_coleccion.insert_one(una_portatil)

Si vamos a Compass podemos ver que nuestro documento se ha insertado correctamente.

Insertar documento MongoDB

Cuando estamos insertando un documento en nuestra colección podemos hacerlo habiendo definido un identificador o dejar que MongoDB se encargue de generarlo e incluirlo de forma automática.

Nosotros en el documento anterior no lo hemos incluido, ahora vamos a crear otro documento en el que sí lo incluiremos. Para generar un id aleatorio utilizaremos el módulo uuid de Python.

import uuid
mi_id = uuid.uuid4()
otra_portatil = {
                    'id': str(mi_id),
                    'marca': 'Nokia',
                    'modelo': 'N-Gage',
                    'lanzamiento': 2003,
                    'vendidas': 3,
                    'procesador': 'ARG9E',
                }
insertando = mi_coleccion.insert_one(otra_portatil)

Podemos ver que nuestro id se creo correctamente y se almacenó en el documento nuevo creado.

Documento MongoDB con id insertado

Podemos ver que ahora tenemos dos identificadores en nuestro documento, el que MongoDB genera de forma automática y el que hemos creado nosotros.

Podemos evitar que esto pase si llamamos a nuestro identificador con el mismo nombre que utiliza MongoDB para nombrar a sus identificadores automáticos → _id.

Crearemos un documento exactamente igual que el anterior pero modificando el nombre que le hemos dado al campo → id por _id.

import uuid
mi_id = uuid.uuid4()
otra_portatil = {
                    '_id': str(mi_id),
                    'marca': 'Nokia',
                    'modelo': 'N-Gage',
                    'lanzamiento': 2003,
                    'vendidas': 3,
                    'procesador': 'ARG9E',
                }
insertando = mi_coleccion.insert_one(otra_portatil)

Vemos que el nuevo documento solo tiene un campo identificador llamado _id y su valor es el que hemos generado mediante el módulo uuid.

Insertar varios documentos MongoDB con PyMongo

Podemos insertar varios documentos MongoDB en nuestra colección a la vez, para hacer esto tendremos que crear una lista de Python con nuestros documentos.

Para insertar varios documentos a la vez utilizaremos insert_many().

En este ejemplo vamos a generar los documentos de forma automática mediante una estructura for, lo haremos de forma muy simple, un campo _id para el identificador y un campo numero que almacenará un número aleatorio.

Generaremos 4 documentos y los guardaremos en una nueva colección llamada ‘aleatorios’.

import random
import uuid

documentos = []
for i in range(4):
    mi_id = uuid.uuid4().hex
    numero = random.randint(1000, 9999)
    documentos.append({'_id': mi_id, 'numero': numero})

mi_coleccion = mi_ddbb['aleatorios']
insertando = mi_coleccion.insert_many(documentos)

Puedes ver que los 4 documentos se han creado correctamente e insertado en nuestra nueva colección ‘aleatorios’ con el _id que hemos generado nosotros mediante uuid.

insert_many documentos MongoDB

Actualizar documento MongoDB con PyMongo

Vamos a ver cómo podemos modificar un documento que ya tengamos creado e insertado en alguna de nuestras colecciones. Para el ejemplo utilizaré la colección ‘aleatorios’ que acabamos de crear en el ejemplo anterior.

Para actualizar un documento utilizaremos update_one().

A este método tendremos que indicarle dos cosas:

  • Qué documento queremos modificar.
  • Nuevos datos para actualizar el documento.

Lo vamos a ver muy claro con un ejemplo. Para elegir el documento que modificaremos nos basaremos en el identificador y una vez encontrado este documento le diremos que sustituya el valor de su número por una cadena de texto.

dentifico = { '_id': 'be191de353ed41efbdd327f29565a1dc' }
valores = { "$set": {'numero': 'Esto es una cadena'} }

resultado = mi_coleccion.update_one(identifico, valores)

Podemos ver en la captura de pantalla de Compass que la modificación del documento se ha realizado correctamente.

Actualizar varios documentos MongoDB con PyMongo

Para actualizar varios documentos utilizaremos update_many().

Actualizando documentos cabe la posibilidad que necesitemos actualizar un valor ya existente o agregar algún campo que no existe.

Primero vamos a ver un ejemplo para modificar los documentos en los que su campo número sea mayor que 1000, en estos documentos pondremos el valor a 0.

Para poder hacer este tipo de evaluaciones debemos conocer los operadores de comparación relacionales (el resto de operadores los vamos a ver en otra entrada).

  • $ne → No es igual → !=
  • $gt → Mayor que → >
  • $gte → Mayor o igual que → >=
  • $lt → Menor que → <
  • $lte → Menor o igual que → <=
identifico = { 'numero': { '$gt': 1000} }
valores = { "$set": {'numero': 0} }
resultado = mi_coleccion.update_many(identifico, valores)

Podemos ver la captura de pantalla de antes de realizar la actualización y la captura de después.

update_many MongoDB
Antes de realizar la actualización
Update_many con MongoDB
Después de haber realizado la actualización

Lo siguiente será modificar los documentos en los que el campo numero sea distinto de cero, esta vez agregaremos un campo nuevo a los documentos que cumplan la condición.

identifico = { 'numero': { '$ne': 0} }
valores = { "$set": {'nuevo_campo': 'Un nuevo valor'} }
resultado = mi_coleccion.update_many(identifico, valores)

Podemos ver el resultado en esta nueva captura de pantalla.

Update_many MongoDB
Nuevos campos agregados

Cuando realizamos una actualización de este tipo podemos conocer el número de documentos que se han actualizado mediante modified_count.

resultado = mi_coleccion.update_many(identifico, valores)
print(f'Se modificaron {resultado.modified_count} documentos')

# Se modificaron 2 documentos

Eliminar un documento MongoDB con PyMongo

De la misma forma que para insertar y actualizar teníamos los métodos one y many, para eliminar también los tenemos.

  • delete_one()
  • delete_many()

Primero crearemos un ejemplo con delete_one() para eliminar un solo documento, nos basaremos en su campo ‘_id’ para eliminarlo.

identifico = { '_id': 'be191de353ed41efbdd327f29565a1dc' }
mi_coleccion.delete_one(identifico)

Eliminar varios documentos MongoDB con PyMongo

Ahora crearemos otro ejemplo para eliminar varias colecciones a la vez mediante delete_many() y los operadores de comparación. La condición para eliminar el documento será que el valor del campo numero sea mayor de cero.

También podemos conocer el número de documentos que se han eliminado mediante deleted_count.

identifico = { 'numero': { '$gt': 0} }
resultado = mi_coleccion.delete_many(identifico)
print(f'Se eliminaron {resultado.deleted_count} documentos')

# Se eliminaron 2 documentos

Eliminar todos los documentos MongoDB con PyMongo

Para eliminar todos los documentos de nuestra colección podemos utilizar también delete_many pero de la siguiete forma

Siguiendo el tutorial desde el principio debería quedarnos un solo documento en nuestra colección, por esta razón va a indicarnos que solo ha eliminado un documento, pero en el caso de que existieran más de uno los eliminaría todos.

resultado = mi_coleccion.delete_many({})
print(f'Se eliminaron {resultado.deleted_count} documentos')

# Se eliminaron 1 documentos

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *