O Couchbase e os vários SDKs de servidor oferecem muitas maneiras diferentes de consultar os dados. Você pode escrever consultas N1QL, consultas de visualização ou até mesmo pesquisar documentos por sua chave. Das três maneiras possíveis de obter dados, fazer pesquisas com base em chaves definidas sempre será mais rápido do que executar uma consulta que use um índice.
O que acontece quando você tem várias chaves de documento e precisa obter todos os documentos correspondentes? A primeira coisa que vem à mente pode ser percorrer essas chaves, realizando uma operação de pesquisa em cada iteração do loop. Isso funciona, mas ao preço de uma nova solicitação de rede por pesquisa. Existe uma maneira melhor? Com certeza!
O que você pode fazer é uma operação em massa no banco de dados. Já vi essa pergunta surgir várias vezes e até mesmo escreveu um tutorial sobre como realizar essa tarefa no Node.js. No entanto, e se você não for um desenvolvedor de JavaScript? Desta vez, veremos como executar uma solicitação em lote usando a linguagem de programação Go.
Veja o aplicativo Golang a seguir, por exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
pacote principal importação ( "fmt" "github.com/couchbase/gocb" ) tipo Pessoa estrutura { Nome próprio string `json:"firstname,omitempty"` Sobrenome string `json:"lastname,omitempty"` Site string `json:"website,omitempty"` Blog string `json:"blog,omitempty"` } var balde *gocb.Balde func principal() { agrupamento, _ := gocb.Conectar("couchbase://localhost") balde, _ = agrupamento.OpenBucket("exemplo", "") var itens []gocb.BulkOp itens = anexar(itens, &lificador;gocb.GetOp{Chave: "nraboy", Valor: &lificador;Pessoa{}}) itens = anexar(itens, &lificador;gocb.GetOp{Chave: "agupta", Valor: &lificador;Pessoa{}}) erro := balde.Fazer(itens) se erro != nulo { fmt.Println("ERRO: ", erro) } para i := 0; i < len(itens); i++ { pessoa, _ := itens[i].(*gocb.GetOp).Valor.(*Pessoa) se *pessoa == (Pessoa{}) { fmt.Printf("`%+v` não existe no banco de dados", itens[i].(*gocb.GetOp).Chave) } mais { fmt.Printf("Key: %+v, Value: %+vn", itens[i].(*gocb.GetOp).Chave, pessoa) } } } |
No aplicativo acima, temos um Pessoa
que representa cada um dos nossos documentos do Couchbase. Depois de estabelecer uma conexão com o cluster do Couchbase e abrir um determinado bucket, criamos uma fatia de operações em massa chamada itens
.
Cada chave que desejamos pesquisar em nossa solicitação será inserida no seguinte itens
e o valor resultante também será armazenado nele.
Usando o Fazer
podemos executar a operação em massa, observando se há erros. Nesse caso, os erros não são chaves ausentes, são erros de execução. Depois de executar a solicitação, podemos fazer um loop em cada item da tabela itens
slice. Se o valor de um item específico for igual ao de uma fatia inicializada, mas vazia Pessoa
significa que a chave não foi encontrada no servidor. Caso contrário, imprimiremos apenas a chave e o documento encontrado.
Se você estiver interessado no tópico de desempenho, Kirk Kirkconnel escreveu uma postagem no blog que explica as diferenças. Ele pode ser encontrado em aqui. Você também pode ler sobre operações em lote na seção Couchbase documentação.