Uma das perguntas mais frequentes que recebo quando se trata de NoSQL é sobre o assunto de unir dados de vários documentos em um único resultado de consulta. Embora essa pergunta seja feita com mais frequência por desenvolvedores de RDBMS, também a recebo de desenvolvedores de NoSQL.

Quando se trata de união de dados, cada banco de dados faz isso de forma diferente, sendo que alguns deles exigem que isso seja feito por meio da camada do aplicativo, e não da camada do banco de dados. Vamos explorar algumas opções de união de dados entre tecnologias de banco de dados.

Neste blog, compararemos o processo de união de documentos NoSQL usando o operador $lookup do MongoDB com o processo de união de documentos NoSQL usando o operador $lookup do MongoDB. Couchbasemais intuitiva do N1QL.

Os dados da amostra

Para este exemplo, basearemos o MongoDB e o Couchbase em dois documentos de amostra. Suponhamos que estejamos trabalhando com um exemplo clássico de pedido e estoque. No caso do inventário, nossos documentos podem ser mais ou menos assim:

Embora plano, o documento acima pode explicar adequadamente um produto específico. Ele tem um ID exclusivo que será envolvido durante o processo de união. Para pedidos, podemos ter um documento parecido com o seguinte:

O objetivo aqui será unir esses dois documentos em uma única consulta usando o MongoDB e o Couchbase. No entanto, deixando de lado a linguagem de consulta, esses documentos sempre podem ser unidos por meio da camada de aplicativo por meio de várias consultas. No entanto, esse não é o resultado que estamos buscando.

Unindo documentos com o MongoDB e o operador $lookup

Nas versões recentes do MongoDB, as consultas de união envolvem um $lookup que faz parte das consultas de agregação. De acordo com o MongoDB documentaçãoEsse operador funciona da seguinte forma:

Executa uma união externa esquerda com uma coleção não fragmentada no mesmo banco de dados para filtrar os documentos da coleção "unida" para processamento. O estágio $lookup faz uma correspondência de igualdade entre um campo dos documentos de entrada e um campo dos documentos da coleção "unida".

Para usar o $lookup operador, você teria algo parecido com isto:

Isso é ótimo, mas não funciona em relacionamentos encontrados em matrizes. Isso significa que o $lookup não pode participar da operação product_id encontrado no produtos para outro documento. Em vez disso, a matriz deve ser "desenrolada" ou "aninhada" primeiro, o que acrescenta uma complexidade extra à nossa consulta:

O $unwind achatará a matriz e, em seguida, fará uma junção dos objetos agora achatados que foram produzidos. O resultado dessa consulta teria a seguinte aparência:

Se houvesse mais de uma referência na matriz, haveria mais resultados retornados. No entanto, o que é retornado não é muito atraente. Ainda temos o antigo produtos e agora um objeto productsObject matriz. É necessário realizar outras manipulações no fluxo de dados.

O productsObject A matriz deve ser "desenrolada" e depois reconstruída de acordo com o que desejamos. Isso pode ser feito da seguinte forma:

Observe que o agregado A consulta agora está ficando mais complexa. Depois de fazer a união, o resultado é "desenrolado" e, em seguida, o resultado é reconstruído usando a função Projeto $ operador.

Nesse ponto, outras manipulações do resultado podem ser feitas, como agrupar os resultados de modo que o produtos tornam-se novamente um único array. Cada manipulação do conjunto de dados requer mais código de agregação, que pode facilmente se tornar confuso, complicado e difícil de ler.

É nesse ponto que o Couchbase N1QL se torna muito mais agradável de se trabalhar.

Usando o Couchbase e o N1QL para unir documentos NoSQL

Vamos usar o mesmo exemplo de documento que usamos para o MongoDB. Desta vez, vamos escrever consultas SQL com o N1QL para realizar o trabalho.

A primeira coisa que vem à mente pode ser usar um JUNTAR em SQL. Nossa consulta pode ser semelhante a esta:

No exemplo acima, ambos os documentos existem no mesmo Bucket do Couchbase. A JUNTAR em relação aos ids de documentos ocorre com base no product_id valores encontrados no produtos array. A consulta acima produziria resultados parecidos com os seguintes:

Assim como no MongoDB, haverá um resultado para cada item da tabela produtos que corresponde. Para ser justo, embora a versão N1QL fosse mais fácil de escrever, ela não era necessariamente mais difícil do que a linguagem de consulta do MongoDB nesse ponto. À medida que manipulamos mais os dados, o Couchbase se torna muito mais fácil em comparação.

Por exemplo, digamos que queremos limpar os resultados:

Há algumas diferenças importantes no que estamos fazendo no exemplo acima, mas pequenas diferenças na forma como estamos fazendo. Em vez de unir diretamente a matriz, estamos primeiro achatando ou "aninhando" a matriz, como vimos no MongoDB $unwind operador. A união agora está acontecendo em cada um dos resultados achatados. Por fim, o operador quantidade do objeto original é adicionado ao novo objeto.

O resultado da consulta acima seria algo parecido com isto:

Digamos que o original produtos tinha mais de uma referência de produto. Em vez de retornar vários objetos com base no JUNTAR Como vimos acima, pode fazer sentido reempacotar a matriz original.

Na consulta acima, adicionamos apenas ARRAY_AGG e um GRUPO PORmas, como resultado, cada documento unido aparece no produtos em vez do valor de id.

Não quero usar um JUNTAR operador? Em vez disso, tente usar uma subconsulta SQL.

Conclusão

No NoSQL, a união de dados é uma preocupação muito popular entre os desenvolvedores que são veteranos experientes em RDBMS. Como o MongoDB é uma tecnologia NoSQL muito popular, achei que seria bom usá-lo para comparar como o Couchbase lida com a união de documentos. Para operações leves, $lookup é tolerável, mas à medida que as consultas de união no MongoDB se tornam mais complexas, talvez seja necessário dar um passo atrás. Com o N1QL, escrever consultas complexas que incluem operações de união se torna muito fácil e continua sendo fácil, independentemente da complexidade da consulta.

Para obter mais informações sobre o N1QL e o Couchbase, visite o site Portal do desenvolvedor do Couchbase.

Autor

Postado por Nic Raboy, defensor dos desenvolvedores, Couchbase

Nic Raboy é um defensor das modernas tecnologias de desenvolvimento móvel e da Web. Ele tem experiência em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experiências de desenvolvimento relacionadas a tornar o desenvolvimento móvel e da Web mais fácil de entender.

Deixar uma resposta