Introducci贸n a MongoDB para principiantes con Node.js

    Introducci贸n

    En este art铆culo, vamos a hablar sobre c贸mo usar el MongoDB base de datos con Node.js. Hay dos formas de hacer esto, incluido el enfoque popular: usar una biblioteca de modelado de objetos. Mangosta es un ejemplo de una biblioteca de este tipo en Node.js, sin embargo, usaremos el controlador oficial de MongoDB para Node.js.

    En este art铆culo, nos conectaremos a un servidor MongoDB, crearemos documentos, los recuperaremos de la base de datos y finalmente eliminaremos algunos.

    Esto se har谩 a trav茅s de algunos scripts, aunque normalmente los integrar铆a con un servidor web / aplicaci贸n en lugar de tenerlos en scripts independientes.

    驴Qu茅 es MongoDB?

    MongoDB es un sistema de gesti贸n de bases de datos (DBMS) multiplataforma (se ejecuta en varios sistemas operativos). MongoDB tambi茅n es una base de datos NoSQL, lo que significa que no usa SQL para realizar operaciones en una base de datos.

    MongoDB usa documentos que est谩n en formato similar a JSON, conocido como BSON, que es la codificaci贸n binaria de JSON.

    Est谩 desarrollado como un proyecto de c贸digo abierto por MongoDB Inc. bajo la licencia p煤blica del lado del servidor.

    Node y MongoDB funcionan muy bien juntos, en parte porque Mongo usa un motor JavaScript integrado en la base de datos, ya que JavaScript es bueno para manejar objetos JSON.

    En comparaci贸n con otras bases de datos, como MySQL, MongoDB es r谩pido para almacenar ciertos tipos de datos y se puede escalar autom谩ticamente. Es muy sencillo de implementar y poner en marcha.

    Dado que Mongo es una base de datos NoSQL, tiene su propia forma de almacenar datos. Estas son algunas de las construcciones que componen la estructura de la base de datos:

    • Base de datos: El contenedor que contiene un conjunto de colecciones.
    • Colecci贸n: Un conjunto de documentos. Esto es similar a una tabla en una base de datos SQL. Sin embargo, a diferencia de una base de datos SQL, una colecci贸n no tiene una estructura establecida ni tipos de datos preconfigurados.
    • Documentos: Un objeto similar a JSON. Esto es similar a una fila en una base de datos SQL. Un objeto JSON tambi茅n puede contener objetos secundarios, una matriz, etc.
    • _carn茅 de identidad: Campo 煤nico obligatorio en cada documento. Separa un documento de otro, por lo que podemos identificar cada documento de forma independiente. Si no se proporciona este valor, MongoDB asigna autom谩ticamente un valor aleatorio para el campo.

    Configuraci贸n del proyecto

    Comencemos con el proyecto y saltemos el npm indicaciones:

    $ npm init -y
    

    Luego, instalemos el controlador oficial de MongoDB:

    $ npm install --save mongodb
    

    Para conectarse realmente a la base de datos, deber谩 asegurarse de que su servicio MongoDB se est茅 ejecutando en segundo plano o en su m谩quina de desarrollo. Ejecuta el comando mongo en su s铆mbolo del sistema para ingresar al shell de Mongo:

    Ejecutando el comando show dbs; presentar谩 una lista de las bases de datos actuales:

    Puede salir del shell ejecutando el exit mando.

    A diferencia de las bases de datos SQL, que requieren la creaci贸n de una base de datos antes de su uso, no es necesario crear una base de datos o una colecci贸n de antemano. Se crear谩n autom谩ticamente cuando sea necesario.

    Implementaci贸n de operaciones CRUD

    Con nuestro proyecto inicializado y MongoDB instalado, podemos empezar a escribir algo de l贸gica CRUD.

    Conectarse a la base de datos

    Por supuesto, para usar MongoDB en c贸digo, necesitamos importar el m贸dulo:

    const mongodb = require('mongodb');
    

    Luego, creemos una instancia de un cliente:

    const MongoClient = mongodb.MongoClient;
    

    El cliente necesita saber d贸nde conectarse, por lo que le proporcionaremos un url y dbName:

    // Connection URL
    const url="mongodb://localhost:27017";
    
    // Database Name
    const dbName="userdb";
    

    Finalmente, intentemos conectarnos a la base de datos:

    // Use the connect method to create a connection w/ the database
    MongoClient.connect(url, (err, client) => {
        if (err) {
            throw err;
            return;
        }
    
        console.log('Database connection successful');
    
        // This objects holds the refrence to the db
        const db = client.db(dbName);
    
        client.close();
    });
    

    Si se ha conectado correctamente a la base de datos, deber铆a ver el resultado:

    Database connection successful
    

    De lo contrario, recibir谩 un mensaje de error. Compruebe si el servidor est谩 en funcionamiento y si el nombre de usuario y la contrase帽a son correctos en ese caso.

    Como puede ver en el ejemplo, el MongoClient.connect El m茅todo toma dos par谩metros, la URL de la base de datos y la funci贸n de devoluci贸n de llamada.

    La funci贸n de devoluci贸n de llamada tiene dos par谩metros: err y client.

    El primer par谩metro contendr铆a un error si hay alg煤n problema de red o cualquier otro problema con la conexi贸n a la base de datos. Si no hay problemas, el error ser谩 null.

    El segundo par谩metro es el objeto cliente, que utilizamos para interactuar con la base de datos.

    los db propiedad de la client contiene una referencia a la base de datos. Para realizar cualquier acci贸n en esa base de datos, usamos esta referencia.

    Crear un documento

    Para realizar cualquier acci贸n en la base de datos, debes estar conectado a ella, obviamente. Con Mongo, hay dos formas de insertar documentos en la base de datos. La primera forma es agregar un solo documento a la vez. Podemos usar el insertOne() m茅todo para lograr esto:

    const collection = db.collection('userdb');
    
    // Insert one document
    collection.insertOne({
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [
            'Reading books',
            'Collecting stamps'
        ]
    }, (err, result) => {
        if (err) {
            console.log(err);
            return;
        }
        
        console.log(result.result);
    });
    

    El par谩metro de resultado de la devoluci贸n de llamada contiene informaci贸n sobre la consulta. Tiene un campo llamado result que se parece a:

    result: { n: 1, ok: 1 }
    

    n es el n煤mero de documentos insertados. ok es el estado del mando.

    No tiene que crear expl铆citamente una base de datos llamada userdb, o una colecci贸n llamada users antes de insertar el documento. La base de datos y la colecci贸n se crear谩n autom谩ticamente.

    El segundo m茅todo le permite agregar varios documentos a la vez. Podemos usar el insertMany() m茅todo para lograr esto:

    // Insert multiple documents
    collection.insertMany([
        {
            firstName: 'john',
            lastName: 'doe',
            age: 21,
            hobbies: [
                'Reading books',
                'Collecting stamps'
            ]
        }, {
            firstName: 'anna',
            lastName: 'dias',
            age: 20,
            hobbies: []
        }
    ], (err, result) => {
        if (err) {
            console.log(err);
            return;
        }
        
        console.log(result.ops);
    });
    

    Ejecutar este fragmento de c贸digo producir谩:

    [ { _id: 1,
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [ 'Reading books', 'Collecting stamps' ] },
      { _id: 2,
        firstName: 'anna',
        lastName: 'dias',
        age: 20,
        hobbies: [] } ]
    

    Dado que no hemos definido un _id para cualquiera de estos documentos, podemos buscar el asignado _id desde el result['ops'] objeto si alguna vez necesitamos acceder a la generada _id.

    Adem谩s de eso, puede definir el _id usted mismo:

    // Insert one document
    collection.insertOne({
        _id: 'someuniqueid',    // Our specified ID
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [
            'Reading books',
            'Collecting stamps'
        ]
    }, (err, result) => {
        if (err) {
            console.log(err);
            return;
        }
        
        console.log(result.result);
    });
    
    

    Recuperando documentos

    Recuperar todos los documentos

    Primero, veamos c贸mo obtener todos los documentos de una colecci贸n:

    // Find all documents
    collection.find({}).toArray((err, docs) => {
        if (err) {
            throw err;
        }
        console.log(docs)
    });
    

    Ejecutar este fragmento de c贸digo nos dar谩:

    [{ _id: 1,
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [ 'Reading books', 'Collecting stamps' ] },
      { _id: 2,
        firstName: 'anna',
        lastName: 'dias',
        age: 20,
        hobbies: [] } ]
    

    Como puede ver en el ejemplo, hemos pasado un objeto vac铆o ({}) como la consulta.

    Seg煤n la documentaci贸n, el toArray() El m茅todo devuelve una matriz que contiene todos los documentos de un cursor. El m茅todo itera el cursor por completo, carga todos los documentos en la RAM y agota el cursor.

    Los documentos recuperados por la colecci贸n ser谩n asignados al docs par谩metro en la funci贸n de devoluci贸n de llamada.

    Buscar documentos con un filtro de consulta

    El siguiente m茅todo para encontrar un documento es utilizar un filtro de consulta. Por ejemplo, la siguiente consulta selecciona los usuarios con el nombre john:

    {
        'firstName': 'john'
    }
    

    Y para hacer esto en c贸digo:

    collection.find({
        firstName: 'john'
    }).toArray((err, docs) => {
        if (err) {
            throw err;
        }
        console.log(docs)
    });
    

    Este c贸digo resultar谩 en:

    [{ _id: 1,
        firstName: 'john',
        lastName: 'doe',
        age: 21,
        hobbies: [ 'Reading books', 'Collecting stamps' ] } ]
    

    Evidentemente, todos los registros con la firstName john se devuelven.

    Actualizar un documento

    La siguiente operaci贸n de la que vamos a hablar es la actualizaci贸n de un documento. Para actualizar un solo documento, similar a recuperar un documento, podemos usar el updateOne() m茅todo:

    collection.updateOne(
        // The query filter
        {
            firstName: 'john'
        },
        // The update values
        {
            $set: {
                lastName: 'well',
                edited: true
            }
        },
        (err, result) => {
            if (err) {
                throw err;
            }
            console.log(result.result);
        }
    );
    

    Este c贸digo da como resultado:

    { n: 1, nModified: 1, ok: 1 }
    

    Como puede ver en el ejemplo, el updateOne() El m茅todo acepta tres par谩metros. El primero es el filtro de consultas. El segundo son los valores de actualizaci贸n. La tercera es la funci贸n de devoluci贸n de llamada, que acepta el error y los resultados como par谩metros.

    Nuevamente, los resultados aqu铆 nos notifican el estado (ok), el n煤mero de documentos seleccionados para la actualizaci贸n (n) y el n煤mero de documentos actualizados (nModified).

    n puede ser mayor que nModified, si un campo se actualiza con el valor que ya ten铆a.

    Usando esta consulta, hemos seleccionado un documento donde el campo firstName es john y hemos cambiado el lastName de ese documento a well. Adem谩s, hemos agregado un campo llamado edited y configurarlo como true. Observe c贸mo no hemos necesitado especificar o seguir ning煤n esquema durante todo este proceso. Mongo simplemente acepta cualquier dato que le env铆e.

    Si est谩 utilizando el updateOne() m茅todo, la consulta seleccionar谩 el primer documento con el campo coincidente. Si hay varios documentos con un campo del mismo valor, utilice el updateMany() El m茅todo los actualizar谩 todos, lo que en algunos casos puede no ser lo que queremos hacer.

    Nota: Si est谩 utilizando updateOne() , lo ideal es que la consulta solo seleccione un documento. De lo contrario, no podemos predecir el documento que podr铆a actualizarse. As铆 que tenga esto en cuenta y tenga cuidado al utilizar un filtro de consulta que podr铆a coincidir con varios documentos.

    Tambi茅n podemos editar todos los documentos que cumplan la condici贸n de que el campo firstName es john:

    collection.updateMany(
        // The query filter
        {
            firstName: 'john'
        },
        // The update values
        {
            $set: {
                lastName: 'well',
                edited: true
            }
        },
        (err, result) => {
            if (err) {
                throw err;
            }
            console.log(result.result);
        }
    );
    

    los updateMany() El m茅todo es similar al updateOne() , excepto que actualiza todos los documentos que coinciden con el filtro de consulta.

    Eliminar un documento

    Podemos usar el deleteOne() o deleteMany() m茅todos para eliminar un documento de una colecci贸n:

    collection.deleteOne(
        // The query filter
        {
            firstName: 'john'
        },
        (err, result) => {
            if (err) {
                throw err;
            }
            console.log(result.result);
        }
    );
    

    Este c贸digo da como resultado:

    { n: 1, ok: 1 }
    

    Nuevamente, de manera similar a los ejemplos anteriores, el primer par谩metro aceptado es la consulta de filtro y el segundo par谩metro es la funci贸n de devoluci贸n de llamada. La funci贸n de devoluci贸n de llamada devuelve un error o un resultado.

    La ejecuci贸n de este fragmento de c贸digo eliminar谩 un documento que coincida con la consulta, en este caso, un documento en el que firstName el campo es john. Nuevamente, esto solo eliminar谩 el primer documento que coincida con la consulta.

    Tambi茅n puede utilizar el deleteMany m茅todo para eliminar todos los documentos seleccionados:

    collection.deleteMany(
        // The query filter
        {
            firstName: 'john'
        },
        (err, result) => {
            if (err) {
                throw err;
            }
            console.log(result.result);
        }
    );
    

    Conclusi贸n

    MongoDB es una popular base de datos NoSQL y liviana que es realmente f谩cil de implementar y usar con Node. Escribimos una aplicaci贸n de node muy simple que interact煤a con un MongoDB para crear, recuperar y eliminar colecciones.

    Como siempre, el c贸digo fuente est谩 disponible en GitHub.

    Etiquetas:

    Deja una respuesta

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