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".

função (doc, meta) {
  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:

var config = novo CouchbaseClientConfiguration();
configuração.Urls.Adicionar(novo Uri("http://localhost:8091/pools"));
configuração.Balde = "amostra de cerveja";            

var cliente = novo Cliente Couchbase(configuração);

Em seguida, consulte a exibição:

var view = cliente.Obter visualização("cerveja", "by_name");
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.

antes de (var row em visualização)
{
    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.

var docs = cliente.Obter(visualização.Selecione(r => r.ItemId));
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. 

público classe Cerveja
{
    [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.

var view = cliente.Obter visualização<Cerveja>("cerveja", "by_name", verdadeiro);

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. 

função (doc, meta) {
  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. 

público classe BeerProjection
{
    [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.

var view = cliente.Obter visualização<BeerProjection>("cerveja", "by_name");

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 view = cliente.Obter visualização("cerveja", "by_name");
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);
}

Autor

Postado por John Zablocki, NET. SDK, Couchbase

John Zablocki é um desenvolvedor NET. SDK Developer na Couchbase. John também é o organizador do Beantown ALT.NET e ex-adjunto da Fairfield University. Você também pode conferir o livro na Amazon chamado "Couchbase Essentials", que explica como instalar e configurar o Couchbase Server.

6 Comentários

  1. 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

    1. 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/….

      1. 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.

        1. //-- 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.

  2. Nguyễn Thanh Sơn julho 23, 2014 em 10:46 am

    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

Deixar uma resposta