O Couchbase.NET SDK v2.2.7 com visualização para desenvolvedores do gerenciamento de índices já está disponível!
Hoje estamos lançando a versão 2.2.7 do SDK oficial do Couchbase .NET! Essa versão contém suporte para o gerenciamento de índices e adiciona a API de subdocumentos, que foi lançada como uma prévia para desenvolvedores na versão 2.2.6, bem como uma correção de bugs e melhorias no suporte futuro do .NET Core.
Gerenciamento de índices
Os índices secundários globais (GSIs) são uma parte importante da arquitetura de consulta N1QL no servidor Couchbase, permitindo consultas rápidas e de baixa latência. Você pode colocar índices em elementos JSON, expressões N1QL e usar filtros por meio de uma cláusula WHERE. Para a versão 2.2.7 do SDK do .NET, criamos uma abstração sobre o serviço de indexação do Couchbase Server que facilita muito a criação de índices primários e secundários. Essa abstração estende e amplia a classe BucketManager, que inclui suporte para a criação e o gerenciamento de Buckets do Couchbase.
|
1 2 3 4 5 6 7 8 9 10 |
var configuration = new ClientConfiguration(); using (var cluster = new Cluster(configuration)) { using (var bucket = cluster.OpenBucket("beer-sample")) { var manager = bucket.CreateManager("Administrator", ""); } } |
O BucketManager é criado abrindo um objeto Bucket em uma instância do Cluster e passando a configuração correta para o seu ambiente.
Criação e eliminação de índices primários
Você pode criar índices primários nomeados e não nomeados chamando o método CreatePrimaryIndex e CreateNamedPrimaryIndex depois de ter a instância do BucketManager:
|
1 2 3 4 5 6 |
//create an unamed primary index on the bucket var result = manager.CreatePrimaryIndex(false); //create a named primary index called "myprimaryindex" on the bucket var result = manager.CreateNamedPrimaryIndex("myprimaryindex", false); |
Observe que você está sempre trabalhando com o contexto do bucket que abriu. Portanto, esses índices serão criados no bucket "beer-sample" que abrimos anteriormente. Além disso, observe que esses dois métodos usam um campo booleano chamado "defer"; na verdade, como você verá, todos os métodos de criação contêm um parâmetro "defer". Se "defer" for verdadeiro, o índice será criado, mas não será construído até que o método BuildDeferredIndexes seja chamado. Mais informações sobre os índices diferidos mais adiante!
Eliminar um índice primário nomeado ou não nomeado é praticamente o mesmo que criar um índice, com exceção dos nomes dos métodos:
|
1 2 3 4 5 6 |
//drop the primary index for the bucket var result = manager.DropPrimaryIndex(); //drop a named primary index on the bucket var result = manager.DropNamedPrimaryIndex("myprimaryindex"); |
Observe que, se o índice não existir, result.Success será falso.
Criação e eliminação de índices secundários
A criação e o descarte de índices secundários são semelhantes aos índices primários, exceto pelo fato de que você também pode indexar em um ou mais campos.
|
1 2 3 4 5 6 |
//create a secondary index called "myindex" on the "id" and "name" fields. var result = manager.CreateIndex("myindex", true, "id", "name"); //drop the index called "myindex" var result = manager.DropIndex("myindex"); |
Observe que, nesse caso, estou passando "true" para que a criação do índice seja adiada. Além disso, se o índice já existir ou se ele não existir e você tentar removê-lo, result.Success será falso.
Atualizações na API do subdocumento
Esta versão também contém alterações internas na API SubDocument lançada como Developer Preview na versão 2.2.6. Foram adicionados dois grandes aprimoramentos relacionados ao desempenho:
- Se uma única mutação ou operação de pesquisa for executada, o SDK usará uma única operação, em vez de uma operação múltipla que economiza alguns bytes na conexão.
- A desserialização do corpo da resposta é adiada até que você chame o Content
Expressões Lambda para navegação no caminho do subdocumento
Além dessas alterações, outro novo recurso foi incluído na versão por meio de uma contribuição do comunidade: Navegação de expressão lambda para caminhos de subdocumentos. Esse recurso permite que você use a sintaxe familiar com suporte ao intellisense e à segurança de tipos que você aprecia no linq, em vez de apenas passar caminhos de string.
Supondo um documento que se pareça com:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "name": "21st Amendment Brewery Cafe", "city": "San Francisco", "state": "California", "code": "94107", "country": "United States", "phone": "1-415-369-0900", "website": "https://www.21st-amendment.com/", "type": "brewery", "updated": "2010-10-24 13:54:07", "description": "The 21st Amendment Brewery offers a variety of award winning house made brews and American grilled cuisine in a comfortable loft like setting. Join us before and after Giants baseball games in our outdoor beer garden. A great location for functions and parties in our semi-private Brewers Loft. See you soon at the 21A!", "address": [ "563 Second Street" ], "geo": { "accuracy": "ROOFTOP", "lat": 37.7825, "lon": -122.393 } } |
Em seguida, você recupera o valor no caminho "geo.accuracy" da seguinte forma:
|
1 2 3 4 5 6 7 8 |
var key = "21st_amendment_brewery_cafe"; var lookup = bucket.LookupIn(key). Get(x => x.Geo.Accuracy). Execute(); var value = lookup.Content(x=>x.Geo.Accuracy); Assert.AreEqual("ROOFTOP", value); |
É claro que você poderia encadear vários "Gets" para recuperar cada elemento individual do documento.
Notas de versão da v2.2.7
Bug
- [NCBC-1099] - Adicionar atributo DataContract às classes Error, Warning e Metrics
Melhoria
- [NCBC-1103] - Suporte para operações assíncronas em subdocumentos
- [NCBC-994] - Atualizar o ambiente de desenvolvimento e os projetos para o VS2015
- [NCBC-1089] - Aguardar todos os caminhos de código não bem-sucedidos
- [NCBC-1095] - Não tentar novamente com NodeUnavailableException
Novo recurso
- [NCBC-1067] - Estender o BucketManager para oferecer suporte ao gerenciamento de índices
- [NCBC-1093] - Incluir suporte para a API de subdocumentos - Comandos únicos da Parte 2 DP2