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".
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:
A continuación, consulta la vista:
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.
{
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.
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.
{
[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.
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.
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.
{
[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.
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 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);
}
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
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/….
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í.
//-- 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.
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…
http://www.couchbase.com/commu…