O últimas informações da biblioteca de clientes do Couchbase .NET oferecem suporte a algumas opções diferentes de consulta de exibição. Nesta publicação, descreverei essas opções em detalhes. Para jogar em casa, verifique se você tem o Couchbase Server mais recente instalado com o bucket de amostra beer-sample.
Adicionei uma exibição chamada "by_name" ao bucket de amostras de cerveja no documento de design "beer". Essa visualização simplesmente cria um índice secundário na propriedade "name" dos documentos "beer".
se (doc.nome && doc.tipo && doc.tipo == "cerveja") {
emitir(doc.nome, nulo);
}
}
Consultar essa exibição com a versão não genérica de Obter visualização produzirá uma coleção enumerável de IViewRow que contêm informações sobre as linhas na exibição.
Configure seu código de cliente da seguinte forma:
Em seguida, consulte a exibição:
antes de (var row em visualização)
{
Console.WriteLine("ID da linha: " + fila.ItemId);
Console.WriteLine("Chave de linha: " + fila.Exibir chave[0]);
Console.WriteLine("Valor da linha: " + fila.Informações["valor"]);
}
A interface IViewRow define propriedades para as propriedades "id" e "key" na linha e, além disso, fornece um dicionário com acesso a cada propriedade na linha.
Se você quisesse recuperar os documentos originais associados a cada uma das linhas, pegaria o row.ItemId e consultaria usando o Obter método.
{
var item = cliente.Obter(fila.ItemId);
Console.WriteLine(item);
}
Como alternativa, você poderia fazer um multi-get para recuperar todos os documentos em uma única chamada. Observe que, com essa versão, a exibição é consultada quando o LINQ Selecione é chamado, ao contrário do que ocorre acima, quando a enumeração da visualização consulta a visualização. Em ambos os casos, é a enumeração do método Visualização que aciona a solicitação para a exibição no servidor.
antes de (var doc em documentos)
{
Console.WriteLine(doc);
}
Agora, digamos que você tenha um Cerveja em seu aplicativo e você deseja obter instâncias da classe Cervejas quando você itera sobre a exibição.
{
[JsonProperty("name" (nome))]
público string Nome { obter; definir; }
[JsonProperty("abc")]
público flutuante ABV { obter; definir; }
[JsonProperty("brewery_id")]
público string BreweryId { obter; definir; }
[JsonProperty("tipo")]
público string Tipo { obter; definir; }
[JsonProperty("description" (descrição))]
público string Descrição { obter; definir; }
}
A classe Beer usa o Newtonsoft.Json para serializar e desserializar o JSON. A biblioteca do cliente também depende desse conjunto.
Com o novo Cerveja é possível consultar a exibição e informar ao cliente que Cerveja devem ser o item retornado por cada enumeração de uma linha na exibição.
antes de(var cerveja em visualização)
{
Console.WriteLine(cerveja.Nome);
}
Duas alterações importantes a serem observadas no snippet acima. Primeiro, quando Obter visualização é chamado, Cerveja é especificado como o tipo genérico. Em segundo lugar, o terceiro argumento fornecido ao Obter visualização diz ao cliente para Obter o documento original e desserializá-lo em uma instância de T ou, nesse caso, um Cerveja.
No caso em que o valor retornado por uma linha é uma projeção do documento indexado, as exibições fortemente tipadas ainda são possíveis.
se (doc.nome && doc.tipo && doc.tipo == "cerveja") {
emitir(doc.nome, { "nome_da_cerveja" : doc.nome, "beer_style" (estilo de cerveja) : doc.estilo });
}
}
Como a visualização agora inclui o nome e o estilo da cerveja (esse é um uso reconhecidamente artificial de projeções), é possível digitar fortemente os resultados da consulta da visualização - nesse caso, para um BeerProjection classe.
{
[JsonProperty("nome_da_cerveja")]
público string Nome { obter; definir; }
[JsonProperty("beer_style" (estilo de cerveja))]
público string Estilo { obter; definir; }
}
Removendo o argumento booleano do Obter visualização deixa o padrão de false e o cliente tentará desserializar a propriedade value de cada linha de exibição em uma instância de Tou, neste caso, um BeerProjection.
antes de(var cerveja em visualização)
{
Console.WriteLine(cerveja.Nome);
}
Por fim, se você quisesse executar um multi-get genérico e usar suas próprias técnicas de desserialização, poderia fazer algo como o seguinte:
var cervejas = cliente.Obter(visualização.Selecione(v => v.ItemId)).Selecione(d =>
JsonConvert.DeserializeObject<Cerveja>(d.Valor como string)
);
antes de(var cerveja em cervejas)
{
Console.WriteLine(cerveja.Nome);
}
Olá, Jhon,
Este artigo é muito bom. Quero recuperar registros do formulário View passando parâmetros para o método. Estou fazendo RnD sobre isso. Você pode me ajudar com isso?
Agradecemos antecipadamente.
Suraj
Oi Suraj,
Cada um dos métodos GetView tem a capacidade de encadear parâmetros de forma fluente. Em outras palavras:
var view = clien.GetView(\"designdoc\", \"view\").Key(\"foo\").Limit(10);
Mais informações em http://www.couchbase.com/docs/….
Tenho lido sobre esse método GetView e tentado fazê-lo funcionar da mesma forma que o Suraj está fazendo, mas ele nunca funciona para mim.
//-- amostra de documento
{
\"símbolo\": \"HCP\",
\"nome\": \"HCP, Inc.\",
\"setor\": \"Serviços ao consumidor\",
…..
}
//- view
function (doc, meta) {
if (doc.symbol) {
emit([doc.symbol.toLowerCase()], null);
}
}
//-- c#
var view = GetView(\"by_symbol\").Key(symbol.ToLower());
//-- teste de visualização
_view/by_symbol?stale=false&key=%22hcp%22&connection_timeout=60000&limit=10&skip=0
//-- resultado
Não consigo encontrar o símbolo \"hcp\"..... Não tenho a menor ideia do que está acontecendo.
Recebo um erro:
Erro ao converter o valor 1 para o tipo \'Couchbase.IViewRow\'. Caminho \'\', linha 1, posição 1.
Erro
convertendo o valor 1 para o tipo \'Couchbase.IViewRow\'. Caminho \'\', linha 1,
posição 1 - Veja mais em:
http://www.couchbase.com/commu…
Erro
convertendo o valor 1 para o tipo \'Couchbase.IViewRow\'. Caminho \'\', linha 1,
posição 1 - Veja mais em:
http://www.couchbase.com/commu…
Erro
convertendo o valor 1 para o tipo \'Couchbase.IViewRow\'. Caminho \'\', linha 1,
posição 1 - Veja mais em:
http://www.couchbase.com/commu…
Erro
convertendo o valor 1 para o tipo \'Couchbase.IViewRow\'. Caminho \'\', linha 1,
posição 1 - Veja mais em:
http://www.couchbase.com/commu…
http://www.couchbase.com/commu…