{"id":19390296,"url":"https://github.com/jaimerc/mongodb-module","last_synced_at":"2026-04-12T01:38:52.905Z","repository":{"id":135545973,"uuid":"216641648","full_name":"JaimeRC/mongodb-module","owner":"JaimeRC","description":null,"archived":false,"fork":false,"pushed_at":"2020-11-13T19:14:23.000Z","size":62,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-03T21:24:46.515Z","etag":null,"topics":["chai","dao-design-pattern","javascript","jsonschema","mongodb","nodejs","schema-validation","testing"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JaimeRC.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-21T18:48:32.000Z","updated_at":"2020-11-13T19:14:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"821d7f9f-b5cf-4d39-a751-1d48362ea583","html_url":"https://github.com/JaimeRC/mongodb-module","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JaimeRC/mongodb-module","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaimeRC%2Fmongodb-module","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaimeRC%2Fmongodb-module/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaimeRC%2Fmongodb-module/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaimeRC%2Fmongodb-module/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JaimeRC","download_url":"https://codeload.github.com/JaimeRC/mongodb-module/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JaimeRC%2Fmongodb-module/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284982746,"owners_count":27095048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-17T02:00:06.431Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chai","dao-design-pattern","javascript","jsonschema","mongodb","nodejs","schema-validation","testing"],"created_at":"2024-11-10T10:20:00.574Z","updated_at":"2025-11-18T01:02:07.195Z","avatar_url":"https://github.com/JaimeRC.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MongoDB Module\n\n## Descripción\n\nModulo de conexión a la base de datos de Mongo utilizando el driver `mongodb`, incluyendo esquemas de validación y clases que facilita el acceso a los datos almacenados en las diferentes colecciones. \nAdemas, para la utilización de este mismo se ha desarrollado con Docker la creación de un ReplicaSet de MongoDb.\n\n## Estructura del Proyecto\n    \n    docker-compose.yml\n        ├─── module\n        |     ├───index.js                # Archivo de inicialización y conexión a la DB\n        |     ├───test                    # Archivos de Test\n        |     ├───schemas                 # Esquemas de validación de los campos de cada colección\n        |     └───dao                     # Clases de todas la colecciones para gestionar la información\n        |          └───utils              # Utilidades comunes para todas las colecciones\n        └─── mongo\n              ├───.env                    # Variables de Entornos para Docker-compose\n              ├───config                  # Archivos de Configuración de cada Cluster de Mongo\n              ├───data                    # Carpeta de almacenamiento de información para los CLuster de Mongo (No habilitado)\n              |     ├───node1             # Cluster 1\n              |     ├───node2             # Cluster 2\n              |     └───node2             # Cluster 3\n              └───deploy                  # Carpeta para la creación/iniciación del Cluster\n                    ├───rs_initiate.js    # Inicialización del ReplicaSet de Mongo\n                    └───setup.sh          # Comprueba que los Cluster de mongo están levantados y ejecuta la Configuración del ReplicaSet\n     \n\n## MongoDB\n### Antes de empezar, hablemos un poco de la configuración de MongoDB\n\nPara la creación de un ReplicaSet de tres clusters en Mongo lo que se ha realizado es crear 4 contenedores de Docker (`mongoclient`, `mongo1`, `mongo2` y `mongo3`). \nLa diferencia del contenedor `mongoclient` respecto a los otros tres clusters es que este solo lo se encarga de inicializar el ReplicaSet y su configuración, después de esto es dado de baja.\n\n### Configuración de los clusters del ReplicaSet (RS)\n\nPara la configuración de cada cluster se ha realizado desde un archivo `.conf` el cual se indica al inicializar el contenedor de cada cluster (`mongod --config /etc/node1.conf`).\n\nLa configuración del primer cluster:\n\n        storage:                                       # Configuración de almacenamiento\n           dbPath: /data/db/node1                      # Ruta donde almacenar los datos\n           journal:\n              enabled: true                             # Diario de registro de transacciones binario secuencial que se usa para llevar la base de datos a un estado válido en caso de un cierre forzado\n           engine: wiredTiger                           # Motor de almacenamiento\n           wiredTiger:                                  \n              engineConfig:\n                 cacheSizeGB: 3.5                       # Limitación del motor de almacenamiento en 3.5 GB RAM (para este caso un ordenador de 8 GB RAM)\n        net:\n           bindIpAll: true                              # Blinda todas las direcciones ipv4\n           port: 27010                                  # Puerto de escucha\n        processManagement:\n           fork: false                                  # Proceso en segundo plano\n        systemLog:\n           destination: file                            # Destino de almacenamiento de logs\n           path: /data/db/node1/mongod.log              # Ruta de almacenamiento de información\n           logAppend: true                              # Concatena los logs nuevos con los anteriores cuando se reinicia el cluster.\n        replication:\n           replSetName: rs_name                         # Nombre del ReplicaSet\n\n***Nota:***\nPara saber el tamaño de `cacheSizeGB` nos hemos basado de la siguiente formula suministrada por documentación de MongoDB `(0.5 * (TOTAL_RAM_MACHINE - 1 GB))`.\nEjemplo, si tenemos una maquina con 8GB de RAM seria `(0.5 * (8 - 1) = 3.5GB`\n\nEl resto de clusters tienen la misma configuración, solo se modifica las rutas de almacenamiento de datos y logs.\n\n### Inicialización y configuración del RS\n\nLa inicialización y configuración es realizada por el cluster `mongoclient`, el cual se espera a que los clusters `mongo1`, `mongo2` y `mongo3` se inicialicen. \nDespués de esto, lo que se realiza es el lanzamiento de un script en bash para la configuración:\n\n        until mongo --host mongo1:27010 --eval \"print(\\\"waited for connection\\\")\"\n        do\n            sleep 10\n        done\n        mongo --host mongo1:27010 ./src/rs_initiate.js\n\nEste script lo que hace es imprimir un logs (`waited for connection`) y al cabo de 10 segundo lanza el comando que se conecta al cluster `mongo1` \npara ejecutar el archivo de javascript de configuración:\n\n        # Objeto con la configuración del RS (nombre y los host de los miembros)\n        var rs_cluster = {\n            _id: \"rs_name\",\n            members: [\n                {_id: 0, host: 'mongo1:27010'},\n                {_id: 1, host: 'mongo2:27011'},\n                {_id: 2, host: 'mongo3:27012'}\n            ]\n        };\n        \n        # Función que hace esperar la cantidad de milisegundos que se le pase\n        var sleep = function (milliseconds) {\n            var start = new Date().getTime();\n            for (var i = 0; i \u003c 1e7; i++) {\n                if ((new Date().getTime() - start) \u003e milliseconds){\n                    break;\n                }\n            }\n        };\n        \n        # Información del RS\n        var replStatus = rs.status();\n        \n        # En el caso de que ya este configurado imprime la información\n        if(replStatus \u0026\u0026 replStatus.ok === 1){\n            print(\" ### Replication OK\");\n            printjson(replStatus);\n        \n        # En el caso de que no este configurado, configuramos el RS e imprimimos su información.\n        } else {\n            print(\" ### Starting replication...\");\n            printjson(rs.initiate(rs_cluster));\n            sleep(5000);\n            print(\" \");\n            print(\" ### Replica Set status\");\n            printjson(rs.status());\n        }\n\nDespués de que se ejecute este proceso, ya tendremos inicializado y configurado el RS.\n\nPara conectarnos a este RS con el driver de MongoDB tendríamos que utilizar la siguiente uri: `mongodb://mongo1:27010,mongo2:27011,mongo3:27012`\n\n## Prerequisitos\n\n- [Docker](https://docs.docker.com/install/) \n- [Docker Compose](https://docs.docker.com/compose/install/)\n\n## Empezando\n\n1. Clona el repositorio.\n2. Ejecuta el comando `docker-compose up`.\n\n        Creating network \"mongo_network\" with driver \"bridge\"\n        Pulling mongo1 (mongo:latest)...\n        latest: Pulling from library/mongo\n        5bed26d33875: Downloading [=======\u003e                                           ]  4.135MB/26.69MB\n        ...\n        1d3609ce2ac9: Waiting\n        ...\n        Starting mongo1 ... done\n        Starting mongo3 ... done\n        Starting mongo2 ... done\n        Starting mongoclient ... done\n        Recreating module    ... done\n        Attaching to mongo1, mongo3, mongo2, mongoclient, module\n\n3. Despues de que se creen las instancia en los contenedores, nos introduciremos dento del contenedor de `module` para ejecutar los test:\n       \n       docker exec -it module sh \n       npm run test\n       \n        Testing nx-mongodb\n           User Test\n             ✓ Create\n             ✓ Read\n             ✓ Update\n             ✓ Delete\n           Address Test\n             ✓ Create\n             ✓ Read\n             ✓ Update\n             ✓ Delete\n           Transactions Test\n             ✓ createUserWithAddress\n           Action Test\n             ✓ Create\n       [DAO - TRIGGER] --\u003e  insert  --\u003e  { _id: { _id: 5e92eec30b85930022b7b94d } }\n             ✓ Read\n             ✓ Update\n       [DAO - TRIGGER] --\u003e  update  --\u003e  { _id: { _id: 5e92eec30b85930022b7b94d } }\n             ✓ Delete\n           Trigger Test\n       [DAO - TRIGGER] --\u003e  delete  --\u003e  { _id: { _id: 5e92eec30b85930022b7b94d } }\n             ✓ Create\n       [DAO - TRIGGER] --\u003e  insert  --\u003e  { _id: 'test_1' }\n             ✓ Read\n             ✓ Update\n       [DAO - TRIGGER] --\u003e  update  --\u003e  { _id: 'test_1' }\n             ✓ Delete\n       [DAO - TRIGGER] --\u003e  delete  --\u003e  { _id: 'test_1' }\n       [DAO - TRIGGER] --\u003e  insert  --\u003e  { _id: 'test_2' }\n             ✓ Expire Document (8007ms)\n       [DAO - TRIGGER] --\u003e  delete  --\u003e  { _id: 'test_2' }\n           MongoClient testing\n             ✓ Client initialized with URI and options\n             ✓ Database handle created from MongoClient\n       \n       \n         20 passing (29s)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaimerc%2Fmongodb-module","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaimerc%2Fmongodb-module","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaimerc%2Fmongodb-module/lists"}