Como você provavelmente já sabe, é possível consultar documentos NoSQL do Couchbase usando um dialeto SQL chamado N1QL. Isso é possível por meio de índices que você cria nos documentos em seus Buckets do Couchbase. No entanto, e se eu lhe dissesse que nem toda consulta N1QL exige a existência de um índice? Depois de conversar com meu colega, Justin MichaelsEm sua palestra, ele me mostrou um truque incrível para executar operações em massa no N1QL sem índices. Isso foi novidade para mim, pois sempre achei que era necessário ter pelo menos um índice, mas, enfim, todos os dias aprendemos algo novo.
Veremos como executar algumas consultas N1QL em um arquivo Couchbase Bucket que não tem índices e que não inclui nenhum índice primário.
Antes de entrarmos em alguns cenários de exemplo, você deve estar se perguntando como é possível executar consultas sem um índice. Na verdade, isso é possível com o uso da função USAR CHAVES
para se concentrar em documentos específicos por sua chave existente nas metainformações.
Veja o documento a seguir, por exemplo:
1 2 3 4 5 6 7 8 9 10 |
{ "type": "pessoa", "firstname": "Nic", "Lastname": "Raboy", "social_media": [ { "website": "https://www.thepolyglotdeveloper.com" } ] } |
Acima, temos um documento simples que representa uma pessoa específica. Digamos que o documento acima tenha garoto como o valor de id. Para tornar as coisas interessantes, vamos criar outro documento.
Suponha que haja o seguinte garoto como o valor de identificação:
1 2 3 4 5 6 7 8 9 10 |
{ "type": "pessoa", "firstname": "Maria", "Lastname": "Raboy", "social_media": [ { "website": "https://www.mraboy.com" } ] } |
Portanto, se quisermos consultar qualquer um desses dois documentos com o USAR CHAVES
no N1QL, poderíamos compor uma consulta parecida com a seguinte:
1 2 3 |
SELECT * DE exemplo USE KEYS ["nraboy", "mraboy"]; |
Se você observar o EXPLICAR
da consulta acima, você perceberá que nenhum índice foi usado na consulta. O tipo de consulta acima seria útil se você soubesse as chaves que deseja obter e quisesse um desempenho incrivelmente rápido, semelhante ao que foi feito em um artigo anterior que escrevi intitulado, Obtenção de vários documentos por chave em uma única operação com o Node.js.
Vamos tornar as coisas um pouco mais complicadas. E se quiséssemos fazer uma consulta com um relacionamento em uma ou mais propriedades do documento?
Vamos criar outro documento com couchbase como o ID do documento:
1 2 3 4 5 6 7 8 |
{ "type": "empresa", "nome": "Couchbase Inc", "address": { "cidade": "Mountain View", "state": "CA" } } |
O documento acima representa uma empresa. Como você deve ter adivinhado, vamos consultar as informações da empresa de cada pessoa. Para que isso seja possível, vamos alterar a variável garoto para que o documento se pareça com o seguinte:
1 2 3 4 5 6 7 8 9 10 11 |
{ "type": "pessoa", "firstname": "Nic", "Lastname": "Raboy", "social_media": [ { "website": "https://www.thepolyglotdeveloper.com" } ], "empresa": "couchbase" } |
Observe que adicionamos uma propriedade com a chave do nosso outro documento. Não adicionaremos nenhuma informação da empresa ao documento garoto documento.
Considere a seguinte consulta que tem uma relação de vários documentos, mas nenhum índice criado:
1 2 3 4 5 6 |
SELECIONAR p.firstname, p.lastname, (SELECT c.* FROM example c USE KEYS p.company)[0] AS company DO exemplo p USE KEYS ["nraboy", "mraboy"]; |
Observe que a consulta acima tem uma subconsulta que também usa o USAR CHAVES
operador. Não é ruim, certo? Tente usar outros operadores como INÚTIL
para achatar os dados da matriz encontrados no mídia social
propriedade.
Conclusão
Você acabou de ver como escrever consultas N1QL no Couchbase que não usam índice. Ao usar o USAR CHAVES
operador, podemos fazer operações em massa com base na chave, como demonstrei nos artigos, Obtenção de vários documentos por chave em uma única operação com o Node.js e Uso da Golang para obter vários documentos do Couchbase por chave em uma única operação. Agradeço imensamente a Justin Michaels, do Couchbase, por me ajudar com isso.
Para saber mais sobre o N1QL e o Couchbase, confira o Portal do desenvolvedor do Couchbase para obter mais informações.
Olá, preciso executar uma consulta em vários documentos para compartimentos de dados sem índice.
Entendi que posso usar o operador USE KEYS com uma lista de valores de id
Por exemplo, USE KEYS ['a', 'b']
No meu caso de uso, tenho uma lista de vários IDs de documentos.
É possível escrever uma consulta como USE KEYS ['*all document id'] em vez de especificar todos os valores de id na matriz USE KEYS ['a', 'b', ....., 'n']?
Caso contrário, você poderia sugerir outra maneira de escrever esse tipo de consulta.
Agradecimentos
Se você não quiser usar um índice, terá que especificar todas as chaves. O índice mantém o controle dos documentos, permitindo que você faça essas consultas em todos os IDs de documentos. A ausência de um índice significa que não há nada que mantenha o controle dos documentos, o que o deixa com operações apenas de valor-chave.
Talvez manter um documento mestre que seja apenas uma matriz de IDs de documentos? Então, quando você precisar fazer uma consulta, procure o documento e use as chaves da matriz na instrução USE KEYS?
ok, pode ser uma solução.
Obrigado por sua resposta