Uma pergunta comum que é feita na Fóruns do Couchbase e no Stack Overflow é como
excluir todos os registros de um bucket que tenham uma chave que comece com algum valor. Em outras palavras, como excluir todos os registros que compartilham uma chave
chave composta específica. A solução simples é criar uma exibição do Couchbase e executar uma consulta de intervalo.
Você pode executar consultas de intervalo com todos os SDKs do Couchbase, mas, neste exemplo específico, veremos como fazer isso com o Node.js.
Os pré-requisitos
Antes de tentar fazer o que se segue, você deve ter os seguintes itens instalados e configurados:
- Node.js e NPM (Node Package Manager) instalados
- Couchbase 3.0+
Nossos dados de amostra
No restante deste exemplo, usaremos alguns documentos de amostra em um bucket que chamarei de balde de teste.
Os documentos em nosso bucket terão os seguintes nomes de chave:
- usuário::nraboy
- usuário::mingenthron
- usuário::blawson
- produto::1
- produto::2
- produto::3
O conteúdo desses documentos não é realmente importante para este exemplo. O que importa é o prefixo que escolhi usar para cada um dos documentos
dois tipos de documentos. Eu optei por usar usuário:: para representar documentos do usuário e produto:: para representar
documentos do produto. As chaves completas representam chaves compostas.
Criando nossa visualização do Couchbase
Temos muitos documentos (não realmente) em nosso bucket do Couchbase. É provável que não consigamos nos lembrar de todas as chaves para fazer um cálculo direto de valor-chave
pesquisas. Por esse motivo, precisaremos criar um Couchbase View.
Você pode criar visualizações do Couchbase por meio de código, mas, para este exemplo específico, vamos criar uma por meio do Couchbase Dashboard. Sinal
no painel do Couchbase e clique no botão Visualizações e selecione a guia balde de teste que você criou anteriormente.
Escolha criar uma nova visualização de desenvolvimento e chame o documento de design _design/dev_docs com um nome de exibição de
by_id. O código da visualização padrão deve estar bom, mas, caso não esteja, você deve se certificar de que a visualização se pareça com o código
seguintes:
1 2 3 4 5 |
função (doc, meta) { emitir(meta.id, nulo); } |
Essa exibição emitirá todos os documentos e a chave será cada um dos IDs dos documentos.
Nosso aplicativo Node.js
Neste ponto, vamos criar um novo aplicativo Node.js para facilitar a compreensão das coisas.
Preparação do projeto
Usando o Terminal (Mac/Linux) ou o Prompt de Comando (Windows), execute o seguinte comando:
1 2 3 |
npm inicial |
Responda a todas as perguntas e estará tudo certo. Você também pode simplesmente criar seu NPM package.json do zero e o arquivo
adicione o seguinte conteúdo:
1 2 3 4 5 6 7 8 9 |
{ "name" (nome): "mass-delete-nodejs", "versão": "1.0.0", "description" (descrição): "Excluir todos os documentos prefixados com um valor específico", "autor": "Couchbase, Inc.", "licença": "MIT" } |
Ainda não terminamos. Precisamos instalar as dependências do projeto antes de começarmos a planejar isso
aplicativo. No prompt de comando ou no terminal, execute o seguinte comando:
1 2 3 |
npm instalar couchbase expresso --salvar |
Isso instalará o Express Framework e o SDK do Couchbase Node.js.
O código que importa
Se você ainda não o fez, crie um app.js que fica ao lado de seu arquivo package.json em seu projeto.
O conteúdo desse arquivo deve ser o seguinte:
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 |
var expresso = exigir("expresso"); var couchbase = exigir("couchbase"); var aplicativo = expresso(); var balde = (novo couchbase.Aglomerado("http://127.0.0.1:8091")).openBucket("testbucket"); var Consulta = couchbase.Consulta; var consulta = Consulta.de('docs', 'by_id'); consulta.alcance("user::", "user::" + "u02ad", falso); balde.consulta(consulta, função(erro, resultados) { se(erro) { retorno console.registro(erro); } console.registro("Encontrado" + resultados.comprimento + " documentos a serem excluídos"); para(i em resultados) { balde.remover(resultados[i].id, função(erro, resultado) { console.registro("Deletar" + resultados[i].chave); }); } }); var servidor = aplicativo.ouvir(3000, função () { console.registro("Escutando na porta %s...", servidor.endereço().porto); }); |
Há muita coisa acontecendo aqui, por isso vou detalhá-la.
1 2 3 4 5 |
var expresso = exigir("expresso"); var couchbase = exigir("couchbase"); var aplicativo = expresso(); |
Não há muito com o que se preocupar acima. Estamos apenas incluindo o Couchbase SDK e o Express Framework para uso em nosso aplicativo. No entanto, abaixo
você verá que estamos nos conectando ao nosso cluster e abrindo um determinado bucket:
1 2 3 |
var balde = (novo couchbase.Aglomerado("http://127.0.0.1:8091")).openBucket("testbucket"); |
Estamos nos conectando a uma instância do Couchbase hospedada localmente e abrindo nosso balde de teste mencionado anteriormente.
Agora vamos dar uma olhada em algo fantástico!
1 2 3 4 5 6 |
var Consulta = couchbase.Consulta; var consulta = Consulta.de('docs', 'by_id'); consulta.alcance("user::", "user::" + "u02ad", falso); |
Estamos preparando um objeto ViewQuery de nosso _design/dev_docs documento de design e by_id visualizar. Para consultar apenas
para documentos específicos, usaremos o que é chamado de consulta de intervalo. Já sabemos que nossa visualização está retornando documentos com o
id do documento como o valor da chave. Isso significa que, com uma consulta de intervalo, podemos determinar quais chaves queremos receber.
Na consulta de intervalo, a chave de início será usuário:: porque queremos excluir todos os documentos do usuário. A tecla end também
conter usuário::mas têm o caractere unicode u02ad anexado a ele. Isso capturará tudo
prefixado com o que estamos procurando. Mais informações sobre esse tipo de consulta de intervalo podem ser vistas na seção
Documentação oficial do Couchbase.
Por fim, executamos essa consulta e capturamos os resultados. Os resultados são percorridos em loop e excluímos cada registro, um a um, conforme mostrado
no seguinte:
1 2 3 4 5 6 7 |
para(i em resultados) { balde.remover(resultados[i].id, função(erro, resultado) { console.registro("Deletar" + resultados[i].chave); }); } |
Toda exclusão emitida no Node.js será sem bloqueio para que a camada do aplicativo não trave. Quando uma solicitação de exclusão chega ao Couchbase Server,
o documento é marcado para exclusão e, posteriormente, é excluído quando ocorre a compactação.
1 2 3 |
nó aplicativo.js |
Execute a linha acima para ver esse projeto em ação.
Conclusão
Usando consultas de intervalo, você pode consultar determinados documentos em uma exibição e, em seguida, optar por excluí-los. Os documentos específicos neste exemplo
tinha chaves compostas prefixadas com usuário:: na chave.
Isso também pode ser feito com o servidor Couchbase 2.5 e o cliente java 1.4?
Sim, esse conceito também deve funcionar nesse caso, a visualização deve ser a mesma, mas o código Java será obviamente diferente do anterior.
Outra opção que sempre recomendo às pessoas, dependendo da rapidez com que precisam excluir coisas e da carga que podem colocar em seu cluster do Couchbase, é, em vez de excluir o objeto diretamente, colocar um TTL aleatório em cada um dos objetos entre agora e daqui a X dias. Assim, o cluster do Couchbase se encarregará de excluir o objeto do bucket quando o TTL expirar, diminuindo a carga no cluster.