No Couchbase 4.0, o N1QL foi introduzido como uma forma de dar aos desenvolvedores mais flexibilidade ao consultar seus dados NoSQL armazenados no Servidor Couchbase. Você poderia executar consultas SQL em dados JSON e tudo seria incrível. No entanto, com o N1QL tão bom quanto ele é, havia recursos que deixavam a desejar. Com o avanço rápido para o Couchbase 5.0, muitos desses recursos agora são realidade. Veja, por exemplo, a capacidade de usar subconsultas em consultas N1QL. Esse recurso já existia, mas o Couchbase Server 5.0 traz expressões de subconsulta, em que as subconsultas podem ser usadas em expressões genéricas.
No momento em que este artigo foi escrito, em janeiro de 2017, o Couchbase 5.0 estava disponível em uma versão para desenvolvedores. Embora os recursos estejam chegando, eles ainda não estão em uma compilação pronta para produção. Mais informações sobre compilações de desenvolvedor podem ser encontradas neste anúncio no blog sobre o assunto.
Vamos dar uma olhada no que significa a subconsulta em um documento aninhado. Para a base deste exemplo, trabalharemos com os dois documentos a seguir:
O documento abaixo terá uma chave de documento de ordem::1 e funciona como um recibo para uma pessoa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "tipo": "ordem", "customerId": "nraboy", "order_number" (número do pedido): "12345", "produtos": [ { "productId": "pokemon-red", "quantidade": 1, "price" (preço): 39.99 }, { "productId": "pokemon-yellow", "quantidade": 1, "price" (preço): 39.99 } ] } |
O documento abaixo terá uma chave de documento de ordem::2 e funcionará como um recibo para uma pessoa diferente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "tipo": "ordem", "customerId": "mgroves", "order_number" (número do pedido): "34532", "produtos": [ { "productId": "pokemon-blue", "quantidade": "1", "price" (preço): 39.99 }, { "productId": "zelda-ocarina-time", "quantidade": 2, "price" (preço): 59.99 } ] } |
O importante a ser observado e a base por trás desse exemplo é o fato de que temos objetos aninhados em uma matriz, o que torna o documento complexo. É essa complexidade que estamos buscando.
Então, digamos que queremos obter o total que cada pessoa gastou em videogames. Normalmente, isso seria feito usando uma subconsulta com alguma função de agregação. O seguinte é possível no Couchbase Server 5.0:
1 2 3 4 |
SELECIONAR customerId, (SELECIONAR RAW SUM(produtos.preço * produtos.quantidade) DE padrão.produtos AS produtos)[0] AS total DE padrão; |
É claro que as subconsultas não se limitam apenas à agregação. Você pode usar em dados aninhados como parte de uma EXISTE
condição, MERGE
ou qualquer outra coisa. Digamos que quiséssemos descobrir se pokemon-azul existe no recibo de qualquer pessoa. Poderíamos fazer algo assim para consultar esses dados:
1 2 3 4 |
SELECIONAR customerId, número do pedido DE padrão ONDE "pokemon-blue" IN (SELECIONAR RAW produtos.productId DE padrão.produtos AS produtos); |
No entanto, só porque você pode usar subconsultas, não significa que deva fazê-lo em todos os cenários, pois há outras maneiras que podem gerar melhor desempenho. Em vez de usar uma subconsulta no exemplo acima, talvez você possa tentar o seguinte:
1 2 3 4 |
SELECIONAR customerId, número do pedido DE padrão ONDE ALGUMAS produto IN padrão.produtos SATISFAÇÕES produto.productId = "pokemon-blue" FIM; |
Ambas as consultas realizam a mesma tarefa, mas uma lhe proporcionará um desempenho melhor do que a outra. O que realmente importa é quais são suas necessidades como resultado e, então, você poderá definir uma consulta que corresponda a elas.
Vamos ver outro exemplo de como as expressões de subconsulta podem funcionar. E se quiséssemos usá-las em um LET
cláusula como a seguinte:
1 2 3 4 5 |
SELECIONAR customerId, SUM(total) DE padrão LET total = (SELECIONAR RAW SUM(produtos.preço * produtos.quantidade) DE padrão.produtos)[0] GRUPO BY customerId; |
Supondo que tivéssemos mais de um documento para um cliente, os totais seriam agregados e veríamos o histórico total de compras para esse cliente específico. Usamos LET
versus LOCAÇÃO
porque queremos que os valores sejam determinados antes de tentar agrupá-los e agregá-los.
Outros cenários em que as expressões de subconsulta podem fazer sentido são MERGE
e LOCAÇÃO
cláusulas.
Para obter mais informações sobre como usar o N1QL com o Couchbase, visite o site Portal do desenvolvedor do Couchbase.