Las aplicaciones ASP.NET CRUD consisten en crear, leer, actualizar y eliminar. En parte 1Configuramos un proyecto básico ASP.NET Core. En parte 2añadimos el primer leer mediante una consulta SQL++ de los datos de la lista de deseos.
SQL++ de Couchbase es un potente lenguaje de consulta, que contiene todas las mejores características de SQL relacional, con un superconjunto de características para consultar datos JSON.
Sin embargo, SQL++ no es la única forma de interactuar con datos en Couchbase. En este post, exploraremos el uso de la API clave-valor.
¿Clave-valor frente a SQL?
Si tiene una formación relacional, es probable que esté acostumbrado a que SQL sea el único para interactuar con los datos (incluso si estás usando una herramienta como Entity Framework Core, sigue siendo en última instancia el uso de SQL). Una de las grandes características de una base de datos NoSQL (como Couchbase) es que mientras SQL está disponible, hay otros métodos de acceso disponibles también. (De ahí el backronym "No sólo SQL").
Para Couchbase, la forma más eficiente de acceder a los datos es a través de búsqueda clave-valor. Todos los demás índices y consultas que admite Couchbase (SQL, Búsqueda de texto completo, Analítica, Eventosetc.) se basan o dependen en última instancia de la simple búsqueda clave-valor.
La API clave-valor le dará el mejor rendimiento, donde:
-
- Se especifica una clave, o
- Su código recibe una clave, o
- Puede construir una clave de forma determinista
Ejemplos: cuándo utilizar clave-valor
He aquí algunos ejemplos de cuándo (y cuándo NO) utilizar la API clave-valor para la lectura:
Caso práctico | ¿Clave-valor? | ¿Por qué sí o por qué no? |
Buscar un usuario con clave "73892“ | Sí | Búsqueda directa |
Buscar sólo la dirección de correo electrónico de un usuario con clave "73892“ | Sí | Incluso si el documento del usuario es grande, Couchbase tiene una clave basada en subdocumento APIque permite recuperar una parte del documento. |
Buscar un grupo de usuarios con claves "73892“, “47212y “90491” | Sí | Esto puede requerir múltiples operaciones de búsqueda de claves, pero aún así puede ser más rápido que utilizar una clave SQL SELECT ... WHERE ... IN consulta. |
Buscar los comentarios de una entrada de blog | Tal vez | Si los comentarios de una entrada de blog se encuentran en un único documento y se conoce la clave de la entrada de blog, se puede construir una clave de comentario de entrada de blog. Por ejemplo, la clave de la entrada del blog es Globos como yopara obtener comentarios, utilice la tecla Me gustan los globos::comentarios |
Buscar todos los usuarios de "Ohio“ | No | El estado del usuario es probablemente un atributo "secundario", no una clave (varios usuarios pueden ser de Ohio). Este es un buen caso de uso de SQL |
Buscar productos con "globos" en su descripción | No | Las descripciones son un atributo secundario, no una clave (varios productos pueden tener "globos" en su descripción). Este es un buen caso de uso para la búsqueda de texto completo (FTS) |
Ten en cuenta que Couchbase tiene una arquitectura que da prioridad a la memoria. La caché integrada significa que una búsqueda de clave-valor a menudo recuperará datos directamente de la memoria: latencia de microsegundos, sin esperas en el disco.
Mi regla general es: utilizar la API de clave-valor siempre que sea posible, y luego recurrir a una opción más flexible como SQL++ o la búsqueda de texto completo cuando sea necesario.
Crear un punto final Get CRUD
Vamos a crear un endpoint que utilice la API clave-valor para recuperar un único elemento de la lista de deseos.
Este punto final requerirá que se proporcione como parámetro el ID del artículo de la lista de deseos:
1 2 3 4 5 6 7 8 9 10 11 |
[HttpGet] [Ruta("api/get/{id}")] público async Tarea<IActionResult> Visite(Guía id) { var cubo = await _bucketProvider.GetBucketAsync("demo"); var colección = await cubo.ColecciónAsync("lista de deseos"); var artículo = await colección.GetAsync(id.ToString()); devolver Ok(artículo.ContenidoComo<WishlistItem>()); } |
En este ejemplo, no necesitamos un grupo (como hicimos con SQL++), pero necesitamos un objeto colección objeto. Tenga en cuenta que, dado que la colección de listas de deseos está en el directorio Por defecto alcance, podemos saltarse la obtención del ámbito e ir directamente del cubo a la recogida.
Cuando el artículo se devuelve de GetAsync, está en un IGetResultado objeto. Couchbase no almacena objetos C#, almacena JSON. Por lo tanto, para serializar a un WishlistItem utilice item.ContentAs.
Esta API le ofrece flexibilidad: un documento devuelto por Couchbase puede serializarse a WishlistItem aquí y quizás Artículo de la lista de Amazon en otra parte de la aplicación.
Clave-valor en acción
Ejecuta la aplicación ASP.NET Core y veamos la página OpenAPI/Swagger actualizada.
El punto final /api/get/{id} en Regalos debería aparecer en la lista. Despliegue ese punto final haciendo clic sobre él. A diferencia del /api/getall éste requiere un parámetro: el ID del elemento de la lista de deseos que desea obtener.
Si no recuerda uno de los GUID, puede ejecutar /api/getall primero y copiar uno de ellos, o utilizar: "31c9cc33-8dfe-440c-bd1b-bb038939d2e0" (que fue la identificación que le di a la camiseta de Joey Votto). Haz clic en Pruébalopegue ese ID y haga clic en Ejecute:
Observe que en la respuesta, el ID devuelto es null. Esto se debe a que, como expliqué en parte 2Couchbase almacena el ID como metadatos. En esta situación, no es un gran problema. El ID se dio como parámetro, así que podrías asignarlo al objeto C# devuelto:
1 2 3 4 |
var itemObj = artículo.ContenidoComo<WishlistItem>(); itemObj.Id = Guía.Analice(id); devolver Ok(itemObj); |
Alternativamente, si no desea devolver ID en absoluto, puede crear una clase de vista C# separada que sólo tenga nombre y utilizarlo con ContenidoComo.
¿Qué pasa con la validación y la gestión de errores?
Ha sido muy inteligente al preguntar. Definitivamente, este punto final no está listo para la producción. ¿Qué falta?
-
- Tratamiento de errores: ¿qué pasa si hay una excepción?
- Validación: ¿qué pasa si el ID introducido no es válido?
- Autenticación/autorización: ¿qué ocurre si se supone que el consumidor de esta API no tiene acceso de lectura?
- Registro: ¿y si algo no sale del todo bien y queremos examinar el resultado más tarde?
Todas estas son preocupaciones importantes. Para la mayoría de estos, ASP.NET Core tiene funcionalidad incorporada y / o bibliotecas populares de terceros disponibles para ayudarle. Pero asegúrate de revisar la documentación de Couchbase en Gestión de errores con el SDK .NET y Panorama de la gestión de la seguridad.
¿Y ahora qué?
El proyecto ASP.NET Core está conectado a Couchbase Capella, y está leyendo datos tanto a través de SQL++ como de la API clave-valor.
En la próxima entrada del blog, veremos la creación y actualización ("C" y "U") de datos.
Mientras tanto, deberías:
-
- Prueba gratuita de Capella
- Echa un vistazo a la Couchbase Playground para .NET que puede ejecutar directamente en el navegador.