Um dos principais recursos introduzidos no Couchbase Lite 2.0é a nova interface de consulta baseada em N1QLa linguagem de consulta declarativa do Couchbase que estende o SQL para JSON. Se você estiver familiarizado com SQL, vai se sentir em casa com a semântica da nova API. Cobrimos os conceitos básicos da interface em um artigo anterior postagem no blog. As matrizes são um componente integral da modelagem de dados com JSON. Nesta postagem do blog, discutiremos a consulta de coleções de matrizes usando a nova API.
Este blog pressupõe que você esteja familiarizado com os fundamentos, portanto, se ainda não o fez, não deixe de revisar o postagem anterior primeiro. A última seção do post lista links para outros blogs de consulta relevantes.
Histórico
Se você estava usando as versões 1.x do Couchbase Mobile, provavelmente está familiarizado com Visualizações de mapas para criar índices e consultas. Na versão 2.0, você não precisa mais criar visualizações e funções de mapa! Em vez disso, uma interface simples permite a criação de índices e você pode usar uma interface do Query Builder para construir suas consultas. A nova interface de consulta é mais simples de usar e muito mais poderosa em comparação. Vamos descobrir alguns de seus recursos nesta postagem.
Projeto de amostra
Embora os exemplos discutidos aqui usem o Swift para iOS, observe que, salvo algumas pequenas diferenças, a mesma interface de consulta também é compatível com as plataformas Android e Windows. Portanto, com alguns pequenos ajustes, você poderá reutilizar os exemplos de consulta desta publicação ao trabalhar com outras plataformas.
Siga as instruções abaixo se você estiver interessado em um projeto Swift de amostra
- Clone o iOS Swift Playground do GitHub
1 |
$ git clone https://github.com/couchbaselabs/couchbase-lite-ios-api-playground |
- Siga as instruções de instalação no manual correspondente LEIAME para criar e executar o playground.
Modelo de dados de amostra
Usaremos o banco de dados Travel Sample localizado aqui
O conjunto de dados de amostra inclui vários tipos de documentos, conforme identificado pelo tipo
no documento. Vamos nos concentrar em documentos de tipo
"hotel" . O modelo de documento JSON é mostrado abaixo. Para fins de brevidade, omitimos algumas das propriedades do modelo abaixo.
Especificamente, observe que o modelo inclui coleções aninhadas - public_likes
e revisões
. As consultas nas seções seguintes lidarão com essas coleções aninhadas.
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 |
{ "tipo": "hotel", "name" (nome): "Albergue da Juventude de Medway", "endereço": "Capstone Road, ME7 3JE", "cidade": "Medway", "país": "Reino Unido", "description" (descrição): "blah blah", "public_likes": [ "Julius Tromp I", "Corrine Hilll" ], "avaliações": [ { "autor": "Ozella Sipes", "content" (conteúdo): "blah blah"., "data": "2013-06-22 18:33:50 +0300", "classificações": { "Limpeza": 5, "Localização": 4, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } }, { "autor": "Jeremy Snapes", "content" (conteúdo): "blah blah"., "data": "2013-05-05 18:33:50 +0300", "classificações": { "Limpeza": 2, "Localização": 2, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } } ], "url":"http://www.yha.org.uk", "vaga": verdadeiro } |
** Consulte o modelo acima para cada um dos exemplos de consulta abaixo. **
O identificador do banco de dados
Nas consultas abaixo, usaremos o Banco de dados
API para abrir/criar o banco de dados CouchbaseLite.
1 2 |
var opções = DatabaseConfiguration() deixar db = tentar Banco de dados(nome: kDBName, configuração: opções) |
Índices
Para acelerar as consultas de leitura, você pode criar índices nas propriedades que serão consultadas. A melhoria no desempenho seria significativa em grandes conjuntos de dados. Obviamente, esteja ciente de que haverá um aumento na necessidade de armazenamento para guardar os índices, e o desempenho das gravações também poderá ser afetado. Portanto, tenha cuidado ao criar muitos índices.
O exemplo a seguir cria um Índice de valor
no tipo
propriedade de um documento
1 |
tentar db.createIndex(IndexBuilder.valueIndex(itens: ValueIndexItem.propriedade("tipo")),withName: "typeIndex") |
O exemplo a seguir cria um Índice de valor
em tipo
e nome
propriedades de um documento
1 |
tentar db.createIndex(IndexBuilder.valueIndex(itens: ValueIndexItem.propriedade("tipo"),ValueIndexItem.propriedade("name" (nome))),withName: "TypeNameIndex") |
Contenção de matrizes
A consulta abaixo busca o IDs, nomes e public_likes propriedades de documentos em que o public_likes
propriedade de matriz em "hotel" tipo
contém o valor de "Corrine Hilll". Para isso, o **ArrayFunction.contains**
é usada na expressão da função public_likes
matriz.
1 2 3 4 5 6 |
deixar pesquisa = ConsultaBuilde.selecionar(SelecionarResultado.expressão(Meta.id), SelecionarResultado.expressão(Expressão.propriedade("name" (nome))), SelecionarResultado.expressão(Expressão.propriedade("public_likes"))) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel")) .e( ArrayFunction.contém(Expressão.propriedade("public_likes"), valor: Expressão.string("Corrine Hilll")))) |
Tamanho da matriz
A consulta abaixo busca o IDs, nomes e as propriedades tamanho de public_likes propriedade de matriz em "hotel" tipo
documentos. Para isso, o **ArrayFunction.length**
é usada na expressão da função public_likes
para obter o tamanho da matriz.
Além disso, observe que estamos usando como
expressão para pseudônimo o valor de contagem da matriz para NumLikes. Nós apresentamos aliases na postagem anterior do blog sobre Fundamentos da consulta. Se você não colocar um alias no resultado do arrayLength
a chave da propriedade seria $1
o que não é muito intuitivo.
1 2 3 4 5 6 |
deixar pesquisa = Criador de consultas.selecionar(SelecionarResultado.expressão(Meta.id), SelecionarResultado.expressão(Expressão.propriedade("name" (nome))), SelecionarResultado.expressão(ArrayFunction.comprimento(Expressão.propriedade("public_likes"))).como("NumLikes")) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel"))) .limite(Expressão.int(limite)) |
Avaliação de membros da matriz
Enquanto o ArrayFunction.contains
permite que você verifique se a matriz dada contém um valor específico, a expressão da função em
pode ser usada para avaliar qualquer um ou todos os membros de uma matriz em relação a um critério especificado pela expressão de matriz satisfaz
expressão. Esse é um recurso avançado de filtragem de documentos.
Oem
é usada com a expressão qualquer
, todos
ou o anyAndEvery
operadores quantificados em Expressão de matriz
para avaliar qualquer, todo ou qualquer/todo elemento no objeto de matriz.
A consulta a seguir retorna os documentos em que qualquer
dos valores no public_likes
O array começa com os caracteres "Corr".
1 2 3 4 5 6 7 8 9 10 11 |
//1. deixar VAR_LIKEDBY = Expressão de matriz.variável("likedby") //2. deixar pesquisa = Criador de consultas.selecionar(SelecionarResultado.expressão(Meta.id), SelecionarResultado.expressão((Expressão.propriedade("public_likes")))) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel")) .e(Expressão de matriz.qualquer(VAR_LIKEDBY).em(Expressão.propriedade("public_likes")) .satisfaz(VAR_LIKEDBY.como(Expressão.string("Cor%"))))) .limite(Expressão.int(limite))<código> |
-
- Declare uma variável com o nome "likedby" para representar cada elemento no
public_likes
matriz - O
qualquer
ArrayExpression verifica se o elemento da matriz representado peloapreciado por
satisfaz os critérios da variávelcomo
expressão. Acomo
verifica se o valor do item representado pela variável "likedby" começa com "Cor".
- Declare uma variável com o nome "likedby" para representar cada elemento no
Matrizes de indexação
Você também pode consultar elementos em índices específicos. A consulta a seguir retorna o nome
e primeiro membro da public_likes
propriedades de matriz de todos os documentos "hotel
1 2 3 4 5 6 |
deixar pesquisa = Criador de consultas.selecionar(SelecionarResultado.expressão(Meta.id), SelecionarResultado.expressão(Expressão.propriedade("name" (nome))), SelecionarResultado.expressão(Expressão.propriedade("public_likes[0]"))) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel"))) .limite(Expressão.int(limite)) |
Avaliação de matrizes aninhadas
Você pode avaliar os membros de uma matriz aninhada. Para isso, você pode aplicar um caminho das teclas
para a expressão da variável. A matriz aninhada deve ter um nível de profundidade.
A consulta a seguir retorna os documentos em que qualquer
dos valores na tabela aninhada classificações
tem a matriz Geral
classificação de propriedade maior ou igual a 4.
Como você deve ter notado no modelo de dados acima, a propriedade "reviews" contém uma matriz de objetos. Cada um dos objetos contém um objeto classificações
que, por sua vez, contém o array Geral
propriedade.
1 2 3 4 5 6 7 8 9 10 11 12 |
// 1. deixar VAR_OVERALL = Expressão de matriz.variável("review.ratings.Overall") //2. deixar VAR_REVIEWS = Expressão de matriz.variável("revisão") //3. deixar pesquisa = Criador de consultas.selecionar(SelecionarResultado.expressão(Meta.id), SelecionarResultado.expressão(Expressão.propriedade("name" (nome)))) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel")) .e(Expressão de matriz.qualquer(VAR_REVIEWS).em(Expressão.propriedade("avaliações")) .satisfaz(VAR_OVERALL.greaterThanOrEqualTo(Expressão.int(4))))) .limite(Expressão.int(limite)) |
- Declare uma variável para representar um elemento no
revisão.classificações.geral
matriz - Declare uma variável para representar cada elemento no
revisões
matriz - O
qualquer
verifica se o elemento da matriz representado pela expressãorevisão
satisfaz os critérios da variávelcomparação
expressão. Acomparação
verifica o valor deGeral
propriedade doclassificações
no objeto representado pela variável "review" é maior ou igual a 4.
Limitações
Os recursos de manipulação de matriz não são tão extensos quanto os do N1QL conjunto de recursos. Mas é um bom ponto de partida. Esses recursos poderão estar disponíveis em versões futuras do Couchbase Mobile.
Portanto, por enquanto, cabe ao aplicativo manipular os resultados da matriz usando os recursos de processamento de coleção da linguagem.
Vamos considerar este exemplo em swift
- Com relação ao modelo de dados, digamos que você queira determinar o mínimo
Limpeza
classificação para um determinado hotel com base nas avaliações sobre o hotel.
Com base no modelo acima, observe que o Limpeza
é um membro da propriedade classificações
contida em cada objeto que é membro de revisões
matriz.

Para isso, você pode fazer uma consulta do Couchbase Lite para buscar o revisões
propriedade de matriz para um hotel com Id especificado da seguinte forma -
1 2 3 4 5 6 |
// 1. consulta ao conjunto de propriedades de avaliações para o hotel fornecido deixar pesquisa = Criador de consultas.selecionar( SelecionarResultado.expressão(Expressão.propriedade("avaliações"))) .de(Fonte de dados.banco de dados(db)) .onde(Expressão.propriedade("tipo").igual a(Expressão.string("hotel")) .e(Meta.id.igual a(Expressão.string("hotel_10025")))) |
O resultSet
A resposta à consulta acima seria uma matriz com um único elemento. Esse elemento corresponderia ao documento "hotel" para o Id especificado.
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 |
[ { "avaliações": [ { "autor": "Ozella Sipes", "content" (conteúdo): "blah", "data": "2013-06-22 18:33:50 +0300", "classificações": { "Limpeza": 5, "Localização": 4, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } }, { "autor": "fuzzy Snipes", "content" (conteúdo): "blah", "data": "2013-06-22 18:33:50 +0300", "classificações": { "Limpeza": 2, "Localização": 3, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } } ] } ] |
Agora, o aplicativo precisa implementar a lógica para iterar sobre o revisões
e para cada membro da matriz, para buscar o classificações
e a propriedade Limpeza
valor.
Aqui está uma maneira possível de fazer isso no swift.
- Primeiro, itere sobre o resultSet e extraia o valor da propriedade "reviews".
1 2 3 4 5 6 7 8 |
var jogos:[[Cordas:Qualquer]] = [[Cordas:Qualquer]]() fazer { para fila em tentar pesquisa.executar() { se deixar reviewData = fila.matriz(forKey: "avaliações")?.toArray() como? [[Cordas:Qualquer]] { jogos.anexar(reviewData) } } } |
Após o processamento do loop, a matriz "matches" seria algo parecido com o que está abaixo. Seria uma matriz contendo a matriz aninhada correspondente às revisões -
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 |
[ [ { "autor": "Ozella Sipes", "content" (conteúdo): "blah", "data": "2013-06-22 18:33:50 +0300", "classificações": { "Limpeza": 5, "Localização": 4, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } }, { "autor": "fuzzy Snipes", "content" (conteúdo): "blah", "data": "2013-06-22 18:33:50 +0300", "classificações": { "Limpeza": 2, "Localização": 3, "Geral": 4, "Quartos": 3, "Serviço": 5, "Valor": 4 } } ] ] |
- Em seguida, você pode usar os recursos da linguagem swift, como
flatMap
emapa
para processar a matriz resultante e obter a classificação mínima de "Limpeza" para um determinado hotel
1 2 3 4 5 6 |
deixar minCleanlinessValue (valor mínimo de limpeza) = jogos.flatMap{$0} .mapa{retorno ($0["classificações"] como? [Cordas:Qualquer])?["Limpeza"] como? Int} .flatMap{$0} .min { (a, b) -> Bool em retorno a < b } |
Você faria algo semelhante em linguagens que suportam construções funcionais como mapa plano
e mapa
.
O que vem a seguir
Esta postagem do blog analisou como você pode manipular os tipos de coleção Array usando a nova API de consulta no Couchbase Mobile 2.0. Isso é um começo. Espere ver mais funcionalidades em versões futuras. Você pode fazer o download da versão de pré-lançamento em nosso downloads página.
Aqui estão outras postagens relacionadas ao Couchbase Mobile Query que podem ser de interesse
- Isso postagem no blog discute os fundamentos da API de consulta
- Isso postagem no blog discute os recursos de pesquisa de texto completo.
- Isso postagem no blog discute como fazer consultas JOIN
Se tiver dúvidas ou comentários, deixe um comentário abaixo ou entre em contato comigo pelo Twitter @rajagp ou envie-me um e-mail priya.rajagopal@couchbase.com. O Fóruns do Couchbase são outro bom lugar para entrar em contato com perguntas.