Sin categoría

Vistas fuertemente tipadas con la biblioteca de clientes .NET

En últimos bits de Couchbase .NET Client Library soportan algunas opciones diferentes de consulta de vistas. En este post, describiré esas opciones en detalle. Para jugar en casa, asegúrate de que tienes la última versión de Couchbase Server instalada con el bucket de ejemplo beer-sample. 

He añadido una vista llamada "by_name" al cubo de muestras de cerveza en el documento de diseño "beer". Esta vista simplemente crea un índice secundario sobre la propiedad "name" de los documentos "beer".

función (doc, meta) {
  si (doc.nombre && doc.tipo && doc.tipo == "cerveza") {
    emite(doc.nombre, null);
  }    
}

La consulta de esta vista con la versión no genérica de GetView producirá una colección enumerable de IViewRow que contienen información sobre las filas de la vista.

Configure su código de cliente de la siguiente manera:

var config = nuevo CouchbaseClientConfiguration();
config.Urls.Añadir(nuevo Uri("http://localhost:8091/pools"));
config.Cubo = "muestra de cerveza";            

var cliente = nuevo CouchbaseClient(config);

A continuación, consulta la vista:

var vista = cliente.GetView("cerveza", "by_name");
foreach (var fila en ver)
{
    Consola.WriteLine("ID de fila: " + fila.ItemId);
    Consola.WriteLine("Clave de Fila: " + fila.VerKey[0]);
    Consola.WriteLine("Valor de Fila: " + fila.Información["valor"]);
}

La interfaz IViewRow define propiedades para las propiedades "id" y "key" de la fila y, además, proporciona un diccionario con acceso a cada propiedad de la fila. 

Si quisiera recuperar los documentos originales asociados a cada una de las filas, tomaría la fila.ItemId y realizaría la consulta utilizando la función del cliente Visite método.

foreach (var fila en ver)
{
    var artículo = cliente.Visite(fila.ItemId);
    Consola.WriteLine(artículo);
}

Alternativamente, se puede hacer un multi-get para recuperar todos los documentos en una sola llamada. Tenga en cuenta que con esta versión, la vista se consulta cuando se utiliza el método LINQ Seleccione a diferencia del caso anterior, en el que la enumeración de la vista consulta la vista. En cualquier caso, es la enumeración de la Ver que lanza la petición a la vista en el servidor.

var docs = cliente.Visite(ver.Seleccione(r => r.ItemId));
foreach (var doc en docs)
{
    Consola.WriteLine(doc);
}

Ahora, digamos que usted tiene un Cerveza en su aplicación y desea obtener instancias de Cervezas al iterar sobre la vista. 

público clase Cerveza
{
    [JsonProperty("nombre")]
    público cadena Nombre { consiga; configure; }

    [JsonProperty("abc")]        
    público float ABV { consiga; configure; }

    [JsonProperty("cervecería_id")]
    público cadena BreweryId { consiga; configure; }

    [JsonProperty("tipo")]
    público cadena Tipo { consiga; configure; }

    [JsonProperty("descripción")]
    público cadena Descripción { consiga; configure; }

}

La clase Beer hace uso de Newtonsoft.Json para serializar y deserializar JSON. La biblioteca cliente también depende de este ensamblado.

Con el nuevo Cerveza es posible consultar la vista y decirle al cliente que Cerveza debe ser el elemento devuelto por cada enumeración de una fila de la vista.

var vista = cliente.GetView<Cerveza>("cerveza", "by_name", verdadero);

foreach(var cerveza en ver)
{
    Consola.WriteLine(cerveza.Nombre);
}

Hay que señalar dos cambios importantes en el fragmento anterior. En primer lugar, cuando GetView se llama, Cerveza como tipo genérico. En segundo lugar, el tercer argumento suministrado a GetView indica al cliente que Visite el documento original y deserializarlo a una instancia de T o en este caso, un Cerveza.

En el caso de que el valor devuelto por una fila sea una proyección del documento indexado, las vistas fuertemente tipadas siguen siendo posibles. 

función (doc, meta) {
  si (doc.nombre && doc.tipo && doc.tipo == "cerveza") {
    emite(doc.nombre, { "nombre_cerveza" : doc.nombre, "estilo_cerveza" : doc.estilo });
  }    
}

Dado que la vista ahora incluye el nombre y el estilo de la cerveza (se trata de un uso artificioso de las proyecciones), es posible escribir con fuerza los resultados de la consulta de la vista, en este caso en un campo CervezaProyección clase. 

público clase CervezaProyección
{
    [JsonProperty("nombre_cerveza")]
    público cadena Nombre { consiga; configure; }

    [JsonProperty("estilo_cerveza")]
    público cadena Estilo { consiga; configure; }
}

Eliminación del argumento booleano de la función GetView deja el valor por defecto de false y el cliente intentará deserializar la propiedad value de cada fila de la vista en una instancia de To, en este caso, a CervezaProyección.

var vista = cliente.GetView<CervezaProyección>("cerveza", "by_name");

foreach(var cerveza en ver)
{
    Consola.WriteLine(cerveza.Nombre);
}

Finalmente, si quisieras realizar un multi-get genérico y utilizar tus propias técnicas de deserialización, podrías hacer algo como lo siguiente:

var vista = cliente.GetView("cerveza", "by_name");
var cervezas = cliente.Visite(ver.Seleccione(v => v.ItemId)).Seleccione(d =>
        JsonConvert.DeserializarObjeto<Cerveza>(d.Valor como cadena)
    );

foreach(var cerveza en cervezas)
{
    Consola.WriteLine(cerveza.Nombre);
}

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por John Zablocki, Desarrollador NET. Desarrollador SDK, Couchbase

John Zablocki es desarrollador de NET. SDK en Couchbase. John es también el organizador de Beantown ALT.NET y antiguo profesor adjunto en la Universidad de Fairfield. También puedes consultar el libro en Amazon llamado "Couchbase Essentials" que explica cómo instalar y configurar Couchbase Server.

6 Comentarios

  1. Hola Jhon,
    Este artículo es muy bueno. Quiero recuperar registros de forma Vista pasando parámetros al método. Estoy haciendo RnD en este mismo. ¿Puede usted por favor me ayude en este mismo?

    Gracias por adelantado.

    Suraj

    1. Hola Suraj,

      Cada uno de los métodos GetView tiene la capacidad de encadenar parámetros de forma fluida. En otras palabras:

      var view = clien.GetView(\"designdoc\", \"view\").Key(\"foo\").Limit(10);

      Más información en http://www.couchbase.com/docs/….

      1. He estado leyendo acerca de este método GetView y tratando de hacer que funcione igual que lo que Suraj está haciendo, pero nunca funciona para mí.

        1. //-- ejemplo de doc
          {
          \Símbolo: \"HCP",
          \"nombre": \"HCP, Inc.",
          \"Sector": \"Servicios al consumidor",
          …..
          }

          //- ver
          function (doc, meta) {
          if (doc.símbolo) {
          emit([doc.symbol.toLowerCase()], null);
          }
          }

          //-- c#
          var view = GetView(\"by_symbol\").Key(symbol.ToLower());

          //-- ver prueba
          _view/by_symbol?stale=false&key=%22hcp%22&connection_timeout=60000&limit=10&skip=0

          //-- resultado
          No encuentro el símbolo "hcp\" ..... No tengo ni idea de lo que está pasando.

  2. Nguyễn Thanh Sơn julio 23, 2014 a 10:46 am

    Me da error:
    Error al convertir el valor 1 al tipo \'Couchbase.IViewRow\'. Ruta \'\', línea 1, posición 1.

    Error
    convirtiendo valor 1 a tipo \'Couchbase.IViewRow\'. Ruta \'\', línea 1,
    posición 1. - Ver más en:
    http://www.couchbase.com/commu
    Error
    convirtiendo valor 1 a tipo \'Couchbase.IViewRow\'. Ruta \'\', línea 1,
    posición 1. - Ver más en:
    http://www.couchbase.com/commu
    Error
    convirtiendo valor 1 a tipo \'Couchbase.IViewRow\'. Ruta \'\', línea 1,
    posición 1. - Ver más en:
    http://www.couchbase.com/commu
    Error
    convirtiendo valor 1 a tipo \'Couchbase.IViewRow\'. Ruta \'\', línea 1,
    posición 1. - Ver más en:
    http://www.couchbase.com/commu

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.