Ya está disponible el SDK v2.2.7 de Couchbase.NET con la vista previa para desarrolladores de la gestión de índices.
¡Hoy lanzamos la versión 2.2.7 del SDK .NET oficial de Couchbase! Esta versión contiene soporte para la gestión de índices y añade la API de sub-documento que fue lanzada como una vista previa para desarrolladores en la versión 2.2.6, así como una corrección de errores y mejoras en el futuro soporte de .NET Core.
Gestión de índices
Los Índices Secundarios Globales (GSIs) son una pieza importante de la arquitectura de consulta N1QL en el servidor Couchbase permitiendo consultas rápidas y de baja latencia. Puedes colocar índices en elementos JSON, expresiones N1QL y usando filtros a través de una cláusula WHERE. Para la v2.2.7 del SDK .NET hemos construido una abstracción sobre el servicio de indexación de Couchbase Server que hace muy fácil crear índices primarios y secundarios. Esta abstracción extiende y amplía la clase BucketManager que incluye soporte para crear y gestionar Buckets de Couchbase.
|
1 2 3 4 5 6 7 8 9 10 |
var configuration = new ClientConfiguration(); using (var cluster = new Cluster(configuration)) { using (var bucket = cluster.OpenBucket("beer-sample")) { var manager = bucket.CreateManager("Administrator", ""); } } |
El BucketManager se crea abriendo un objeto Bucket fuera de una instancia Cluster y pasando la configuración correcta para su entorno.
Creación y eliminación de índices primarios
Puedes crear índices primarios con nombre y sin nombre llamando a los métodos CreatePrimaryIndex y CreateNamedPrimaryIndex una vez que tengas la instancia de BucketManager:
|
1 2 3 4 5 6 |
//create an unamed primary index on the bucket var result = manager.CreatePrimaryIndex(false); //create a named primary index called "myprimaryindex" on the bucket var result = manager.CreateNamedPrimaryIndex("myprimaryindex", false); |
Tenga en cuenta que siempre está trabajando con el contexto del cubo que ha abierto. Así que estos índices se crearán en el cubo "muestra-cerveza" que hemos abierto antes. Además, ten en cuenta que ambos métodos toman un campo booleano llamado "defer", de hecho, como verás, todos los métodos de creación contienen un parámetro "defer". Si "defer" es verdadero, el índice será creado, sin embargo, no será construido hasta que el método BuildDeferredIndexes sea llamado. Más sobre índices diferidos más adelante.
Dar de baja un índice primario con o sin nombre es prácticamente igual que crear un índice, con la excepción de los nombres de los métodos:
|
1 2 3 4 5 6 |
//drop the primary index for the bucket var result = manager.DropPrimaryIndex(); //drop a named primary index on the bucket var result = manager.DropNamedPrimaryIndex("myprimaryindex"); |
Tenga en cuenta que si el índice no existe, entonces result.Success será falso.
Creación y eliminación de índices secundarios
La creación y eliminación de índices secundarios es similar a la de los índices primarios, con la diferencia de que también se puede indexar uno o varios campos.
|
1 2 3 4 5 6 |
//create a secondary index called "myindex" on the "id" and "name" fields. var result = manager.CreateIndex("myindex", true, "id", "name"); //drop the index called "myindex" var result = manager.DropIndex("myindex"); |
Nótese que en este caso estoy pasando "true" para que la construcción del índice sea diferida. Además, si el índice ya existe o si no existe e intentas eliminarlo, result.Success será false.
Actualizaciones de la API de subdocumentos
Esta versión también contiene cambios internos en la API SubDocument lanzada como Developer Preview en 2.2.6. Se han añadido dos mejoras importantes relacionadas con el rendimiento:
- Si se ejecuta una única operación de mutación o búsqueda, el SDK utilizará una operación única en lugar de una multioperación, lo que ahorra unos pocos bytes en el cable.
- La deserialización del cuerpo de la respuesta se aplaza ahora hasta que se llame a Content
Expresiones lambda para la navegación por rutas de subdocumentos
Además de estos cambios, se ha incluido otra nueva función en la versión gracias a una contribución de la iniciativa comunidad: Navegación de expresiones lambda para rutas de subdocumentos. Esta característica le permite utilizar la sintaxis familiar de tipo seguro, intellisense apoyado que disfrutar de linq en lugar de simplemente pasar en las rutas de cadena.
Suponiendo que un documento que se parece a:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "name": "21st Amendment Brewery Cafe", "city": "San Francisco", "state": "California", "code": "94107", "country": "United States", "phone": "1-415-369-0900", "website": "https://www.21st-amendment.com/", "type": "brewery", "updated": "2010-10-24 13:54:07", "description": "The 21st Amendment Brewery offers a variety of award winning house made brews and American grilled cuisine in a comfortable loft like setting. Join us before and after Giants baseball games in our outdoor beer garden. A great location for functions and parties in our semi-private Brewers Loft. See you soon at the 21A!", "address": [ "563 Second Street" ], "geo": { "accuracy": "ROOFTOP", "lat": 37.7825, "lon": -122.393 } } |
A continuación, recupere el valor en la ruta "geo.accuracy" de la siguiente manera:
|
1 2 3 4 5 6 7 8 |
var key = "21st_amendment_brewery_cafe"; var lookup = bucket.LookupIn(key). Get(x => x.Geo.Accuracy). Execute(); var value = lookup.Content(x=>x.Geo.Accuracy); Assert.AreEqual("ROOFTOP", value); |
Por supuesto, puede encadenar varios "Gets" para recuperar cada elemento individual del documento.
Notas de la versión 2.2.7
Error
- [NCBC-1099] - Añadir atributo DataContract a las clases Error, Warning y Metrics
Mejora
- [NCBC-1103] - Soporte para operaciones asíncronas en subdocumentos
- [NCBC-994] - Actualizar el entorno de desarrollo y los proyectos a VS2015
- [NCBC-1089] - Esperar todas las rutas de código no exitosas
- [NCBC-1095] - No reintentar en NodeUnavailableException
Nueva función
- [NCBC-1067] - Ampliar BucketManager para que admita la gestión de índices
- [NCBC-1093] - Incluir compatibilidad con la API de subdocumentos - Parte 2 Comandos únicos DP2