La adición del subdocumento API a Couchbase 4.5 ha allanado el camino para un soporte eficiente de estructuras de datos en Couchbase.
En esta entrada de blog, voy a mostrar una demostración de tres tipos de estructuras de datos que puedes utilizar con el SDK .NET de Couchbase:
- List - una lista de objetos, básicamente una lista respaldada por Couchbase
- Queue - una cola de objetos, básicamente una cola respaldada por Couchbase
- Dictionary - un diccionario de objetos, básicamente un Dictionary respaldado por Couchbase
También hablaré un poco de cómo funciona entre bastidores.
Si quieres, puedes seguir el juego en casa. El código fuente de este blog es disponible en GitHuby La descarga de Couchbase Server es gratuita (actualmente hay versiones preliminares para desarrolladores de la versión 5 disponibles mensualmente).
Lista
Una Lista es una estructura de datos .NET que se guarda en memoria. Con las estructuras de datos proporcionadas por el SDK .NET de Couchbase, puedes almacenarla en un documento de Couchbase.
Para crear una lista respaldada por Couchbase:
1 |
var lista = nuevo CouchbaseList(cubo, "miLista"); |
La cadena "miLista" corresponde a la clave del documento que contendrá la lista. Cuando utilice CouchbaseList
se creará un único documento con esa clave (si no existe ya). Si ya existe un documento con esa clave, CouchbaseList
lo utilizará.
Ahora puede añadir/eliminar elementos de la lista y todo se guardará en el documento. También puede realizar otras operaciones como obtener un recuento de los elementos de la lista.
1 2 3 4 5 6 7 8 9 10 |
// añade 10 objetos a la lista para(var i = 0; i < 10; i++) lista.Añadir(nuevo { num = i, foo = "bar" + Guía.NuevaGuid()}); // eliminar un elemento de la lista por índice lista.QuitarEn(5); // mostrar un elemento de la lista por índice var artículo = lista[5]; Consola.WriteLine("5º elemento de la lista: " + artículo.foo + " / " + artículo.num); |
El código anterior daría como resultado un documento con una clave "miLista" con el siguiente aspecto. Note que el ítem con num de 5 no está listado, porque fue removido.
Hay algo sutil en el ejemplo anterior que conviene señalar. Fíjese en que he utilizado var item = lista[5];
y luego item.foo
y item.num
en el WriteLine
. Si utilizara lista[5].foo
y lista[5].num
directamente, eso resultaría en dos llamadas diferentes de subdocumento a Couchbase. Esto no sólo es menos que una eficiencia óptima, sino que es posible que los valores cambien entre las dos llamadas.
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 |
[ { "num": 0, "foo": "bara1fd74ee-a790-4a0f-843c-abe449cb8b1d" }, { "num": 1, "foo": "bardc1d8f9a-4e93-46f9-b8ae-ec036743869e" }, { "num": 2, "foo": "bar9a60abe9-1e04-4fba-bd1f-f1ec39d69f56" }, { "num": 3, "foo": "bar9566605b-7abf-4a0c-aa9d-63b98ce86274" }, { "num": 4, "foo": "bar6261323f-de50-42a7-a8a7-6fcafb356deb" }, { "num": 6, "foo": "bar13832bcb-2aa0-491a-a01f-1d496f999ffc" }, // ... etc ... ] |
Cola
Muy similar a List, puedes crear una cola respaldada por Couchbase:
1 |
var cola = nuevo CouchbaseQueue(cubo, "miCola"); |
Una cola se almacena igual que una lista. La diferencia es que el orden es significativo, y esto se refleja en las operaciones que se realizan en una cola: Encolar y Descolarizar.
1 2 3 4 5 6 |
para(var i = 0; i < 3; i++) cola.Poner en cola(nuevo { num = i, foo = "baz" + Guía.NuevaGuid()}); // dequeue var artículo = cola.Puesta en cola(); Consola.WriteLine("item num " + artículo.num + "se ha retirado de la cola. Ahora hay " + cola.Cuenta + "elementos que quedan en la cola".); |
El código anterior daría como resultado un documento con una clave "myQueue" (ver JSON más abajo). Observe que no hay ningún objeto en la matriz con el número "0" porque se ha retirado de la cola.
1 2 3 4 5 6 7 8 9 10 |
[ { "num": 1, "foo": "baz64bb62b6-bf23-4e52-b584-d2fa02accce6" }, { "num": 2, "foo": "baz0a160bd9-aa7b-4c45-9e19-d1a3d982a554" } ] |
Diccionario
Espero que ahora veas un patrón. Para crear un diccionario:
1 |
var dic = nuevo CouchbaseDictionary<cadena,dinámico>(cubo, "miDict"); |
De nuevo, se creará un documento con la clave dada. Las operaciones que se pueden realizar incluyen Añadir, Eliminar, y el indexador []
operación.
1 2 3 4 5 6 7 |
para(var i = 0; i < 5; i++) dic.Añadir("llave" + Guía.NuevaGuid(), nuevo { num = i, foo = "qux" + Guía.NuevaGuid()} ); // imprimir las claves del diccionario Consola.WriteLine("Hay" + dic.Claves.Cuenta + " en el diccionario".); foreach(var clave en dic.Claves) Consola.WriteLine("llave: " + clave + ", valor.num: " + dic[clave].num); |
Un documento de diccionario tiene este aspecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "key5aa2520d-123c-4fca-b444-b0cb8846d46e": { "num": 0, "foo": "qux93b197dc-f175-4246-a38d-7b080eb9bea0" }, "key55dee298-14c6-4da7-97a8-66c69d7e8a70": { "num": 1, "foo": "quxa593ee4c-682c-402d-887b-3f09f029e9b6" }, "key3386afcf-7b70-4e4d-b9ae-6defbca33fe7": { "num": 2, "foo": "qux1259ae94-1008-4e1f-86a1-bfbd0873b09b" }, "key2bc8c451-f125-4282-9fb4-7ea15f4b3168": { "num": 3, "foo": "qux1b6fb62b-9918-46dc-9a2f-610a55d017ef" }, "key3f7041f3-abd3-49c7-a373-454cbd2ac0fc": { "num": 4, "foo": "qux0a87655f-197d-4fb2-8a54-b1de6e288de4" } } |
Una nota sobre la dinámica C#: he utilizado dinámico
para que los ejemplos de código sean breves y sencillos. En tu aplicación, probablemente sea mejor que utilices un tipo C# real definido. Todo se serializa a JSON en Couchbase, por supuesto.
Entre bastidores
Antes de que se lanzara la API de subdocumentos en Couchbase Server 4.5, estas estructuras de datos eran posiblePor supuesto. El problema era que se cargaba todo el documento, se ponía en una lista, se hacían cambios en la lista y luego se guardaba todo el documento. Si tienes grandes estructuras de datos, pero sólo estás leyendo o haciendo cambios en un solo elemento, esto a menudo resulta en una pérdida de tiempo y ancho de banda y, posiblemente, un aumento de la contención.
El subdocumento-API (que puede utilizar directamente; lo cubrí en la sección API de subdocumentos en Couchbase Server 4.5 con el SDK .NET (revisado) blog post) se utiliza entre bastidores en CouchbaseList
, CouchbaseQueue
y CouchbaseDictionary
. Así, cuando se añade un elemento a un CouchbaseList
por ejemplo, sólo se envía por cable ese elemento, no toda la lista.
Algunas operaciones necesitarán obtener el documento completo. Por ejemplo, iterar a través de una colección utilizando una función foreach
recuperará el documento completo. Al eliminar un elemento de la lista, se escaneará el documento completo. Pero si en el futuro surgen operaciones con subdocumentos que admitan esas acciones, las implementaciones del SDK se actualizarán en consecuencia.
Resumen
Estas estructuras de datos son otra herramienta para ayudarle a gestionar sus datos. Dado que utilizan la API de subdocumentos, suelen ser más eficaces que un enfoque basado en documentos completos. Para obtener más información, consulte la página Documentación sobre estructuras de datos.
¿Tiene preguntas? ¿Algún comentario? ¿Necesita ayuda? Visite nuestros forosenvíame un mensaje a Twitter @mgroveso deja un comentario.
[...] muchos más bonitos ejemplos de Estructuras de Datos Couchbase .NET en el blog de Matthew Grove [...]
[...] En febrero, escribí un blog sobre el uso de estructuras de datos con .NET (y .NET Core): Lista, Cola y Diccionario. [...]