Prolog
En artículo anterior proporcionaba detalles sobre cómo migrar un conjunto de datos MongoDB a Couchbase Server. Este artículo muestra cómo usar el SDK de Couchbase para acceder a los datos a través de una aplicación de consola Java. Los fragmentos de código muestran cómo conectarse al clúster de Couchbase, realizar operaciones clave/valor y ejecutar búsquedas secundarias mediante consultas N1QL junto con el código correspondiente para hacer lo mismo con el SDK Java de Mongo.
Todo el código de este blog está disponible en el siguiente repositorio Git: mongodb-to-couchbase.
Requisitos previos
Un clúster Couchbase que contenga el conjunto de datos según los detalles del artículo anterior.
Crear un usuario de aplicación
Antes de que un cliente (aplicación) pueda conectarse al cluster del Servidor Couchbase es necesario definir un usuario de aplicación que se utiliza para la autenticación por parte del cliente. Couchbase Control de acceso basado en funciones le permite definir usuarios y asignarles las funciones adecuadas. Utilice la consola web para crear un usuario de aplicación denominado mflix_client como sigue.
Ir a la Seguridad en la consola web y haga clic en AÑADIR USUARIO:
Configure el mflix_client usuario de la siguiente manera y haga clic en Añadir usuario:
- Nombre de usuario: mflix_client
- Contraseña: contraseña (o cualquier contraseña de su elección).
- Verificar contraseñaigual que Contraseña valor de arriba.
- Funciones: Ampliar la sample_mflix y seleccione Acceso a la aplicación. Los usuarios con el Función de acceso a aplicaciones tienen acceso completo de lectura y escritura a todos los datos del bucket sample_mflix. El rol no permite el acceso a la Consola Web de Couchbase: está pensado para aplicaciones, más que para usuarios.
En el Seguridad verás el nuevo usuario mflix_client:
Creación de índices para consultas N1QL
Índices secundarios en Couchbase Server soportan la ejecución eficiente de consultas (o búsquedas secundarias) al igual que los índices en MongoDB. Los ejemplos de código en este artículo ejecutan Consultas N1QL que utilizan dos índices que crearás ejecutando consultas N1QL. Vaya a la página Consulta en la consola web:
El primer índice está en el atributo name de todos los documentos de comentarios del bucket sample_mflix. Introduzca la siguiente sentencia N1QL en el archivo Editor de consultas:
1 |
CREAR ÍNDICE idx1 en sample_mflix(nombre) DONDE tipo="comentario" |
Haga clic en Ejecute y después de unos momentos el creación de índices está completo:
El segundo índice se basa en los atributos year, imdb.rating y title de todos los documentos de películas del bucket sample_mflix. Introduzca la siguiente sentencia N1QL en el archivo Editor de consultas:
1 |
CREAR ÍNDICE idx2 en sample_mflix(año, imdb.valoración, título) DONDE tipo="película" |
Haga clic en Ejecute y al cabo de unos instantes se habrá completado la creación del índice:
Ir a la Índices en la consola web para verificar que los índices idx1 & idx2 existe:
Convertir llamadas API de MongoDB en llamadas API de Couchbase
El código de ejemplo de este artículo utiliza los SDK Java de Couchbase y MongoDB y se proporciona sólo como ejemplo de cómo utilizar algunas de las API del SDK. Consulta los siguientes enlaces para obtener la documentación completa del SDK de Couchbase para tu idioma:
Conectarse a Couchbase Server
Para acceder a los recursos del clúster, los clientes deben autentifique pasando las credenciales apropiadas a Couchbase Server. El código de ejemplo utiliza las credenciales de usuario de la aplicación mflix_client creadas anteriormente para autenticar.
El siguiente ejemplo de código se conecta al cluster de Couchbase que se ejecuta en el nodo especificado, obtiene una referencia al bucket mflix_client, y una referencia a la colección por defecto en ese bucket.
Couchbase
1 2 3 |
Grupo grupo = Grupo.conecte("127.0.0.1", "mflix_client", "contraseña"); Cubo cubo = grupo.cubo("sample_mflix"); Colección colección = cubo.defaultCollection(); |
MongoDB
1 2 3 4 |
MongoClient mongoClient = MongoClients.crear("mongodb+srv://:@/ "); Base de datos MongoDatabase mongoDatabase = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> comentarios = mongoDatabase.getCollection("comentarios"); MongoCollection<Document> películas = mongoDatabase.getCollection("películas"); |
Recuperar un documento por ID
Utiliza el Colección.get() para recuperar documentos completos por ID. El siguiente ejemplo de código recupera dos documentos de la colección predeterminada del bucket sample_mflix.
Couchbase
1 2 3 4 5 6 |
// get() lanzará una excepción si no existe un documento con el ID especificado ObtenerResultado comentario = colección.consiga("comment:5a9427648b0beebeb69579cc"); Sistema.fuera.println(comentario.contentAsObject()); ObtenerResultado película = colección.consiga("movie:573a1390f29313caabcd4135"); Sistema.fuera.println(película.contentAsObject()); |
MongoDB
1 2 |
comentarios.encontrar(Filtros.eq("_id", nuevo ObjectId("5a9427648b0beebeb69579cc"))); películas.encontrar(Filtros.eq("_id", nuevo ObjectId("573a1390f29313caabcd4135"))); |
Insertar un nuevo documento
Utiliza el Colección.insertar() para crear un nuevo documento con el ID y el contenido especificados si aún no existe. El siguiente ejemplo de código inserta este documento en la colección predeterminada del bucket sample_mflix:
1 2 3 4 5 6 7 |
{ "nombre":"Anat Chase", "email":"anat_chase@fakegmail.com", "movie_id":"movie:573a1390f29313caabcd4135", "texto":"Esta es la revisión de Anat", "tipo":"comentario" } |
Couchbase
1 2 3 4 5 6 7 8 9 |
JsonObject doc = JsonObject.crear() .poner("nombre", "Anat Chase") .poner("email", "anat_chase@fakegmail.com") .poner("movie_id", "movie:573a1390f29313caabcd4135") .poner("texto", "Esta es la revisión de Anat") .poner("tipo", "comentario"); // insert() lanzará una excepción si ya existe un documento con el ID especificado colección.insertar("comment:5a9427648b0beebeb69579c0", doc); |
MongoDB
1 2 3 4 5 6 7 |
Documento doc = nuevo Documento("_id", nuevo ObjectId("5a9427648b0beebeb69579c0")) .añadir("nombre", "Anat Chase") .añadir("email", "anat_chase@fakegmail.com") .añadir("movie_id", nuevo ObjectId("573a1390f29313caabcd4135")) .añadir("texto", "Esta es la revisión de Anat"); comentarios.insertarUno(doc); |
Insertar varios documentos nuevos
Operaciones de dosificación le permite aprovechar mejor su red y acelerar su aplicación aumentando el rendimiento de la red y reduciendo la latencia. Las operaciones por lotes funcionan mediante pipelining a través de la red. Cuando las solicitudes se canalizan, se envían en un gran grupo al clúster. El clúster, a su vez tuberías al cliente.
El siguiente ejemplo de código utiliza este enfoque para insertar dos nuevos documentos en el bucket sample_mflix.
Couchbase
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 |
// Crear dos documentos JSON Lista<Tuple2<Cadena, JsonObject>> documentos = nuevo ArrayList<Tuple2<Cadena, JsonObject>>(); doc = JsonObject.crear() .poner("nombre", "Anat Chase") .poner("email", "anat_chase@fakegmail.com") .poner("movie_id", "movie:573a1390f29313caabcd42e8") .poner("texto", "Esta es la revisión de Anat") .poner("tipo", "comentario"); documentos.añada(Tuplas.de("comment:5a9427648b0beebeb69579c1", doc)); JsonObject doc2 = JsonObject.crear() .poner("nombre", "Anat Chase") .poner("email", "anat_chase@fakegmail.com") .poner("movie_id", "movie:573a1390f29313caabcd4323") .poner("texto", "Esta es la revisión de Anat") .poner("tipo", "comentario"); documentos.añada(Tuplas.de("comment:5a9427648b0beebeb69579c2", doc2)); // Inserta los 2 documentos en un lote, esperando hasta que el último esté hecho. // insert() lanzará una excepción si ya existe un documento con el ID especificado Flux .fromIterable(documentos) .en paralelo().runOn(Programadores.elástico()) .concatMap(doc3 -> reactiveCollection.insertar(doc3.obtenerT1(), doc3.obtenerT2()) .onErrorResume(e -> Mono.error(nuevo Excepción(doc3.obtenerT1(), e)))) .secuencial().collectList().bloque(); |
MongoDB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Lista<Document> documentos = nuevo ArrayList<Document>(); Documento doc1 = nuevo Documento("_id", nuevo ObjectId("5a9427648b0beebeb69579c1")) .añadir("nombre", "Anat Chase") .añadir("email", "anat_chase@fakegmail.com") .añadir("movie_id", nuevo ObjectId("573a1390f29313caabcd42e8")) .añadir("texto", "Esta es la revisión de Anat"); documentos.añada(doc1); Documento doc2 = nuevo Documento("_id", nuevo ObjectId("5a9427648b0beebeb69579c2")) .añadir("nombre", "Anat Chase") .añadir("email", "anat_chase@fakegmail.com") .añadir("movie_id", nuevo ObjectId("573a1390f29313caabcd4323")) .añadir("texto", "Esta es la revisión de Anat"); documentos.añada(doc2); comentarios.insertMany(documentos); |
Actualizar un documento existente
Utiliza el Colección.reemplazar() para actualizar un documento existente con el ID especificado sólo si ya existe. Couchbase admite operaciones con subdocumentos que puede utilizarse para acceder eficazmente a piezas de documentos. Las operaciones con subdocumentos pueden ser más rápidas y eficientes en red que documento completo porque sólo transmiten por la red las secciones del documento a las que se ha accedido. Las operaciones con documentos completos y subdocumentos son atómicas, lo que permite realizar modificaciones seguras en los documentos con control de concurrencia incorporado.
El siguiente ejemplo de código utiliza operaciones de subdocumento para actualizar el atributo de texto de un documento especificado.
Couchbase
1 2 3 4 5 |
// Actualizar un documento utilizando la API de subdocumentos para modificar los atributos específicos // replace() lanzará una excepción si no existe un documento con el ID especificado colección.mutateIn( "comment:5a9427648b0beebeb69579c0", Matrices.asList(sustituir("texto", "Esta no es la crítica de Anat"))); |
MongoDB
1 2 3 |
comentarios.updateUno( Filtros.eq("_id", nuevo ObjectId("5a9427648b0beebeb69579c0")), Actualizaciones.combinar(Actualizaciones.configure("texto", ""))); |
Actualizar varios documentos
Además del acceso primario mediante API de clave/valor, también puede ejecutar consultas N1QL a través de las API N1QL. N1QL es un lenguaje declarativo para consultar, transformar y manipular datos JSON - piensa en SQL para JSON.
El siguiente ejemplo de código ejecuta una consulta N1QL para actualizar los atributos de nombre y correo electrónico de todos los documentos de comentarios cuyo nombre sea Anat Chase. Esta consulta utiliza el atributo idx1 creado anteriormente.
Couchbase
1 2 3 4 5 6 |
// ejecutar una consulta N1QL UPDATE a través de la API de consulta Cadena declaración = "UPDATE sample_mflix" + "SET name='Anita Chase', email='anita_chase@fakegmail.com' " + "WHERE type='comment' AND name='Anat Chase'"; Resultado de la consulta updateResult = grupo.consulta(declaración); |
MongoDB
1 2 3 4 5 |
comentarios.updateMany( Filtros.eq("nombre", "Anat Chase"), Actualizaciones.combinar( Actualizaciones.configure("nombre", "Anita Chase"), Actualizaciones.configure("email", "anita_chase@fakegmail.com"))); |
Actualizar o insertar un documento
Utiliza el Colección.upsert() para insertar el documento si no existe, o sustituirlo si existe. Si no existe un documento con el ID especificado, upsert() creará un nuevo documento. Si existe un documento con el ID especificado, upsert() actualizará el documento existente. El siguiente ejemplo de código actualiza un documento existente en el bucket sample_mflix.
Couchbase
1 2 3 4 5 6 7 8 9 |
doc = JsonObject.crear() .poner("nombre", "Mia Hannas") .poner("email", "mia_hannas@fakegmail.com") .poner("movie_id", "movie:573a1390f29313caabcd4135") .poner("texto", "Esta es la crítica de Mia") .poner("tipo", "comentario"); // upsert() actualizará el documento si existe o insertará el documento si no existe colección.upsert("comment:5a9427648b0beebeb69579c0", doc); |
MongoDB
1 2 3 4 5 6 7 |
colección.replaceOne( Filtros.eq("_id", nuevo ObjectId("5a9427648b0beebeb69579c0")), nuevo Documento("nombre", "Mia Hannas") .añadir("email", "mia_hannas@fakegmail.com") .añadir("movie_id", nuevo ObjectId("573a1390f29313caabcd4135")) .añadir("texto", "Esta es la crítica de Mia"), nuevo UpdateOptions().upsert(verdadero)); |
Borrar un documento
Utiliza el Colección.eliminar() para eliminar un documento completo con el ID especificado. El siguiente ejemplo de código elimina un documento existente del bucket sample_mflix.
Couchbase
1 2 |
// remove() lanzará una excepción si el documento no existe colección.eliminar("comment:5a9427648b0beebeb69579c0"); |
MongoDB
1 |
colección.deleteOne(Filtros.eq("_id", nuevo ObjectId("5a9427648b0beebeb69579c0"))); |
Borrar varios documentos
También puede utilizar consultas N1QL para eliminar documentos. El siguiente ejemplo de código ejecuta una consulta N1QL para eliminar varios documentos del bucket sample_mflix. Se eliminarán todos los documentos de comentarios cuyo nombre sea Anita Chase. Esta consulta utiliza el método idx1 creado anteriormente.
Couchbase
1 2 3 4 5 |
// ejecutar una consulta N1QL DELETE a través de la API de consulta Cadena declaración = "DELETE FROM sample_mflix" + "WHERE type='comment' AND name='Anita Chase'"; Resultado de la consulta deleteResult = grupo.consulta(declaración); |
MongoDB
1 |
comentarios.deleteMany(Filtros.eq("nombre", "Anita Chase")); |
Acceso a datos con N1QL
N1QL también puede utilizarse para realizar búsquedas secundarias de datos más complicadas. El siguiente ejemplo de código ejecuta una consulta N1QL de bloqueo para seleccionar el título, el año y la calificación imdb de todos los documentos de películas cuyo año esté comprendido entre 1970 y 1979, ordenados por la calificación imdb. La consulta utiliza el método idx2 creado anteriormente.
Similar a operaciones reactivas clave/valor por lotes, consultas reactivas y asíncronas para un mejor rendimiento.
Couchbase
1 2 3 4 5 6 7 8 |
// ejecutar una consulta SELECT N1QL (bloqueo) a través de la API de consulta Cadena selectStatement = "SELECT title, year, imdb.rating FROM sample_mflix" + "WHERE type='movie' AND year BETWEEN 1970 AND 1979 ORDER BY imdb.rating DESC"; final Resultado de la consulta seleccioneResultado = grupo.consulta(selectStatement); para (JsonObject fila : seleccioneResultado.rowsAsObject()) { Sistema.fuera.println(fila.toString()); } |
MongoDB
1 2 3 4 5 |
películas.encontrar(Filtros.y(Filtros.gte("año", 1970), Filtros.lte("año", 1979))) .ordenar(Clasifica.descendente("imdb.rating")) .proyección(Proyecciones.campos( Proyecciones.incluir("título, "año", "imdb.rating"), Proyecciones.excludeId())); |
El futuro
Explore las otras capacidades del SDK de Couchbase incluyendo Analítica y Búsqueda de texto completo. Aproveche nuestra formación gratuita en línea disponible en https://learn.couchbase.com para obtener más información sobre Couchbase.
Para obtener información detallada sobre las ventajas arquitectónicas de la plataforma de datos Couchbase sobre MongoDB, consulte este documento: Couchbase: Mejor que MongoDB en todos los sentidos.
Descubra por qué otras empresas eligen Couchbase en lugar de MongoDB: