A consulta e a indexação de arrays de documentos é um dos recursos mais avançados do Couchbase. Encontrar entradas de matriz dentro de um intervalo de datas específico é um requisito comum. Considere o seguinte caso de uso.
História do usuário: "Quero indexar uma matriz de histórico de contas incorporada em documentos no meu banco de dados para que eu possa realizar uma consulta de intervalo para entradas de matriz em um intervalo de datas específico."
Considere a seguinte estrutura json:
|
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 41 42 43 |
{ "name" (nome):"", "nome de usuário":"", "email":"", "endereço":{ "streetA":"", "streetC":"", "streetD":"", "cidade":"", "estado":"", "país":"", "zipcode" (código postal):"" "geo": { "lat":"", "lng":"" } }, "telefone":"", "website":"", "empresa": { "name" (nome):"", "catchPhrase":"", "bs":"" }, "posts": [ { "palavras":"", "sentença":"", "frases":"", "parágrafo":"" },... ], "accountHistory" (histórico da conta): [ { "amount" (valor):"", "data":"", "negócios":"", "name" (nome):"", "tipo":"", "account" (conta):"" },... ] } |
Tenho uma matriz chamada accountHistory que pode incluir um número 0-N de entradas. Se eu quiser consultar um determinado intervalo de datas, posso fazer isso facilmente definindo um índice secundário no campo data campo.
|
1 2 |
CRIAR ÍNDICE intervalo de datas ON padrão(DISTINTO ARRAY v.data PARA v IN accountHistory FIM) |
Criei uma entrada de índice exclusiva usando DISTINTO para cada data em cada registro accountHistory. Isso significa que todos os documentos no cluster que têm uma matriz de accountHistory serão incluídas em meu índice, desde que a entrada accountHistory tenha um campo chamado "data". É possível que eu tenha vários tipos de itens na matriz accountHistory e só quero que os itens que tenham um campo de data sejam incluídos. Se não houver um campo de data, o indexador não incluirá essa entrada no índice. Agora posso incluir intervalos de datas em meu predicado de consulta:
|
1 2 3 4 |
SELECIONAR padrão.e-mail, v.conta, v.tipo, v.quantidade, v.nome, v.e-mail DE padrão INÚTIL accountHistory v ONDE v.data ENTRE '2016-02-01T00:00:00.000Z' E '2017-06-01T00:00:00.000Z' |
Usei um dos meus outros recursos favoritos do N1QL na consulta: INÚTIL. Isso me permite moldar o JSON e incluir campos de nível de documento raiz em meus resultados. Na minha consulta, cada entrada retornada incluirá as informações do histórico da conta que estão dentro do intervalo de datas do meu predicado. Também quero que o endereço de e-mail do documento de onde ele veio também seja incluído, e não quero ter que escrever uma lógica adicional de análise de JSON para descascar isso em meu aplicativo. Esse é o poder de usar unnest. A consulta retorna o seguinte:
|
1 2 3 4 5 6 7 8 9 |
"resultados": [ { "account" (conta): "68475391", "amount" (valor): "416.37", "data": "2016-02-01T00:00:00.000Z", "email": "Emmanuel.Labadie72@gmail.com", "name" (nome): "Conta de cartão de crédito 0008", "tipo": "fatura" },... |
Experimente: O Docker é minha maneira favorita de criar um ambiente de desenvolvimento. Um repositório fácil de usar para os exemplos acima está no github: n1ql-query-nodejs . Ele usa o docker-compose para criar dois serviços:
- Um serviço de cluster do Couchbase de nó único.
- Um serviço nodejs para provisionar o cluster do Couchbase com 250.000 perfis de usuário e índices para vários exemplos, incluindo consultas de intervalo de datas para matrizes de documentos.