Prólogo
Este artículo te guiará a través de una migración única de MongoDB a Couchbase. Aprenderás cómo exportar desde la estructura de datos de MongoDB, importar a Couchbase y hacer algunas transformaciones básicas en esos documentos.
Todo el código de este blog está disponible en el siguiente repositorio Git: mongodb-to-couchbase
Requisitos previos
Este artículo utiliza el conjunto de datos de ejemplo mflix que se ha cargado en un clúster MongoDB. Estoy usando MongoDB Atlas pero la información de este artículo se aplica también a instalaciones de MongoDB que no sean Atlas. Si necesita cargar el conjunto de datos de ejemplo en MongoDB, consulte el artículo instrucciones aquí.
Brújula MongoDB se utiliza para exportar el conjunto de datos y este artículo asume que ya está configurado para conectarse al clúster MongoDB donde reside el conjunto de datos mflix de ejemplo.
También necesitarás un cluster Couchbase Server Enterprise Edition (EE) 6.5 con los servicios Data, Index, Query y Eventing habilitados (NOTA: Index y Query se usarán en un artículo futuro). Estoy usando una instalación local de un solo nodo de Couchbase Sever EE pero la información de este artículo se aplica a cualquier cluster de Couchbase Server EE.
Si no dispone de un clúster de Couchbase Server EE, los siguientes enlaces le ayudarán a ponerlo en marcha rápidamente:
- Descargar Couchbase Sever EE 6.5
- Instalar Couchbase Server EE
- Aprovisionar un clúster de un solo nodo (NOTA: utilice los valores predeterminados para la configuración del clúster).
JSON, BSON y JSON extendido
MongoDB y Couchbase son bases de datos documentales y ambas almacenan documentos JSON. Sin embargo, MongoDB representa documentos JSON en un formato de codificación binaria llamado BSON. JSON sólo puede representar un subconjunto de los tipos soportados por BSON. Para preservar la información de tipos, MongoDB utiliza Extended JSON que incluye extensiones al formato JSON. Consulte la Especificación JSON ampliada de MongoDB para más detalles sobre los diferentes tipos y convenciones de Extended JSON.
Estos son algunos ejemplos de cómo MongoDB representa diferentes tipos de información:
- ObjectId: “_id”:{“$oid”:”573a1390f29313caabcd4135″}
- Entero: "tiempo de ejecución":{"$numberInt": "1″}
- Fecha: “released”:{“$date”:{“$numberLong”:”-2418768000000″}}
- Doble: "rating":{"$numberDouble": "6.2″}
Aunque Couchbase puede almacenar esta información, es más fácil trabajar con documentos que no utilizan el formato JSON extendido. Usando los ejemplos anteriores, los valores tendrían este aspecto:
- ObjectId: “_id”:”573a1390f29313caabcd4135″
- Entero: "tiempo de ejecución":1
- Fecha: “released”:-2418768000000
- Doble: "valoración":6.2
Exportar datos desde MongoDB
Utiliza MongoDB Compass para exportar los archivos películas y comentarios colecciones de la sample_mflix base de datos. En Compass, amplíe el archivo sample_mflix y, a continuación, seleccione comentarios.
Elija el Colección -> Exportación del menú. Seleccione Exportar la colección completa y haga clic en SELECCIONAR CAMPOS.
Seleccione todos los campos y haga clic en SELECCIONAR SALIDA.
Seleccione JSON Tipo de archivo de exportación, especifique el Archivo de salida y haga clic en EXPORTACIÓN.
Haga lo mismo con el películas colección.
Importar datos a Couchbase
A continuación, importa los datos de la colección MongoDB a Couchbase. Como se mencionó anteriormente, los datos exportados están en formato JSON extendido por lo que el Couchbase Servicio de eventos se utiliza para realizar algunas transformaciones menores en los datos en tiempo real a medida que los documentos se importan en Couchbase.
A alto nivel, el flujo es el siguiente:
- Utiliza el Utilidad cbimport para importar los documentos JSON al entrante cubo.
- A medida que los documentos se escriben en el entrante cubo, una función Eventing transformará los documentos.
- Si la transformación se realiza correctamente, el documento transformado se escribirá en el archivo sample_mflix cubo.
- Si hay algún error, el documento original se escribe en el error cubo. Un atributo de error en el documento contendrá el mensaje de error.
Crear cubos
Cree los tres cubos mencionados anteriormente. Consulte la documentación sobre la creación de un cubo para más detalles sobre los diferentes ajustes y consideraciones para establecer los valores.
En entrante bucket almacenará temporalmente los documentos mientras se importan a Couchbase. Se trata de un cubo efímero ya que no necesitamos ningún almacenamiento persistente para estos documentos. Una función Eventing los transformará y los escribirá en el cubo sample_mflix o en el cubo de errores.
Dado que no es necesario que los documentos permanezcan en el bucket una vez transformados, el bucket se configura con un botón Tiempo de vida (TTL) de 900 segundos (15 minutos). Los documentos son eliminados automáticamente por Couchbase cuando el TTL caduca.
Para crear el entrante cubo, haga clic en Cubos y luego AÑADIR CUBO.
Configure el entrante como se indica a continuación y haga clic en Añadir cubo.
- Nombre: entrante
- Cuota de memoria256 MB (NOTA: Los buckets efímeros no persisten en disco, por lo que debe asegurarse de que hay suficiente memoria asignada al bucket para alojar todo el conjunto de datos que se está importando. El tamaño total de las colecciones de comentarios y películas utilizadas en este ejemplo es de unos 50 MB, por lo que 256 MB son más que suficientes para alojar este conjunto de datos).
- Tipo cubo: Efímero
- Configuración avanzada de cubos -> Tiempo máximo de vida del cubo900 segundos (NOTA: Los documentos se transforman en tiempo real a medida que se escriben en Couchbase, por lo que este valor puede establecerse relativamente bajo. En este caso se utilizan 15 minutos (900 segundos). Si el valor se establece demasiado bajo, el documento podría caducar antes de ser procesado).
En sample_mflix se utiliza para almacenar el documento transformado. Se trata de un Cubo Couchbase ya que necesitamos un almacenamiento persistente para estos documentos. Configúrelo como sigue:
- Nombre: sample_mflix
- Cuota de memoria256 MB (NOTA: los buckets de Couchbase guardan todos los documentos en el disco, por lo que la cuota de memoria determinará cuántos documentos pueden almacenarse en el bucket). capa de caché integrada en cualquier momento. El tamaño total de las colecciones de comentarios y películas utilizadas en este ejemplo es de unos 50 MB, por lo que 256 MB son más que suficientes para albergar este conjunto de datos).
- Tipo cubo: Couchbase
En error se utiliza para almacenar los documentos que no se han podido transformar. Configúrelo como sigue:
- Nombre: error
- Cuota de memoria: 256 MB
- Tipo cubo: Couchbase
Transformación de datos con Eventing
Eventos se utiliza para transformar los datos en tiempo real a medida que se importan a Couchbase. Hay algunas cosas que configurar para utilizar esta función.
En primer lugar, cree un metadatos cubo que utiliza Eventing para almacenar los datos del sistema. Configúrelo como sigue:
- Nombre: metadatos
- Cuota de memoria: 256 MB
- Tipo cubo: Couchbase
En Cubos muestra los 4 buckets creados: error, incoming, metadata y sample_mflix:
Haga clic en Eventos y haga clic en AÑADIR FUNCIÓN para configurar la función que se utiliza para transformar los datos en tiempo real a medida que se importan a Couchbase.
Configure la función del siguiente modo:
- Cubo de origen: incoming (Este bucket almacena temporalmente los documentos a medida que se importan a Couchbase)
- Cubo de metadatos: metadatos (Este bucket se utiliza para almacenar datos del sistema)
- Nombre de la función: transformar
- Descripción: Transformar la exportación a MongoDB
- Fijaciones (Haga clic en el botón + para añadir un segundo enlace)
- tipo de encuadernación: alias de cubo
- nombre de alias: target (alias utilizado en la función para referirse al cubo)
- cubo: sample_mflix (nombre del cubo en el clúster)
- acceso: leer y escribir
-
- tipo de encuadernación: alias de cubo
- nombre de alias: error (alias utilizado en la función para referirse al cubo)
- cubo: error (nombre del cubo en el clúster)
- acceso: leer y escribir
Haga clic en Siguiente Añadir código para añadir el código JavaScript del transformar función.
En la pantalla de la función de transformación, sustituya el código de la plantilla por el código siguiente.
La función incluye sentencias log() para registrar el documento original, el documento transformado y cualquier error. Siéntase libre de cambiar estos según sea necesario. Las entradas Eventing archivo de registro es eventing.log se puede encontrar en el @eventing registro de la aplicación. Véase este enlace para más información sobre el nombre del archivo de registro y cómo verlos.
Puede ampliar fácilmente la capacidad de esta función para realizar otras transformaciones añadiendo el código necesario en la función transformValues(). Si necesita realizar algún cambio en la función, deberá pausarlo o desinstalarlo, editar el JavaScript y, a continuación, reanudarlo o volver a instalarlo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
función OnUpdate(doc, meta) { registro("documento original: ", doc); pruebe { // transformar el documento var nuevoDoc = transformValues(null, "", doc); // añadir un atributo de tipo basado en el ID del documento (disponible en meta.id) nuevoDoc["tipo"] = getTypeFromId(meta.id); // generar un ID de documento para el documento transformado basado en el tipo y el valor del atributo _id var id = generateId(nuevoDoc); registro("documento transformado (id = " + id + "): ", nuevoDoc); // escribir el documento transformado en el cubo de destino con el ID generado objetivo[id] = nuevoDoc; } captura (e) { registro("error transformando documento " + meta.id + ". Ver cubo de error para más detalles".); // si hay algún error, almacena el mensaje de error en el atributo error doc["error"] = e; // escribe el documento sin transformar en el cubo de errores con el ID original error[meta.id] = doc; } } función OnDelete(meta) { } // Esta es una función recursiva que iterará sobre todas las propiedades del documento (incluyendo arrays y sub-objetos) // Transformará JSON extendido a JSON estándar. función transformValues(parentObj, parentProperty, obj) { var propertyType = ""; // para cada propiedad del objeto para (var propiedad en obj) { si (obj.hasOwnProperty(propiedad) && obj[propiedad] != null) { interruptor (propiedad) { caso "$oid": // convertir parentObj.parentProperty = {"$oid": "3487634876"} // a parentObj.parentProperty = "3487634876" parentObj[parentProperty] = obj[propiedad]; romper; caso "$date": si (obj["$date"]["$numberLong"] != null) { // convertir parentObj.parentProperty = {"$date":{"$numberLong":"-2418768000000"}} // a parentObj.parentProperty = -2418768000000 parentObj[parentProperty] = Número(obj["$date"]["$numberLong"]); romper; } // convert parentObj.parentProperty = {"$date": "1983-04-27T20:39:15Z"}} // a parentObj.parentProperty = "1983-04-27T20:39:15Z" parentObj[parentProperty] = obj["$date"]; romper; caso "$numberInt": caso "$numberDecimal": caso "$numberLong": caso "$numberDouble": // convertir parentObj.parentProperty = {"$numberInt": "1"} // a parentObj.parentProperty = 1 parentObj[parentProperty] = Número(obj[propiedad]); romper; ¡¡¡// !!! ¡¡¡Esta función se puede ampliar añadiendo declaraciones case adicionales aquí !!! por defecto: // de lo contrario, compruebe el tipo de propiedad propertyType = determineType(obj[propiedad]); interruptor (propertyType) { caso "Objeto": // si la propiedad es un objeto, transforma recursivamente el objeto transformValues(obj, propiedad, obj[propiedad]); romper; caso "Matriz": // si la propiedad es un array, transforma cada elemento del array transformArray(obj[propiedad]); romper; por defecto: // en caso contrario, no hacer nada romper; } } } } devolver obj; } // Determinar el tipo del objeto especificado función determineType(obj) { devolver obj == null ? "null" : obj.constructor.nombre; } // Transforma cada elemento de la matriz especificada función transformArray(obj) { para (var i = 0; i < obj.longitud; i++) { transformValues(obj, i, obj[i]); } } // Obtener el tipo de documento del id especificado. // Esta función espera que los documentos sean importados con IDs en el siguiente formato: // ejemplo: :12 función getTypeFromId(id) { devolver id.dividir(":")[0]; } // Generar un ID de documento para el documento especificado. // El nuevo ID se basará en el valor del atributo type y el valor del atributo _id: // : función generateId(documento) { var documentId = documento["_id"]; si (determineType(documentId) != "Cadena") { tirar "El valor '_id' debe ser una cadena: _id = '" + documentId + "'"; } devolver documento["tipo"] + ":" + documentId; } |
Haga clic en Guardar para guardar el código y pulse < volver a Concurso completo para volver a la Eventos de la consola.
Verá el nuevo transformar pero es necesario desplegarla. Haga clic en el botón transformar y, a continuación, pulse Despliegue.
Confirme el despliegue de la función con la configuración por defecto pulsando Función de despliegue.
Una vez desplegada la función, el estado es desplegado.
Ahora todo está listo para importar los datos de exportación de MongoDB a Couchbase y transformarlos en tiempo real.
Importar documentos con cbimport
Utiliza el Utilidad cbimport para importar los archivos de exportación de MongoDB. Antes de importar datos es importante entender la sintaxis del comando y lo que está haciendo.
He aquí un ejemplo de comando cbimport:
1 |
$ cbimport json -c <grupo> -u <admin nombre de usuario> -p <admin contraseña> -b <cubo> -d <importar archivo> -f <archivo formato> -g <clave generador> |
Para importar MongoDB comentarios ejecute el siguiente comando. Tenga en cuenta que la ubicación de la utilidad cbimport varía en función del sistema operativo y se documenta aquí: Referencia CLI.
1 |
$ <ruta_a_cbimport>/cbimport json -c <grupo> -u <admin nombre de usuario> -p <admin contraseña> -b entrante -d archivo:///comments.json -f list -g comment:#MONO_INCR# |
El comando se conectará al clúster especificado (es decir, -c couchbase://127.0.0.1) utilizando las credenciales de administrador suministradas (es decir, -u Administrador -p contraseña).
El comando importará datos JSON de comments.json. Compruebe el formato del archivo comments.json exportado y especifique el valor correcto. opción de formato del conjunto de datos según el formato del archivo de exportación. Mi archivo de exportación sigue el formato formato de lista que contiene una única lista JSON en la que cada elemento de la lista representa un documento independiente (-f list).
Los documentos se escriben en el bucket de entrada (-b incoming) utilizando una clave generada con el formato especificado (-g comment:#MONO_INCR#). En este comando, el formato especifica que cada clave de documento comenzará por "comment:". La dirección Función MONO_INCR se incrementa en 1 cada vez que se llama, de modo que las claves resultantes son comentario:1, comentario:2, etc.
Una vez completado, verá el siguiente resultado:
1 2 |
Json `archivo://comments.json` importado a `http://127.0.0.1:8091` con éxito. Documentos importado: 50304 Documentos fallido: 0 |
Ir a la Cubos y confirme que el sample_mflix contiene 50.304 documentos.
Para importar MongoDB películas ejecute el siguiente comando.
1 |
$ <ruta_a_cbimport>/cbimport json -c <grupo> -u <admin nombre de usuario> -p <admin contraseña> -b entrante -d archivo:///movies.json -f list -g movie:#MONO_INCR# |
Una vez completado, verá el siguiente resultado:
1 2 |
Json `archivo://movies.json` importado a `http://127.0.0.1:8091` con éxito. Documentos importado: 23539 Documentos fallido: 0 |
Ir a la Cubos y confirme que el sample_mflix bucket contiene 73.843 documentos.
Ahora comprueba dos de los documentos transformados. Vaya al Documentos y asegúrese de que el Cubo se establece en sample_mflix. Haga clic en id comment:5a9427648b0beebeb69579cc (el primer documento de la lista):
Fíjate en el contenido:
1 2 3 4 5 6 7 8 9 |
{ "_id": "5a9427648b0beebeb69579cc", "nombre": "Andrea Le", "email": "andrea_le@fakegmail.com", "movie_id": "573a1390f29313caabcd418c", "texto": "Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam"., "fecha": "2012-03-26T23:20:16Z", "tipo": "comentario" } |
Comparándolo con los datos exportados (busque 5a9427648b0beebeb69579cc en comments.json):
1 2 3 4 5 6 7 8 |
{ "_id":{"$oid":"5a9427648b0beebeb69579cc"}, "nombre":"Andrea Le", "email":"andrea_le@fakegmail.com", "movie_id":{"$oid":"573a1390f29313caabcd418c"}, "texto":"Rem officiis eaque repellendus amet eos doloribus. Porro dolor voluptatum voluptates neque culpa molestias. Voluptate unde nulla temporibus ullam"., "fecha": {"$date": "2012-03-26T23:20:16Z"} } |
La función de transformación ha cambiado los valores JSON extendidos _id, movie_id y date. Observe que se ha añadido un atributo type basado en el prefijo de la clave del documento (recuerde que especificamos comment como prefijo de la clave al importar los datos).
Cierre el editor de documentos cuando haya terminado de revisar el contenido del documento.
En el ID del documento introducir campo movie:573a1390f29313caabcd4135pulse Recuperar documentosy haga clic en id movie:573a1390f29313caabcd4135.
Fíjate en el contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
{ "_id": "573a1390f29313caabcd4135", "parcela": "Tres hombres martillean sobre un yunque...", "géneros": [ "Corto" ], "tiempo de ejecución": 1, "cast": [ "Charles Kayser", "John Ott" ], "num_mflix_comments": 1, "título: "Escena de herrería", "fullplot": "Una cámara fija mira a un gran yunque ...", "países: [ "USA" ], "liberado": -2418768000000, "directores": [ "William K.L. Dickson" ], "clasificado": "UNRATED", "premios": { "gana": 1, "nominaciones": 0, "texto": "1 victoria". }, "lasttupdated": "2015-08-26 00:03:50.133000000", "año": 1893, "imdb": { "rating": 6.2, "votos": 1189, "id": 5 }, "tipo": "película", "tomates": { "espectador": { "rating": 3, "numReviews": 184, "metro": 32 }, "lastUpdated": "2015-06-28T18:34:09Z" } } |
Comparándolo con los datos exportados (busque 573a1390f29313caabcd4135 en movies.json):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
{ "_id": {"$oid": "573a1390f29313caabcd4135"}, "parcela": "Tres hombres martillan en un ...", "géneros": [ "Corto" ], "tiempo de ejecución": 1, "cast": [ "Charles Kayser", "John Ott" ], "num_mflix_comments": 1, "título: "Escena de herrería", "fullplot": "Una cámara fija mira a un gran yunque ...", "países: [ "USA" ], "liberado": {"$date": {"$numberLong": "-2418768000000"}}, "directores":[ "William K.L. Dickson" ], "clasificado": "UNRATED", "premios": { "gana": 1, "nominaciones": 0, "texto": "1 victoria". }, "lasttupdated": "2015-08-26 00:03:50.133000000", "año": 1893, "imdb": { "rating": 6.2, "votos": 1189, "id": 5 }, "tipo": "película", "tomates": { "espectador": { "rating": 3, "numReviews" 184, "metro": 32 }, "lastUpdated": {"$date": "2015-06-28T18:34:09Z"} } } |
La función de transformación ha cambiado los valores JSON extendidos _id, released y tomatoes.lastUpdated. Observe que en este caso no se ha añadido un atributo de tipo. El documento exportado ya contenía un atributo type, por lo que la función de transformación no añadió uno, sino que estableció el valor basándose en el prefijo de la clave (recuerde que especificamos movie como prefijo de la clave al importar los datos).
Cierre el editor de documentos cuando haya terminado de revisar el contenido del documento.
El futuro
Si no tiene previsto importar más datos de exportación de MongoDB, puede desinstalar la función de transformación y eliminar los buckets de entrada y error.
-
- Un futuro artículo cubrirá cómo actualizar el código de cliente existente para utilizar el SDK de Couchbase.
- Aproveche nuestra formación gratuita en línea disponible en https://learn.couchbase.com para obtener más información sobre Couchbase.
- Consulte los distintos IDEs para desarrolladores de Couchbase-JetBrains, VSCode-para los que tenemos plugins.
Para obtener información detallada sobre los diferentes modelos de documentos entre Couchbase y MongoDB, el modelado de datos y el esquema de MongoDB, y otras formas de comparar MongoDB vs. Couchbase, consulte este documento: Couchbase: Mejor que MongoDB en todos los sentidos.
Descubra por qué otras empresas eligen Couchbase en lugar de MongoDB: