{"id":4187,"date":"2017-11-14T11:00:49","date_gmt":"2017-11-14T19:00:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4187"},"modified":"2025-06-13T20:28:08","modified_gmt":"2025-06-14T03:28:08","slug":"sql-for-json-query-interface-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/sql-for-json-query-interface-couchbase-mobile\/","title":{"rendered":"Apresentando a interface de consulta no Couchbase Mobile 2.0"},"content":{"rendered":"<p>A vers\u00e3o 2.0 do Couchbase Lite traz uma infinidade de <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">Novos recursos e aprimoramentos<\/a>. Discutimos um desses aprimoramentos, ou seja, o novo protocolo de replica\u00e7\u00e3o entre em um artigo anterior <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/data-replication-couchbase-mobile\/\">postagem no blog sobre Replica\u00e7\u00e3o 2.0<\/a>. Nesta postagem do blog, apresentaremos a voc\u00ea outro recurso importante: a interface de consulta do Couchbase Lite. A nova interface de consulta \u00e9 baseada em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/n1ql\/\">N1QL<\/a>a linguagem de consulta declarativa do Couchbase que estende o SQL para JSON. Se voc\u00ea estiver familiarizado com SQL, vai se sentir em casa com a sem\u00e2ntica da nova API.<\/p>\n<p>Esta publica\u00e7\u00e3o apresenta a interface de consulta e aborda os conceitos b\u00e1sicos. Consulte a \u00faltima se\u00e7\u00e3o desta postagem para obter detalhes sobre outras postagens de blog relacionadas a recursos de consulta mais avan\u00e7ados.<\/p>\n<p>Voc\u00ea pode fazer o download das compila\u00e7\u00f5es de pr\u00e9-lan\u00e7amento do Couchbase Mobile 2.0 em nosso <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">downloads<\/a> p\u00e1gina.<\/p>\n<p><!--more--><\/p>\n<h3 id=\"background\">Hist\u00f3rico<\/h3>\n<p>Se voc\u00ea estava usando as vers\u00f5es 1.x do Couchbase Mobile, provavelmente est\u00e1 familiarizado <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/training\/develop\/using-the-database\/index.html#query-documents\">Visualiza\u00e7\u00f5es de mapas<\/a> para criar \u00edndices e consultas. Na vers\u00e3o 2.0, voc\u00ea n\u00e3o precisa mais criar visualiza\u00e7\u00f5es e fun\u00e7\u00f5es de mapa! Em vez disso, uma interface simples permite a cria\u00e7\u00e3o de \u00edndices e voc\u00ea pode usar uma interface do Query Builder para construir suas consultas. A nova interface de consulta \u00e9 mais simples de usar e muito mais poderosa em compara\u00e7\u00e3o. Vamos descobrir alguns de seus recursos nesta postagem.<\/p>\n<h3 id=\"sampleproject\">Projeto de amostra<\/h3>\n<p>Embora os exemplos discutidos aqui usem o Swift para iOS, observe que, salvo algumas pequenas diferen\u00e7as, a mesma interface de consulta tamb\u00e9m \u00e9 compat\u00edvel com as plataformas Android e Windows. Portanto, com alguns pequenos ajustes, voc\u00ea poder\u00e1 reutilizar os exemplos desta publica\u00e7\u00e3o ao trabalhar com outras plataformas.<\/p>\n<p>Siga as instru\u00e7\u00f5es abaixo se voc\u00ea estiver interessado em um projeto Swift de amostra<\/p>\n<ul>\n<li>Clone o iOS Swift Playground do GitHub\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground<\/code><\/pre>\n<\/li>\n<li>Siga as instru\u00e7\u00f5es de instala\u00e7\u00e3o no manual correspondente <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-a_pi-playground\/blob\/master\/README.md\">LEIAME<\/a> para criar e executar o playground.<\/li>\n<\/ul>\n<h3 id=\"sampledatamodel\">Modelo de dados de amostra<\/h3>\n<p>Usaremos o banco de dados Travel Sample localizado <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground\/tree\/master\/travel-sample.cblite2\">aqui<\/a><\/p>\n<p>O conjunto de dados de amostra inclui v\u00e1rios tipos de documentos, conforme identificado pelo <code>tipo<\/code> no documento. Vamos nos concentrar em documentos de <code>tipo<\/code> <em>\"hotel\"<\/em> e <em>\"marco\"<\/em>. O modelo de documento JSON \u00e9 mostrado abaixo. Para simplificar, omitimos algumas das propriedades do modelo abaixo.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/12\/data_model-2.png\" alt=\"\" \/><\/figure>\n<h3 id=\"thebasics\">O b\u00e1sico<\/h3>\n<h4 id=\"openingcreatingadatabase\">Abertura\/cria\u00e7\u00e3o de um banco de dados<\/h4>\n<p>Para todas as consultas abaixo, usaremos o <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/guides\/couchbase-lite\/native-api\/database\/index.html\"><code>Banco de dados<\/code><\/a> API para abrir\/criar o banco de dados CouchbaseLite.<\/p>\n<pre><code class=\"swift\">  var options =  DatabaseConfiguration()\r\n  let db = try Database(name: kDBName, config: options)<\/code><\/pre>\n<h4 id=\"indexes\">\u00cdndices<\/h4>\n<p>Para acelerar as consultas de leitura, voc\u00ea pode criar \u00edndices nas propriedades que ser\u00e3o consultadas. A melhoria no desempenho seria significativa em grandes conjuntos de dados. Obviamente, esteja ciente de que haver\u00e1 um aumento na necessidade de armazenamento para guardar os \u00edndices, e o desempenho das grava\u00e7\u00f5es tamb\u00e9m poder\u00e1 ser afetado. Portanto, tenha cuidado ao criar muitos \u00edndices.<\/p>\n<p>O exemplo a seguir cria um <code>\u00cdndice de valor<\/code> no <code>tipo<\/code> propriedade de um documento<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">    try db.createIndex(IndexBuilder.valueIndex(items: ValueIndexItem.property(\"type\")),withName: \"typeIndex\")<\/pre>\n<p>O exemplo a seguir cria um <code>\u00cdndice de valor<\/code> em <code>tipo<\/code> e <code>nome<\/code> propriedades de um documento<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">try db.createIndex(IndexBuilder.valueIndex(items: ValueIndexItem.property(\"type\"),ValueIndexItem.property(\"name\")),withName: \"TypeNameIndex\")<\/pre>\n<h4 id=\"fetchingdocumentsfromdatabase\">Obten\u00e7\u00e3o de documentos do banco de dados<\/h4>\n<p>Uma consulta no Couchbase Lite \u00e9 constru\u00edda usando a API do construtor de consultas.<\/p>\n<p>A consulta abaixo obt\u00e9m todos os documentos do banco de dados especificado. Para cada documento que corresponda \u00e0 consulta, todas as propriedades associadas ao documento s\u00e3o obtidas.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.all())\r\n        .from(DataSource.database(db))<\/pre>\n<h4 id=\"fetchingdocumentsfromdatabasewithpagination\">Obten\u00e7\u00e3o de documentos do banco de dados com pagina\u00e7\u00e3o<\/h4>\n<p>Esta \u00e9 a estrutura de uma consulta simples que busca <code>limite<\/code> n\u00famero de documentos do banco de dados a partir do n\u00famero especificado <code>compensa\u00e7\u00e3o<\/code>. Para cada documento que corresponda \u00e0 consulta, todas as propriedades associadas ao documento s\u00e3o obtidas.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n        .select(SelectResult.all())\r\n        .from(DataSource.database(db))\r\n        .limit(Expression.int(limit),offset: Expression.int(offset))<\/pre>\n<h3 id=\"returnvaluesusingselectresult\">Valores de retorno usando SelectResult<\/h3>\n<p>A <code>SelecionarResultado<\/code> representa um \u00fanico valor de retorno da instru\u00e7\u00e3o de consulta. Os documentos no Couchbase Lite s\u00e3o compostos pelas propriedades do documento especificadas como um dicion\u00e1rio de pares chave-valor e metadados associados. Os metadados consistem no ID do documento e no ID da sequ\u00eancia associados ao documento. Quando voc\u00ea consulta um documento, os metadados do documento n\u00e3o s\u00e3o retornados por padr\u00e3o. Voc\u00ea precisar\u00e1 consultar explicitamente os metadados.<\/p>\n<ul>\n<li><code>SelectResult.all()<\/code>\n<ul>\n<li>Retorna todas as propriedades associadas a um documento<\/li>\n<\/ul>\n<\/li>\n<li><code>SelectResult(Express\u00e3o)<\/code>\n<ul>\n<li>Retorna as propriedades de um documento com base no <code>Express\u00e3o<\/code>. Discutiremos os v\u00e1rios tipos de express\u00f5es um pouco mais adiante.<\/li>\n<\/ul>\n<\/li>\n<li><code>SelectResult.expression(Expression.Meta.id)<\/code>\n<ul>\n<li>Retorna o ID do documento<\/li>\n<\/ul>\n<\/li>\n<li><code>SelectResult.expression(Expression.Meta.sequence)<\/code>\n<ul>\n<li>Retorna o ID da sequ\u00eancia (usado em replica\u00e7\u00f5es)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voc\u00ea pode especificar uma lista separada por v\u00edrgulas de <code>SelecionarResultado<\/code> express\u00f5es no <code>selecionar<\/code> declara\u00e7\u00e3o de sua consulta.<br \/>\nPor exemplo, o seguinte comando select consulta o ID do documento, bem como o <code>tipo<\/code> e <code>nome<\/code> propriedades do documento<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">select(SelectResult.expression(Expression.Meta.id),\r\n                SelectResult.expression(Expression.property(\"type\")),\r\n                SelectResult.expression(Expression.property(\"name\")))<\/pre>\n<h3 id=\"queryexpression\">Express\u00e3o de consulta<\/h3>\n<p>Uma express\u00e3o de consulta \u00e9 usada para criar uma declara\u00e7\u00e3o de consulta<\/p>\n<p>O Couchbase Lite inclui suporte para o seguinte <code>Express\u00e3o<\/code> Tipos.<\/p>\n<ul>\n<li>Propriedade<\/li>\n<li>Agregado<\/li>\n<li>Cordas<\/li>\n<li>Coleta<\/li>\n<li>Regex<\/li>\n<li>FTS<\/li>\n<li>Operador de verifica\u00e7\u00e3o de nulidade<\/li>\n<li>Express\u00f5es aritm\u00e9ticas<\/li>\n<li>Metadados<\/li>\n<li>Correspond\u00eancia de padr\u00f5es<\/li>\n<li>Compara\u00e7\u00e3o<\/li>\n<li>Cole\u00e7\u00e3o<\/li>\n<li>Fun\u00e7\u00e3o<\/li>\n<li>Par\u00e2metro<\/li>\n<li>Quantificado<\/li>\n<li>Operador bit a bit<\/li>\n<\/ul>\n<h3 id=\"processingqueryresponses\">Processamento de respostas de consulta<\/h3>\n<p>O resultado da execu\u00e7\u00e3o da consulta \u00e9 uma matriz em que cada membro da matriz \u00e9 um Dictionary\/Map correspondente a um documento que satisfaz a consulta.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">select(SelectResult.expression(Expression.Meta.id),\r\n                SelectResult.expression(Expression.property(\"type\")),\r\n                SelectResult.expression(Expression.property(\"name\")))<\/pre>\n<ul>\n<li>Se voc\u00ea estiver consultando todas as propriedades do documento usando <code>SelectResult.all()<\/code>cada membro da matriz de resposta \u00e9 um par de chave-valor, em que o nome do banco de dados \u00e9 a chave e o dicion\u00e1rio correspondente ao documento \u00e9 o valor da chave.<\/li>\n<\/ul>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n        .select(SelectResult.all())\r\n        .from(DataSource.database(db))\r\n        .limit(Expression.int(limit),offset: Expression.int(offset))<\/pre>\n<ul>\n<li>Os resultados seriam mais ou menos assim (onde \"travel-sample\" \u00e9 o nome do banco de dados)\n<pre><code class=\"json\">[\r\n    {\r\n        \"travel-sample\": {\r\n            \"callsign\": \"MILE-AIR\",\r\n            \"country\": \"United States\",\r\n            \"iata\": \"Q5\",\r\n            \"icao\": \"MLA\",\r\n            \"id\": 10,\r\n            \"name\": \"40-Mile Air\",\r\n            \"type\": \"airline\"\r\n        }\r\n    },\r\n    {\r\n        \"travel-sample\": {\r\n            \"callsign\": \"TXW\",\r\n            \"country\": \"United States\",\r\n            \"iata\": \"TQ\",\r\n            \"icao\": \"TXW\",\r\n            \"id\": 10123,\r\n            \"name\": \"Texas Wings\",\r\n            \"type\": \"airline\"\r\n        }\r\n    }\r\n]\r\n<\/code><\/pre>\n<p>O trecho de c\u00f3digo abaixo \u00e9 um exemplo (em Swift) de como voc\u00ea processaria os resultados acima para obter os detalhes do objeto de documento<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">for row in try searchQuery.execute() {\r\n        if let dict = row.toDictionary() as? [String:Any], \r\n            let docObject = dict[\"travel-sample\"] as? [String:Any] {\r\n            \/\/ You can now process the document properties \r\n            let name = docObject[\"name\"]\r\n            let type = docObject[\"type\"]\r\n        }\r\n    }<\/pre>\n<p>&nbsp;<\/p>\n<p><code class=\"swift\"><\/code><\/li>\n<li>Se voc\u00ea estiver consultando o Id do documento usando <code>SelectResult.expression(Expression.Meta.id)<\/code>cada membro da matriz de resposta \u00e9 um par de chave-valor, com <code>\"id\"<\/code> como a chave e o Id do documento como o valor.<br \/>\nPor exemplo, considere a consulta<\/li>\n<\/ul>\n<pre class=\"wrap:true lang:swift decode:true\" style=\"padding-left: 30px\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id))\r\n        .from(DataSource.database(db))\r\n        .limit(Expression.int(limit))\r\n<\/pre>\n<ul>\n<li>Os resultados seriam mais ou menos assim -\n<pre><code class=\"json\">    [\r\n        {\r\n            \"id\": \"airline_112\"\r\n        },\r\n        {\r\n            \"id\": \"airline_189\"\r\n        },\r\n        {\r\n            \"id\": \"airline_1209\"\r\n        }\r\n    ]<\/code><\/pre>\n<p>O trecho de c\u00f3digo abaixo \u00e9 um exemplo (em Swift) de como voc\u00ea processaria os resultados acima para obter os detalhes do objeto do documento usando o ID do documento<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> for row in try searchQuery.execute() {\r\n        if let dict = row.toDictionary() as? [String:Any], \r\n            let docId  = dict[\"id\"] as? String {\r\n            \/\/ You can now fetch the details of the document using the Id\r\n            let doc = try db.getDocument(docId)\r\n        }     \r\n    }<\/pre>\n<\/li>\n<li>Se voc\u00ea estiver consultando propriedades espec\u00edficas do documento usando, por exemplo, <code>SelectResult.expression(Expression.property(\"type\")<\/code>cada membro da matriz de resposta \u00e9 um par de chave-valor, com o nome da propriedade\/propriedades como chave(s) e os valores de propriedade correspondentes como valor.<\/li>\n<\/ul>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Expression.property(\"type\")))\r\n        .from(DataSource.database(db))\r\n        .limit(Expression.int(limit))<\/pre>\n<ul>\n<li>Os resultados seriam mais ou menos assim -\n<pre><code class=\"json\">    [\r\n        {\r\n            \"type\": \"airline\"\r\n        },\r\n        {\r\n            \"type\": \"airline\"\r\n        },\r\n        {\r\n            \"type\": \"hotel\"\r\n        }\r\n    ]<\/code><\/pre>\n<p>O trecho de c\u00f3digo abaixo \u00e9 um exemplo (em Swift) de como voc\u00ea processaria os resultados acima para obter os valores de propriedade que voc\u00ea consultou<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> for row in try searchQuery.execute() {\r\n   if let docObject = row.toDictionary() as? [String:Any]  {\r\n      \/\/ You can now fetch the details of the document using the property name as key\r\n         let type = docObject[\"type\"]\r\n        }     \r\n    }<\/pre>\n<p>Voc\u00ea pode consultar os metadados e as propriedades do documento ao mesmo tempo usando uma lista separada por v\u00edrgulas de <code>SelecionarResultado<\/code> cada membro da matriz de resposta \u00e9 um par de chave-valor, conforme discutido anteriormente. Por exemplo, considere a consulta<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n            .select(SelectResult.expression(Meta.id),\r\n                    SelectResult.expression(Expression.property(\"type\")))\r\n            .from(DataSource.database(db))\r\n            .limit(Expression.int(limit))<\/pre>\n<p>Os resultados seriam mais ou menos assim -<\/p>\n<pre><code class=\"json\">    [\r\n        {\r\n            \"id\":\"airline_1001\",\r\n            \"type\": \"airline\"\r\n\r\n        },\r\n        {\r\n            \"id\":\"airline_900\",\r\n            \"type\": \"airline\"\r\n        },\r\n        {\r\n            \"id\":\"hotel_1001\",\r\n            \"type\": \"hotel\"\r\n        }\r\n    ]<\/code><\/pre>\n<p>O trecho de c\u00f3digo abaixo \u00e9 um exemplo (em Swift) de como voc\u00ea processaria os resultados acima para obter os valores de propriedade que voc\u00ea consultou<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> for row in try searchQuery.execute() {\r\n    if let docObject = row.toDictionary() as? [String:Any]  {\r\n    \/\/ You can now fetch the details of the document using the property name as key\r\n        let type = docObject[\"type\"]\r\n        let docId = docObject[\"id\"]\r\n     }     \r\n }<\/pre>\n<p>&nbsp;<\/p>\n<p><code class=\"swift\"><\/code><\/li>\n<\/ul>\n<h3 id=\"introducingthewhereclause\">Apresentando a cl\u00e1usula Where<\/h3>\n<p>Semelhante ao SQL, voc\u00ea pode usar o <code>onde<\/code> para filtrar os documentos a serem retornados como parte da consulta. A cl\u00e1usula <code>selecionar<\/code> recebe uma instru\u00e7\u00e3o <code>Express\u00e3o<\/code>. Voc\u00ea pode encadear qualquer n\u00famero de <code>Express\u00f5es<\/code> para implementar recursos sofisticados de filtragem.<\/p>\n<h4 id=\"filteringdocumentsbasedonspecificproperty\">Filtragem de documentos com base em uma propriedade espec\u00edfica<\/h4>\n<p>No exemplo abaixo, usamos <code>Express\u00e3o de propriedade<\/code> em conjunto com o tipo <code>Express\u00f5es de compara\u00e7\u00e3o<\/code> para filtrar documentos com base em uma propriedade espec\u00edfica do documento. O exemplo abaixo mostra o tipo <code>igual a<\/code> express\u00e3o de compara\u00e7\u00e3o.<\/p>\n<p>Observa\u00e7\u00e3o: Ao fazer refer\u00eancia a uma propriedade em um <code>Express\u00e3o de propriedade<\/code>Podemos usar caminhos de chave (em nota\u00e7\u00e3o pontilhada) para especificar o caminho para uma propriedade aninhada.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.all())\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\")))\r\n        .limit(Expression.int(limit))<\/pre>\n<p>A lista de operadores de compara\u00e7\u00e3o compat\u00edveis inclui<br \/>\n* lessThan<br \/>\n* notLessThan<br \/>\n* lessThanOrEqualTo<br \/>\n* notLessThanOrEqualTo<br \/>\n* greaterThan<br \/>\n* notGreaterThan<br \/>\n* greaterThanOrEqualTo<br \/>\n* notGreaterThanOrEqualTo<br \/>\n* equalTo<br \/>\n* notEqualTo<\/p>\n<h4 id=\"filteringdocumentsusinglogicalexpressions\">Filtragem de documentos usando express\u00f5es l\u00f3gicas<\/h4>\n<p>Podemos usar <code>Express\u00e3o l\u00f3gica<\/code> para encadear v\u00e1rios <code>express\u00f5es de compara\u00e7\u00e3o<\/code>. No exemplo abaixo, buscamos documentos de <code>tipo<\/code> hotel cujo <code>pa\u00eds<\/code> \u00e9 igual a <em>\"Estados Unidos\"<\/em> ou <em>\"Fran\u00e7a\"<\/em> e cujo <code>vaga<\/code> propriedade \u00e9 <em>verdadeiro<\/em>. Em outras palavras, estamos buscando todos os hot\u00e9is nos Estados Unidos ou na Fran\u00e7a que t\u00eam uma vaga.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id))\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\"))\r\n            .and(Expression.property(\"country\").equalTo(Expression.string (\"United States\"))\r\n            .or(Expression.property(\"country\").equalTo(Expression.string (\"France\"))))\r\n            .and(Expression.property(\"vacancy\").equalTo(Expression.boolean(true))))\r\n        .limit(Expression.int(limit))<\/pre>\n<h3 id=\"patternmatching\">Correspond\u00eancia de padr\u00f5es<\/h3>\n<p>O <code>como<\/code> e <code>regex<\/code> podem ser usadas para correspond\u00eancia de strings. Elas realizam correspond\u00eancias **sens\u00edveis a mai\u00fasculas e min\u00fasculas**. Portanto, se voc\u00ea quiser tornar a correspond\u00eancia de strings insens\u00edvel a mai\u00fasculas e min\u00fasculas, ter\u00e1 de usar <code>Function.lower<\/code> ou <code>Function.upper<\/code> para transformar a cadeia de caracteres correspondente em equivalentes em letras min\u00fasculas ou mai\u00fasculas.<\/p>\n<h4 id=\"exactmatch\">Correspond\u00eancia exata<\/h4>\n<p>No exemplo abaixo, estamos procurando documentos de <code>tipo<\/code> \"marco\" onde o <code>nome<\/code> corresponde exatamente \u00e0 string <em>\"Museu dos engenheiros reais\"<\/em>. Observe que, como <code>como<\/code> faz uma correspond\u00eancia que diferencia mai\u00fasculas de min\u00fasculas, usamos <code>Function.lower<\/code> para transformar a string correspondente em um equivalente em letras min\u00fasculas. Portanto, a consulta a seguir retornar\u00e1 <em>\"marco\"<\/em> <code>tipo<\/code> documentos com <code>nome<\/code> correspond\u00eancia <em>\"Museu dos Engenheiros Reais\"<\/em>, <em>\"Museu dos Engenheiros Reais\"<\/em>, <em>\"MUSEU DOS ENGENHEIROS REAIS\"<\/em> e assim por diante.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"country\")),\r\n                SelectResult.expression(Expression.property(\"name\")))\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"landmark\"))\r\n            .and(Function.lower(Expression.property(\"name\")).like(Expression.string(\"royal engineers museum\"))))\r\n        .limit(Expression.int(limit))<\/pre>\n<h4 id=\"wildcardmatch\">Partida de coringa<\/h4>\n<p>Podemos usar <code>%<\/code> dentro de um <code>como<\/code> para fazer uma correspond\u00eancia curinga com zero ou mais caracteres. O uso de curingas permite que voc\u00ea tenha alguma imprecis\u00e3o em sua string de pesquisa.<\/p>\n<p>No exemplo abaixo, estamos procurando documentos de <code>tipo<\/code> \"marco\" onde o <code>nome<\/code> corresponde a qualquer string que comece com \"eng\" seguido de zero ou mais caracteres, a letra \"e\", seguida de zero ou mais caracteres. Mais uma vez, estamos usando <code>Function.lower<\/code> para tornar o caso de pesquisa insens\u00edvel.<\/p>\n<p>A consulta a seguir retornar\u00e1 <em>\"marco\"<\/em> <code>tipo<\/code> documentos com <code>nome<\/code> correspond\u00eancia <em>\"Engenheiros\"<\/em>, <em>\"motor\"<\/em>, <em>\"english egg\" (ovo ingl\u00eas)<\/em> , <em>\"Inglaterra Eagle\"<\/em> e assim por diante. Observe que as correspond\u00eancias podem abranger limites de palavras.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">    let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"country\")),\r\n                SelectResult.expression(Expression.property(\"name\")))\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"landmark\"))\r\n            .and( Function.lower(Expression.property(\"name\")).like(Expression.string(\"%eng%r%\"))))\r\n        .limit(Expression.int(limit))<\/pre>\n<h4 id=\"wildcardcharactermatch\">Correspond\u00eancia de caracteres curinga<\/h4>\n<p>Podemos usar <code>\"_\"<\/code> dentro de um <code>como<\/code> para fazer uma correspond\u00eancia curinga com um \u00fanico caractere.<\/p>\n<p>No exemplo abaixo, estamos procurando documentos de <code>tipo<\/code> \"marco\" onde o <code>nome<\/code> corresponde a qualquer cadeia de caracteres que comece com \"eng\", seguida de exatamente 4 caracteres curinga e terminando na letra \"r\".<\/p>\n<p>Observe que, diferentemente dos exemplos anteriores, n\u00e3o estamos usando <code>Function.lower<\/code> para transformar a string de pesquisa em letras min\u00fasculas. Assim, a pesquisa ser\u00e1 sens\u00edvel a mai\u00fasculas e min\u00fasculas.<br \/>\nA consulta a seguir retornar\u00e1 <em>\"marco\"<\/em> <code>tipo<\/code> documentos com <code>nome<\/code> correspond\u00eancia <em>\"Engenheiro\"<\/em>, <em>\"Engenheiro1\"<\/em> e assim por diante.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"country\")),\r\n                SelectResult.expression(Expression.property(\"name\")))\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"landmark\"))\r\n            .and( Expression.property(\"name\")\r\n                .like(Expression.string(\"%Eng____r%\"))))\r\n        .limit(Expression.int(limit))<\/pre>\n<h4 id=\"regexmatch\">Correspond\u00eancia Regex<\/h4>\n<p>O <code>regex<\/code> pode ser usada para correspond\u00eancias que diferenciam mai\u00fasculas de min\u00fasculas. Semelhante ao curinga <code>como<\/code> express\u00f5es, <code>regex<\/code> A correspond\u00eancia de padr\u00f5es baseada em express\u00f5es permite que voc\u00ea tenha alguma imprecis\u00e3o em sua string de pesquisa.<\/p>\n<p>No exemplo abaixo, estamos procurando documentos de <code>tipo<\/code> \"marco\" onde o <code>nome<\/code> corresponde a qualquer cadeia de caracteres (em limites de palavras) que comece com \"eng\" seguido de exatamente 4 caracteres curinga e que termine com a letra \"r\". Mais uma vez, estamos usando <code>Function.lower<\/code> para tornar o caso de pesquisa insens\u00edvel.<\/p>\n<p>A consulta a seguir retornar\u00e1 <em>\"marco\"<\/em> <code>tipo<\/code> documentos com <code>nome<\/code> correspond\u00eancia <em>\"Motor\"<\/em>, <em>\"motor\"<\/em> e assim por diante. Observe que o <code>\\b<\/code> especifica que a correspond\u00eancia deve ocorrer nos limites das palavras.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n        SelectResult.expression(Expression.property(\"name\")) )\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string(\"landmark\"))\r\n            .and(Function.lower(Expression.property(\"name\")).regex(Expression.string(\"\\\\beng.*r.*\\\\b\"))))\r\n        .limit(Expression.int(limit))<\/pre>\n<h3 id=\"documentsthathavenullormissingproperty\">Documentos que t\u00eam propriedade nula ou ausente<\/h3>\n<p>Um dos recursos da linguagem de consulta que a diferencia do SQL \u00e9 a capacidade de consultar documentos que tenham propriedades nulas ou ausentes.<\/p>\n<p>O <code>isNullOrMissing()<\/code> \u00e9 usada em conjunto com a express\u00e3o <code>Express\u00e3o de propriedade<\/code> para testar se a propriedade especificada tem um valor nulo ou ausente. O <code>isNullOrMissing()<\/code> faz o inverso.<\/p>\n<p>No exemplo abaixo, estamos procurando todos os documentos nos quais o <code>e-mail<\/code> que \u00e9 nula ou est\u00e1 faltando.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"email\")))\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"email\").isNullOrMissing())\r\n        .limit(Expression.int(limit))<\/pre>\n<h3 id=\"orderingofdocuments\">Pedido de documentos<\/h3>\n<p>\u00c9 poss\u00edvel classificar os resultados de uma consulta com base em um determinado resultado de express\u00e3o.<\/p>\n<p>O exemplo abaixo retorna documentos de <code>tipo<\/code> igual a <em>\"hotel\"<\/em> classificadas em ordem crescente pelo valor da vari\u00e1vel <code>t\u00edtulo<\/code> propriedade.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder.select(\r\n            SelectResult.expression(Meta.id),\r\n            SelectResult.expression(Expression.property(\"title\")))\r\n        .from(DataSource.database(db))\r\n    .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\")))\r\n        .orderBy(Ordering.property(\"title\").ascending())\r\n        .limit(Expression.int(limit))<\/pre>\n<h3 id=\"stringmanipulation\">Manipula\u00e7\u00e3o de cordas<\/h3>\n<p>Os recursos de manipula\u00e7\u00e3o de strings s\u00e3o essenciais para qualquer processamento de dados. Nos exemplos anteriores, vimos como a fun\u00e7\u00e3o <code>Function.lower<\/code> pode ser usado para transformar uma cadeia de caracteres em letras min\u00fasculas equivalentes para fazer compara\u00e7\u00f5es de cadeias de caracteres sem distin\u00e7\u00e3o entre mai\u00fasculas e min\u00fasculas.<\/p>\n<p>O Couchbase Lite oferece suporte \u00e0s seguintes fun\u00e7\u00f5es de processamento de strings.<\/p>\n<pre><code class=\"(null)\">    - Function.lower(String Expression)\r\n    - Function.ltrim(String Expression)\r\n    - Function.rtrim(String Expression)\r\n    - Function.trim(String Expression)\r\n    - Function.upper(String Expression)\r\n    - Function.length(String Expression)\r\n    - Function.substring(String Expression, String Expression)\r\n<\/code><\/pre>\n<p>O exemplo abaixo retorna documentos de onde o <code>e-mail<\/code> cont\u00e9m a substring <em>\"natgeo.org\"<\/em>. O <code>nome<\/code> o valor da propriedade \u00e9 convertido em mai\u00fasculas na resposta.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilder.select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"email\")),\r\n                SelectResult.expression(Expression.property(\"name\")))\r\n        .from(DataSource.database(db))\r\n .where(Function.contains(Expression.property(\"email\"), substring: Expression.string (\"natgeo.org\")))\r\n        .limit(Expression.int(limit))<\/pre>\n<p>&nbsp;<\/p>\n<h4 id=\"collation\">Coleta<\/h4>\n<p>As fun\u00e7\u00f5es de agrupamento aprimoram os recursos de compara\u00e7\u00e3o e classifica\u00e7\u00e3o de strings, oferecendo suporte a strings unicode, manipula\u00e7\u00e3o de strings com reconhecimento local e recursos espec\u00edficos do idioma, como diacr\u00edticos. Voc\u00ea pode aprender sobre collation neste <a href=\"https:\/\/github.com\/couchbase\/couchbase-lite-core\/wiki\/JSON-Query-Schema#collation\">escrever <\/a> por Jens Alfke.<\/p>\n<p>O exemplo abaixo define as regras de agrupamento que ignoram mai\u00fasculas e min\u00fasculas e acentos. Esse collator \u00e9 aplicado \u00e0 fun\u00e7\u00e3o de compara\u00e7\u00e3o de strings no <code>nome<\/code> propriedade. Os resultados incluir\u00e3o documentos em que <code>nome<\/code> \u00e9 igual a cadeias de caracteres como \"Hotel Novotel Paris La Defense\" , \"Hotel Novotel Paris La D\u00e9fense\" e assim por diante.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let collator = Collation.unicode()\r\n                .ignoreAccents(true)\r\n                .ignoreCase(true)\r\n\r\nlet searchQuery = QueryBuilder.select(SelectResult.expression(Meta.id),\r\n         SelectResult.expression(Expression.property(\"name\")))\r\n        .from(DataSource.database(db))\r\n     .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\"))\r\n            .and(Expression.property(\"name\").collate(collator).equalTo(Expression.string (\"Hotel novotel paris la defense\"))))\r\n        .limit(Expression.int(limit))<\/pre>\n<p>H\u00e1 algumas limita\u00e7\u00f5es no suporte ao Collation - no momento da reda\u00e7\u00e3o deste post, ele n\u00e3o pode ser usado com consultas de correspond\u00eancia de padr\u00f5es, como <code>como<\/code> e <code>regex<\/code> .<\/p>\n<h3 id=\"stringmanipulation\">Parametriza\u00e7\u00e3o<\/h3>\n<p>Um dos recursos mais avan\u00e7ados da interface de consulta \u00e9 a capacidade de definir par\u00e2metros em uma consulta. Isso lhe d\u00e1 a flexibilidade de atualizar os valores dos par\u00e2metros de uma consulta a qualquer momento, sem precisar recriar ou reiniciar a consulta. A altera\u00e7\u00e3o dos par\u00e2metros da consulta reiniciar\u00e1 automaticamente a consulta e os novos par\u00e2metros entrar\u00e3o em vigor.<\/p>\n<p>Com rela\u00e7\u00e3o ao modelo de dados acima, vamos supor que voc\u00ea queira buscar documentos em que o n\u00famero\u00a0<code>gostos do p\u00fablico<\/code>\u00a0est\u00e1 dentro de um determinado intervalo. No exemplo abaixo, estamos procurando por \"hotel\" <code>tipo<\/code>\u00a0documentos em que o n\u00famero de <code>gostos do p\u00fablico<\/code>\u00a0est\u00e1 entre 5 e 10.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">  \/\/ 1. function that corresponds to the number of elements in an array\r\n  let likesCount = ArrayFunction.length(Expression.property(\"public_likes\"))\r\n \/\/ 2. Parameters for specifying lower and upper limits of range\r\n let lowerCount = Expression.parameter(\"lower\")\r\n let upperCount = Expression.parameter(\"upper\")\r\n  \r\n \/\/ 3. Query that takes in parameters\r\n let searchQuery = QueryBuilder\r\n        .select(SelectResult.expression(Meta.id),\r\n                SelectResult.expression(Expression.property(\"name\")),\r\n                SelectResult.expression(likesCount).as(\"NumLikes\")\r\n        )\r\n        .from(DataSource.database(db))\r\n        .where(Expression.property(\"type\").equalTo(Expression.string (\"hotel\"))\r\n            .and(likesCount.between(lowerCount,and: upperCount)))\r\n        .limit(Expression.int(limit))\r\n\r\n   \/\/ 4. Supplying the query parameter values\r\n   let params = Parameters.init().setInt(5, forName: \"lower\").setInt(10, forName: \"upper\")\r\n    searchQuery.parameters = params<\/pre>\n<p>Observe que, no exemplo acima, voc\u00ea deve ter notado o uso de <code>ArrayFunction<\/code>. O Couchbase Lite 2.0 nos fornece suporte extensivo \u00e0 manipula\u00e7\u00e3o de array. Isso ser\u00e1 discutido futuramente neste <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/querying-array-collections-couchbase-mobile\/\">postagem no blog sobre cole\u00e7\u00f5es.<\/a><\/p>\n<h3 id=\"whatnext\">O que vem a seguir<\/h3>\n<p>Esta postagem do blog lhe deu um vislumbre da nova e poderosa interface de consulta suportada no Couchbase Lite 2.0. Voc\u00ea pode fazer o download das compila\u00e7\u00f5es de pr\u00e9-lan\u00e7amento do Couchbase Mobile 2.0 em nosso <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">downloads<\/a> p\u00e1gina.<\/p>\n<p>Aqui est\u00e3o outras postagens relacionadas ao Couchbase Mobile Query que podem ser de interesse<br \/>\n- Isso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/full-text-search-couchbase-mobile-2-0\/\">postagem no blog<\/a> discute os recursos de pesquisa de texto completo.<br \/>\n- Isso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/querying-array-collections-couchbase-mobile\/\">postagem no blog<\/a> discute como consultar cole\u00e7\u00f5es de matrizes<br \/>\n- Isso <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/join-queries-couchbase-mobile\/\">postagem no blog<\/a> discute como fazer consultas JOIN<\/p>\n<p>Se tiver d\u00favidas ou coment\u00e1rios, deixe um coment\u00e1rio abaixo ou entre em contato comigo pelo Twitter\u00a0<a href=\"https:\/\/twitter.com\/rajagp\">@rajagp<\/a>\u00a0ou envie-me um e-mail\u00a0<a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>.  O\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs do Couchbase<\/a> s\u00e3o outro bom lugar para entrar em contato com perguntas.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>The Couchbase Lite 2.0 Release, brings a plethora of new features and enhancements. We discussed one such enhancement, namely the new replication protocol between in an earlier blog post on Replication 2.0. In this blog post, we will introduce you [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":4188,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,7667,1810,2165,1812],"tags":[1393,2087,1505,1261,1743],"ppma_author":[8948],"class_list":["post-4187","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","category-full-text-search","category-n1ql-query","tag-api","tag-couchbase-mobile-2","tag-index","tag-json","tag-sqlite"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing the Query Interface in Couchbase Mobile 2.0<\/title>\n<meta name=\"description\" content=\"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/sql-for-json-query-interface-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Query Interface in Couchbase Mobile 2.0\" \/>\n<meta property=\"og:description\" content=\"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/sql-for-json-query-interface-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-11-14T19:00:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:28:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1716\" \/>\n\t<meta property=\"og:image:height\" content=\"842\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rajagp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Introducing the Query Interface in Couchbase Mobile 2.0\",\"datePublished\":\"2017-11-14T19:00:49+00:00\",\"dateModified\":\"2025-06-14T03:28:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\"},\"wordCount\":2179,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"keywords\":[\"API\",\"Couchbase Mobile 2.\",\"Index\",\"JSON\",\"sqlite\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\",\"name\":\"Introducing the Query Interface in Couchbase Mobile 2.0\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"datePublished\":\"2017-11-14T19:00:49+00:00\",\"dateModified\":\"2025-06-14T03:28:08+00:00\",\"description\":\"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"width\":1716,\"height\":842,\"caption\":\"SQL for JSON Query\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Query Interface in Couchbase Mobile 2.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\",\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"caption\":\"Priya Rajagopal, Senior Director, Product Management\"},\"description\":\"Priya Rajagopal is a Senior Director of Product Management at Couchbase responsible for developer platforms for the cloud and the edge. She has been professionally developing software for over 20 years in several technical and product leadership positions, with 10+ years focused on mobile technologies. As a TISPAN IPTV standards delegate, she was a key contributor to the IPTV standards specifications. She has 22 patents in the areas of networking and platform security.\",\"sameAs\":[\"https:\/\/x.com\/rajagp\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Apresentando a interface de consulta no Couchbase Mobile 2.0","description":"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/sql-for-json-query-interface-couchbase-mobile\/","og_locale":"pt_BR","og_type":"article","og_title":"Introducing the Query Interface in Couchbase Mobile 2.0","og_description":"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/sql-for-json-query-interface-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-11-14T19:00:49+00:00","article_modified_time":"2025-06-14T03:28:08+00:00","og_image":[{"width":1716,"height":842,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","type":"image\/png"}],"author":"Priya Rajagopal, Senior Director, Product Management","twitter_card":"summary_large_image","twitter_creator":"@rajagp","twitter_misc":{"Written by":"Priya Rajagopal, Senior Director, Product Management","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Introducing the Query Interface in Couchbase Mobile 2.0","datePublished":"2017-11-14T19:00:49+00:00","dateModified":"2025-06-14T03:28:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/"},"wordCount":2179,"commentCount":8,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","keywords":["API","Couchbase Mobile 2.","Index","JSON","sqlite"],"articleSection":["Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/","name":"Apresentando a interface de consulta no Couchbase Mobile 2.0","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","datePublished":"2017-11-14T19:00:49+00:00","dateModified":"2025-06-14T03:28:08+00:00","description":"Couchbase Mobile 2.0 supports a new query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","width":1716,"height":842,"caption":"SQL for JSON Query"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the Query Interface in Couchbase Mobile 2.0"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c","name":"Priya Rajagopal, Diretora S\u00eanior, Gerenciamento de Produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734","url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","caption":"Priya Rajagopal, Senior Director, Product Management"},"description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/"}]}},"authors":[{"term_id":8948,"user_id":1423,"is_guest":0,"slug":"priya-rajagopalcouchbase-com","display_name":"Priya Rajagopal, Senior Director, Product Management","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","first_name":"Priya","last_name":"Rajagopal, Senior Director, Product Management","user_url":"","author_category":"","description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4187"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4187\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/4188"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4187"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}