CRUD significa Crear, Leer, Actualizar y Eliminar. En la parte 2, veremos R para Read, y construiremos un endpoint ASP.NET Core para leer datos de Couchbase usando SQL.
Asegúrese de leer parte 1 de esta serieque cubre la instalación y configuración de su proyecto ASP.NET Core "wishlist".
SQL++ para leer
Couchbase es única entre las bases de datos NoSQL en el sentido de que admite un implementación completa de SQL (llamado SQL++, de soltera N1QL) para consultar datos JSON.
SQL++ no es un lenguaje "tipo SQL" diluido. Con SQL++, dispone de Se une a, CTEs/WITH, ACTUALIZACIÓN, INSERTAR, BORRAR, FUSIONAR, agregación/GROUP BY, INICIO/COMPROMISO/RETROCESOy mucho más.
Además (el "++"), también dispone de funciones para tratar datos JSON, como FALTA, NEST, Funciones ARRAY_*, Funciones OBJECT_*y mucho más.
Para esta sencilla aplicación CRUD, utilizaremos un SQL++ SELECCIONE consulta (e índice) para devolver todos artículos de mi lista de deseos.
Escribir su primera consulta SQL
En primer lugar, vamos a intentar escribir una consulta SQL++ para obtener todos los elementos de la lista de deseos en la carpeta Workbench de consulta Capella.
Para empezar, inténtalo:
|
1 |
SELECCIONE * DESDE demo.Por defecto.lista de deseos; |
Al hacerlo, debería aparecer un mensaje de error. Algo como:
|
1 |
`no índice disponible en espacio clave por defecto:demo.Por defecto.lista de deseos que coincide con su consulta. Utilice CREAR PRIMARIO ÍNDICE` ... |
Este es el comportamiento esperado. (La mayoría) de las consultas SQL++ en Couchbase no se ejecutarán a menos que haya al menos un índice disponible para ellas.
No hay problema. Cree un sencillo ÍNDICE PRIMARIO con un comando como este:
|
1 |
CREAR PRIMARIO ÍNDICE `ix_wishlist` EN `demo`.`Por defecto`.`lista de deseos` |
Por lo general, los índices primarios no están pensados para ser utilizados en un entorno de producción típico, pero son muy útiles para un entorno de desarrollo, ya que garantizan que cualquier La consulta SQL++ se ejecutará en la colección indexada (aunque no será tan eficiente como una colección indexada correctamente). Una vez que empiece a crear consultas SQL++ más complejas, puede utilizar la función Botón "Aconsejar" en el Query Workbench para obtener sugerencias de índices más eficientes para crear (y usted debe evitar el uso de SELECCIONAR * siempre que puedas 😆).
Después de crear el índice, vuelva a intentar lo anterior SELECCIONE y los resultados serán los siguientes:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
[ { "lista de deseos": { "nombre": "Skyline Chili T-Camisa" } }, { "lista de deseos": { "nombre": "Joey Votto jersey" } } ] |
Ya casi está. Trate de imaginar esta matriz de objetos que se serializa a un C# Lista. No funcionaría del todo, porque los objetos están anidados con el nombre de la colección. Así que me he acostumbrado a poner alias a las colecciones, así:
|
1 |
SELECCIONE w.* DESDE demo.Por defecto.lista de deseos w; |
Lo que produce el resultado:
|
1 2 3 4 5 6 7 8 |
[ { "nombre": "Camiseta Skyline Chili" }, { "nombre": "Joey Votto jersey" } ] |
Se ve bien, pero todavía falta algo. ¿Dónde están esos GUIDs que usamos para las claves de los documentos? Couchbase no los almacena como datos; los almacena como metadatos. SQL++ proporciona la META() para consultar metadatos. Utilice META().id así:
|
1 |
SELECCIONE META(w).id, w.* DESDE demo.Por defecto.lista de deseos w; |
Y que finalmente nos da un resultado de:
|
1 2 3 4 5 6 7 8 9 10 |
[ { "id": "2dab198b-1836-4409-9bdf-17275a2b2462", "nombre": "Camiseta Skyline Chili" }, { "id": "31c9cc33-8dfe-440c-bd1b-bb038939d2e0", "nombre": "Joey Votto jersey" } ] |
Esto se serializará muy bien en WishlistItem utilizando la clase creada en la parte 1.
Uso de SQL++ en ASP.NET Core
Pongamos esa consulta SQL++ que acabamos de escribir en un endpoint ASP.NET Core.
En GiftsControllercree un endpoint llamado GetAll:
|
1 2 3 4 5 6 |
[HttpGet] [Ruta("api/getall")] público async Tarea<IActionResult> GetAll() { } |
Para ejecutar SQL++, necesitamos obtener un objeto de tipo Grupo. SQL++ se ejecuta a nivel de cluster (no de bucket, ni de scope, ni de colección, ya que puede necesitar ÚNASE A/UNIÓN entre ellos). Podríamos volver atrás y añadir ClusterProvider como parámetro del constructor. Si este endpoint fuera a funcionar sólo con SQL++, sería una buena idea. Sin embargo, sigamos con lo que creamos en la parte 1. Tenemos un objeto de tipo BucketProvider. A partir de ese objeto, se puede obtener un objeto de tipo Grupo:
|
1 2 3 4 5 6 7 8 9 |
[HttpGet] [Ruta("api/getall")] público async Tarea<IActionResult> GetAll() { var cubo = await _bucketProvider.GetBucketAsync("demo"); var grupo = cubo.Grupo; // ... snip ... } |
A grupo es la forma en que ASP.NET Core interactuará con un clúster Couchbase de diversas maneras. Por ahora, estamos interesados en su QueryAsync método:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[HttpGet] [Ruta("api/getall")] público async Tarea<IActionResult> GetAll() { var cubo = await _bucketProvider.GetBucketAsync("demo"); var grupo = cubo.Grupo; var resultado = await grupo.QueryAsync<WishlistItem>( "SELECT META(w).id, w.* FROM demo._default.wishlist w;" ); devolver Ok(resultado); } |
Asegúrese de que dispone de lo siguiente utilizando en la parte superior de su GiftsController.cs file:
|
1 2 3 4 5 |
utilizando AspNetCoreTutorial.Modelos; utilizando Microsoft.AspNetCore.Mvc; utilizando Couchbase; utilizando Couchbase.Consulta; utilizando Couchbase.Extensiones.DependencyInjection; |
Una cosa más a tener en cuenta. Cuando se ejecuta SQL++, hay una serie de opciones de coherencia (escaneado). El valor por defecto es ConsistenciaEscaneo.NotBounded. Esta configuración significa que el motor de consulta no esperar a que los índices terminen de actualizarse antes de devolver los resultados. Esta es la opción más eficaz. Sin embargo, en algunas situaciones, querrás una mayor consistencia en los índices. Couchbase proporciona SolicitarPlus y AtPlus.
Pruebe el punto final de ASP.NET Core
Desde Visual Studio, Ctrl+F5 iniciará la aplicación. Deberías ver una página OpenAPI / Swagger en tu navegador.

(Ignorar Previsión meteorológicaque viene con la plantilla de Visual Studio).
Haga clic en el punto final para probarlo. No hay parámetros que especificar, así que simplemente haga clic en Ejecute.

Ahora tiene la "R" de CRUD en su lugar.
¿Y ahora qué?
El proyecto ASP.NET Core está conectado a Couchbase Capella, y está leyendo datos a través de SQL++.
En la próxima entrada del blog, crearemos otro punto final de "lectura". En lugar de SQL++, veremos otra forma más rápida de acceder a los datos y leerlos.
Mientras tanto, deberías:
-
- Prueba gratuita de Capella
- Echa un vistazo a la Couchbase Playground para .NET que puede ejecutar directamente en el navegador.