{"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\/es\/sql-for-json-query-interface-couchbase-mobile\/","title":{"rendered":"Presentaci\u00f3n de la interfaz de consulta en Couchbase Mobile 2.0"},"content":{"rendered":"<p>La versi\u00f3n 2.0 de Couchbase Lite, trae una pl\u00e9tora de <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">nuevas funciones y mejoras<\/a>. Ya hablamos de una de estas mejoras, a saber, el nuevo protocolo de replicaci\u00f3n entre en un anterior <a href=\"https:\/\/www.couchbase.com\/blog\/es\/data-replication-couchbase-mobile\/\">entrada en el blog sobre Replicaci\u00f3n 2.0<\/a>. En esta entrada de blog, le presentaremos otra caracter\u00edstica importante: la interfaz de consulta de Couchbase Lite. La nueva interfaz de consulta se basa en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">N1QL<\/a>el lenguaje de consulta declarativo de Couchbase que extiende SQL para JSON. Si est\u00e1s familiarizado con SQL, te sentir\u00e1s como en casa con la sem\u00e1ntica de la nueva API.<\/p>\n<p>Esta entrada presenta la interfaz de consulta y cubre los aspectos b\u00e1sicos. Consulte la \u00faltima secci\u00f3n de esta entrada para obtener informaci\u00f3n espec\u00edfica sobre otras entradas de blog relacionadas con funciones de consulta m\u00e1s avanzadas.<\/p>\n<p>Puede descargar las versiones preliminares de Couchbase Mobile 2.0 desde nuestra p\u00e1gina web <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">descargas<\/a> p\u00e1gina.<\/p>\n<p><!--more--><\/p>\n<h3 id=\"background\">Fondo<\/h3>\n<p>Si utilizabas las versiones 1.x de Couchbase Mobile, probablemente est\u00e9s familiarizado <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/1.4\/training\/develop\/using-the-database\/index.html#query-documents\">Map-Views<\/a> para crear \u00edndices y consultas. En la versi\u00f3n 2.0, ya no es necesario crear vistas y funciones de mapa. En su lugar, una sencilla interfaz le permite crear \u00edndices y puede utilizar una interfaz Query Builder para construir sus consultas. En comparaci\u00f3n, la nueva interfaz de consulta es m\u00e1s sencilla de utilizar y mucho m\u00e1s potente. Descubriremos algunas de sus caracter\u00edsticas en este post.<\/p>\n<h3 id=\"sampleproject\">Ejemplo de proyecto<\/h3>\n<p>Aunque los ejemplos que aqu\u00ed se exponen utilizan Swift para iOS, ten en cuenta que, salvo algunas peque\u00f1as diferencias, la misma interfaz de consulta es compatible tambi\u00e9n con las plataformas Android y Windows. Por lo tanto, con algunos ajustes menores, deber\u00edas poder reutilizar los ejemplos de este art\u00edculo cuando trabajes con otras plataformas.<\/p>\n<p>Siga las instrucciones siguientes si est\u00e1 interesado en un proyecto Swift de muestra<\/p>\n<ul>\n<li>Clonar el iOS Swift Playground desde GitHub\n<pre><code class=\"bash\">$ git clone https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground<\/code><\/pre>\n<\/li>\n<li>Siga las instrucciones de instalaci\u00f3n en el <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-a_pi-playground\/blob\/master\/README.md\">L\u00c9AME<\/a> para construir y ejecutar la zona de juegos.<\/li>\n<\/ul>\n<h3 id=\"sampledatamodel\">Modelo de datos de muestra<\/h3>\n<p>Utilizaremos la base de datos de muestras de viajes <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground\/tree\/master\/travel-sample.cblite2\">aqu\u00ed<\/a><\/p>\n<p>El conjunto de datos de la muestra incluye varios tipos de documentos identificados por el <code>tipo<\/code> del documento. Nos centraremos en documentos de <code>tipo<\/code> <em>\"hotel\"<\/em> y <em>\"hito\"<\/em>. A continuaci\u00f3n se muestra el modelo de documento JSON. Para simplificar, hemos omitido algunas de las propiedades del modelo a continuaci\u00f3n.<\/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\">Conceptos b\u00e1sicos<\/h3>\n<h4 id=\"openingcreatingadatabase\">Abrir \/ Crear una base de datos<\/h4>\n<p>Para todas las consultas que se realizan a continuaci\u00f3n, utilizaremos la funci\u00f3n <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/guides\/couchbase-lite\/native-api\/database\/index.html\"><code>Base de datos<\/code><\/a> API para abrir\/crear Base de Datos 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 las consultas de lectura, puede crear \u00edndices sobre las propiedades que va a consultar. La mejora del rendimiento ser\u00eda significativa en grandes conjuntos de datos. Por supuesto, tenga en cuenta que habr\u00e1 un aumento en las necesidades de almacenamiento para almacenar los \u00edndices y el rendimiento de las escrituras tambi\u00e9n puede verse afectado. Por lo tanto, tenga cuidado al crear demasiados \u00edndices.<\/p>\n<p>El siguiente ejemplo crea un <code>\u00cdndiceValor<\/code> en el <code>tipo<\/code> de un 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>El siguiente ejemplo crea un <code>\u00cdndiceValor<\/code> en <code>tipo<\/code> y <code>nombre<\/code> propiedades de un 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\">Obtenci\u00f3n de documentos de la base de datos<\/h4>\n<p>Una consulta en Couchbase Lite se construye usando la API del constructor de consultas.<\/p>\n<p>La siguiente consulta obtiene todos los documentos de la base de datos especificada. Para cada documento que coincida con la consulta, se obtienen todas las propiedades asociadas al documento.<\/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\">Obtenci\u00f3n de documentos de la base de datos con paginaci\u00f3n<\/h4>\n<p>Esta es la estructura de una consulta simple que obtiene <code>l\u00edmite<\/code> n\u00famero de documentos de la base de datos a partir del <code>offset<\/code>. Para cada documento que coincide con la consulta, se obtienen todas las propiedades asociadas al documento.<\/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 con SelectResult<\/h3>\n<p>A <code>SeleccionarResultado<\/code> representa un \u00fanico valor de retorno de la consulta. Los documentos en Couchbase Lite comprenden las propiedades del documento especificadas como un diccionario de pares clave-valor y metadatos asociados. Los metadatos consisten en el Id del documento y el Id de la secuencia asociada con el Documento. Cuando se consulta un documento, los metadatos del documento no se devuelven por defecto. Deber\u00e1 solicitar expl\u00edcitamente los metadatos.<\/p>\n<ul>\n<li><code>SelectResult.all()<\/code>\n<ul>\n<li>Devuelve todas las propiedades asociadas a un Documento<\/li>\n<\/ul>\n<\/li>\n<li><code>SeleccionarResultado(Expresi\u00f3n)<\/code>\n<ul>\n<li>Devuelve las propiedades de un Documento en funci\u00f3n del <code>Expresi\u00f3n<\/code>. M\u00e1s adelante hablaremos de los distintos tipos de expresiones.<\/li>\n<\/ul>\n<\/li>\n<li><code>SelectResult.expression(Expresi\u00f3n.Meta.id)<\/code>\n<ul>\n<li>Devuelve el Id del documento<\/li>\n<\/ul>\n<\/li>\n<li><code>SelectResult.expression(Expression.Meta.sequence)<\/code>\n<ul>\n<li>Devuelve el Id de secuencia (utilizado en las r\u00e9plicas)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Puede especificar una lista separada por comas de <code>SeleccionarResultado<\/code> expresiones en el <code>seleccione<\/code> de su consulta.<br \/>\nPor ejemplo, la siguiente sentencia select busca el Id del documento as\u00ed como el <code>tipo<\/code> y <code>nombre<\/code> propiedades del 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\">Expresi\u00f3n de consulta<\/h3>\n<p>Una expresi\u00f3n de consulta se utiliza para construir una sentencia de consulta<\/p>\n<p>Couchbase Lite incluye soporte para <code>Expresi\u00f3n<\/code> Tipos.<\/p>\n<ul>\n<li>Propiedad<\/li>\n<li>Agregado<\/li>\n<li>Cadena<\/li>\n<li>Intercalaci\u00f3n<\/li>\n<li>Regex<\/li>\n<li>FTS<\/li>\n<li>Operador de comprobaci\u00f3n nula<\/li>\n<li>Expresiones aritm\u00e9ticas<\/li>\n<li>Metadatos<\/li>\n<li>Coincidencia de patrones<\/li>\n<li>Comparaci\u00f3n<\/li>\n<li>Colecci\u00f3n<\/li>\n<li>Funci\u00f3n<\/li>\n<li>Par\u00e1metro<\/li>\n<li>Cuantificado<\/li>\n<li>Operador Bitwise<\/li>\n<\/ul>\n<h3 id=\"processingqueryresponses\">Tratamiento de las respuestas a las consultas<\/h3>\n<p>El resultado de la ejecuci\u00f3n de la consulta es un array en el que cada miembro del array es un Diccionario \/ Mapa correspondiente a un documento que satisface la 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>Si consulta todas las propiedades del documento mediante <code>SelectResult.all()<\/code>cada miembro de la matriz de respuesta es un par clave-valor, en el que el nombre de la base de datos es la clave y el diccionario correspondiente al documento es el valor de la clave.<\/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>Los resultados ser\u00edan algo parecido a esto (donde \"muestra-viaje\" es el nombre de la base de datos )\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>El siguiente fragmento de c\u00f3digo es un ejemplo (en Swift) de c\u00f3mo procesar los resultados anteriores para obtener los detalles del objeto 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>Si consulta el Id del documento mediante <code>SelectResult.expression(Expresi\u00f3n.Meta.id)<\/code>entonces cada miembro de la matriz de respuesta es un par clave-valor, con <code>\"id\"<\/code> como clave y el Id del documento como valor.<br \/>\nPor ejemplo, considere la 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>Los resultados ser\u00edan algo as\u00ed -\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>El siguiente fragmento de c\u00f3digo es un ejemplo (en Swift) de c\u00f3mo procesar los resultados anteriores para obtener los detalles del objeto documento utilizando el Id del 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>Si est\u00e1 consultando una propiedad o propiedades espec\u00edficas del documento utilizando, por ejemplo, <code>SelectResult.expression(Expression.property(\"tipo\")<\/code>cada miembro de la matriz de respuesta es un par clave-valor, con el nombre de la propiedad o propiedades como clave(s) y los valores de propiedad correspondientes como valorPor ejemplo, considere la consulta<\/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>Los resultados ser\u00edan algo as\u00ed -\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>El siguiente fragmento de c\u00f3digo es un ejemplo (en Swift) de c\u00f3mo procesar los resultados anteriores para obtener los valores de las propiedades que ha consultado<\/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>Puede consultar los metadatos y las propiedades del documento al mismo tiempo utilizando una lista separada por comas de los siguientes elementos <code>SeleccionarResultado<\/code> cada miembro de la matriz de respuesta es un par clave-valor, tal como se ha explicado anteriormente.<\/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>Los resultados ser\u00edan algo as\u00ed -<\/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>El siguiente fragmento de c\u00f3digo es un ejemplo (en Swift) de c\u00f3mo procesar los resultados anteriores para obtener los valores de las propiedades que ha consultado<\/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\">Introducci\u00f3n de la cl\u00e1usula Where<\/h3>\n<p>De forma similar a SQL, puede utilizar la funci\u00f3n <code>donde<\/code> para filtrar los documentos que se devolver\u00e1n como parte de la consulta. En <code>seleccione<\/code> recibe un <code>Expresi\u00f3n<\/code>. Puede encadenar cualquier n\u00famero de <code>Expresiones<\/code> para implementar sofisticadas capacidades de filtrado.<\/p>\n<h4 id=\"filteringdocumentsbasedonspecificproperty\">Filtrado de documentos en funci\u00f3n de una propiedad espec\u00edfica<\/h4>\n<p>En el ejemplo siguiente, utilizamos <code>Expresi\u00f3n de propiedad<\/code> junto con <code>Expresiones de comparaci\u00f3n<\/code> para filtrar documentos en funci\u00f3n de una propiedad espec\u00edfica del documento. En el siguiente ejemplo se muestra la funci\u00f3n <code>equalTo<\/code> expresi\u00f3n de comparaci\u00f3n.<\/p>\n<p>Nota: Cuando se hace referencia a una propiedad en un archivo <code>Expresi\u00f3n de propiedad<\/code>podemos utilizar rutas clave (en notaci\u00f3n de puntos) para especificar la ruta a una propiedad anidada.<\/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>La lista de operadores de comparaci\u00f3n admitidos incluye<br \/>\n* lessThan<br \/>\n* notLessThan<br \/>\n* lessThanOrEqualTo<br \/>\n* notLessThanOrEqualTo<br \/>\n* mayorQue<br \/>\n* notGreaterThan<br \/>\n* Mayor que o igual a<br \/>\n* notGreaterThanOrEqualTo<br \/>\n* equalTo<br \/>\n* notEqualTo<\/p>\n<h4 id=\"filteringdocumentsusinglogicalexpressions\">Filtrado de documentos mediante expresiones l\u00f3gicas<\/h4>\n<p>Podemos utilizar <code>Expresi\u00f3n l\u00f3gica<\/code> encadenar varios <code>expresiones de comparaci\u00f3n<\/code>. En el ejemplo siguiente, obtenemos documentos de <code>tipo<\/code> hotel cuyo <code>pa\u00eds<\/code> es igual a <em>\"Estados Unidos\"<\/em> o <em>\"Francia<\/em> y cuyo <code>vacante<\/code> propiedad es <em>verdadero<\/em>. En otras palabras, buscamos todos los hoteles de Estados Unidos o Francia que tienen una plaza libre.<\/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\">Coincidencia de patrones<\/h3>\n<p>En <code>como<\/code> y <code>regex<\/code> pueden utilizarse para la concordancia de cadenas. \u00c9stas realizan **comparaciones que distinguen may\u00fasculas y min\u00fasculas**. Por lo tanto, si desea que la coincidencia de cadenas no distinga entre may\u00fasculas y min\u00fasculas, deber\u00e1 utilizar <code>Funci\u00f3n.inferior<\/code> o <code>Funci\u00f3n.superior<\/code> para transformar la cadena coincidente a sus equivalentes en min\u00fasculas o may\u00fasculas.<\/p>\n<h4 id=\"exactmatch\">Coincidencia exacta<\/h4>\n<p>En el ejemplo siguiente, buscamos documentos de <code>tipo<\/code> \"hito\" donde el <code>nombre<\/code> coincide exactamente con la cadena <em>\"Museo de los Ingenieros Reales\"<\/em>. Tenga en cuenta que <code>como<\/code> distingue entre may\u00fasculas y min\u00fasculas, utilizamos <code>Funci\u00f3n.inferior<\/code> para transformar la cadena coincidente en su equivalente en min\u00fasculas. As\u00ed, la siguiente consulta devolver\u00e1 <em>\"hito\"<\/em> <code>tipo<\/code> documentos con <code>nombre<\/code> a juego <em>\"Museo de los Ingenieros Reales\"<\/em>, <em>\"museo real de ingenieros\"<\/em>, <em>\"MUSEO REAL DE INGENIEROS\"<\/em> etc.<\/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\">Partido Wildcard<\/h4>\n<p>Podemos utilizar <code>%<\/code> signo dentro de un <code>como<\/code> para hacer una coincidencia comod\u00edn con cero o m\u00e1s caracteres. El uso de comodines le permite tener cierta imprecisi\u00f3n en su cadena de b\u00fasqueda.<\/p>\n<p>En el ejemplo siguiente, buscamos documentos de <code>tipo<\/code> \"hito\" donde el <code>nombre<\/code> coincide con cualquier cadena que empiece por \"eng\" seguida de cero o m\u00e1s caracteres, la letra \"e\", seguida de cero o m\u00e1s caracteres. Una vez m\u00e1s, estamos utilizando <code>Funci\u00f3n.inferior<\/code> para que el caso de b\u00fasqueda sea insensible.<\/p>\n<p>La siguiente consulta devolver\u00e1 <em>\"hito\"<\/em> <code>tipo<\/code> documentos con <code>nombre<\/code> a juego <em>\"Ingenieros\"<\/em>, <em>\"motor\"<\/em>, <em>\"huevo ingl\u00e9s\"<\/em> , <em>\"\u00c1guila de Inglaterra\"<\/em> etc. Observe que las coincidencias pueden abarcar l\u00edmites de palabras.<\/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\">Coincidencia de caracteres comod\u00edn<\/h4>\n<p>Podemos utilizar <code>\"_\"<\/code> signo dentro de un <code>como<\/code> para realizar una coincidencia comod\u00edn con un \u00fanico car\u00e1cter.<\/p>\n<p>En el ejemplo siguiente, buscamos documentos de <code>tipo<\/code> \"hito\" donde el <code>nombre<\/code> coincide con cualquier cadena que empiece por \"eng\" seguida de exactamente 4 caracteres comod\u00edn y termine en la letra \"r\".<\/p>\n<p>Observe que, a diferencia de los ejemplos anteriores, no estamos utilizando <code>Funci\u00f3n.inferior<\/code> para transformar la cadena de b\u00fasqueda a min\u00fasculas. As\u00ed, la b\u00fasqueda distinguir\u00e1 entre may\u00fasculas y min\u00fasculas.<br \/>\nLa siguiente consulta devolver\u00e1 <em>\"hito\"<\/em> <code>tipo<\/code> documentos con <code>nombre<\/code> a juego <em>\"Ingeniero\"<\/em>, <em>\"Ingeniero1\"<\/em> etc.<\/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\">Coincidencia Regex<\/h4>\n<p>En <code>regex<\/code> puede utilizarse para coincidencias que distingan entre may\u00fasculas y min\u00fasculas. Similar al comod\u00edn <code>como<\/code> expresiones, <code>regex<\/code> La concordancia de patrones basada en expresiones le permite tener cierta imprecisi\u00f3n en su cadena de b\u00fasqueda.<\/p>\n<p>En el ejemplo siguiente, buscamos documentos de <code>tipo<\/code> \"hito\" donde el <code>nombre<\/code> coincide con cualquier cadena (en los l\u00edmites de las palabras) que empiece por \"eng\" seguida de exactamente 4 caracteres comod\u00edn y acabe en la letra \"r\". Una vez m\u00e1s, estamos utilizando <code>Funci\u00f3n.inferior<\/code> para que el caso de b\u00fasqueda sea insensible.<\/p>\n<p>La siguiente consulta devolver\u00e1 <em>\"hito\"<\/em> <code>tipo<\/code> documentos con <code>nombre<\/code> a juego <em>\"Motor\"<\/em>, <em>\"motor\"<\/em> etc. Tenga en cuenta que el <code>\\b<\/code> especifica que la coincidencia debe producirse en los l\u00edmites de palabra.<\/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 con propiedad nula o ausente<\/h3>\n<p>Una de las caracter\u00edsticas del lenguaje de consulta que lo diferencia de SQL es la posibilidad de consultar documentos con propiedades nulas o ausentes.<\/p>\n<p>En <code>isNullOrMissing()<\/code> se utiliza junto con la expresi\u00f3n <code>Expresi\u00f3n de propiedad<\/code> para comprobar si la propiedad especificada tiene un valor nulo o ausente. La direcci\u00f3n <code>isNullOrMissing()<\/code> hace lo contrario.<\/p>\n<p>En el ejemplo siguiente, buscamos todos los documentos en los que el campo <code>correo electr\u00f3nico<\/code> nula o ausente.<\/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\">Ordenaci\u00f3n de documentos<\/h3>\n<p>Es posible ordenar los resultados de una consulta en funci\u00f3n del resultado de una expresi\u00f3n determinada.<\/p>\n<p>El siguiente ejemplo devuelve documentos de <code>tipo<\/code> igual a <em>\"hotel\"<\/em> ordenados en orden ascendente por el valor de la variable <code>t\u00edtulo<\/code> propiedad.<\/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\">Manipulaci\u00f3n de cadenas<\/h3>\n<p>Las capacidades de manipulaci\u00f3n de cadenas son integrales para cualquier procesamiento de datos. En ejemplos anteriores, vimos c\u00f3mo el <code>Funci\u00f3n.inferior<\/code> se puede utilizar para transformar una cadena a min\u00fasculas equivalentes para realizar comparaciones de cadenas sin distinci\u00f3n entre may\u00fasculas y min\u00fasculas.<\/p>\n<p>Couchbase Lite soporta las siguientes funciones de procesamiento de cadenas.<\/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>El ejemplo siguiente devuelve los documentos de <code>correo electr\u00f3nico<\/code> contiene la subcadena <em>\"natgeo.org\"<\/em>. En <code>nombre<\/code> se convierte a may\u00fasculas en la respuesta.<\/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\">Intercalaci\u00f3n<\/h4>\n<p>Las funciones de intercalaci\u00f3n mejoran las capacidades de comparaci\u00f3n y ordenaci\u00f3n de cadenas, ya que admiten cadenas unicode, manipulaci\u00f3n de cadenas en funci\u00f3n de la configuraci\u00f3n regional y funciones espec\u00edficas de cada idioma, como los diacr\u00edticos. Puede obtener m\u00e1s informaci\u00f3n sobre la intercalaci\u00f3n en <a href=\"https:\/\/github.com\/couchbase\/couchbase-lite-core\/wiki\/JSON-Query-Schema#collation\">redacci\u00f3n <\/a> por Jens Alfke.<\/p>\n<p>El ejemplo siguiente define las reglas de intercalaci\u00f3n para que se ignoren las may\u00fasculas y los acentos. Este intercalador se aplica a la funci\u00f3n de comparaci\u00f3n de cadenas en el campo <code>nombre<\/code> propiedad. Los resultados incluir\u00e1n documentos en los que <code>nombre<\/code> es igual a cadenas como \"Hotel Novotel Paris La Defense\" , \"Hotel Novotel Paris La D\u00e9fense\", etc.<\/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>Existen algunas limitaciones en el soporte de la Cotejo - en el momento de escribir este post, no se puede utilizar con consultas de concordancia de patrones tales como <code>como<\/code> y <code>regex<\/code> .<\/p>\n<h3 id=\"stringmanipulation\">Parametrizaci\u00f3n<\/h3>\n<p>Una de las caracter\u00edsticas m\u00e1s potentes de la interfaz de consulta es la posibilidad de establecer par\u00e1metros en una consulta. Esto le da la flexibilidad de actualizar los valores de los par\u00e1metros de una consulta en cualquier momento sin tener que volver a crear o reiniciar la consulta. Al cambiar los par\u00e1metros de la consulta, \u00e9sta se reiniciar\u00e1 autom\u00e1ticamente y los nuevos par\u00e1metros surtir\u00e1n efecto.<\/p>\n<p>Refiri\u00e9ndonos al modelo de datos anterior, supongamos que desea obtener documentos en los que el n\u00famero\u00a0<code>p\u00fablico-gustos<\/code>\u00a0est\u00e1 dentro de un rango determinado. En el ejemplo siguiente, buscamos \"hotel\". <code>tipo<\/code>\u00a0documentos en los que el n\u00famero de <code>p\u00fablico-gustos<\/code>\u00a0est\u00e1 entre 5 y 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>Tenga en cuenta que el ejemplo anterior, usted puede haber notado el uso de <code>ArrayFunction<\/code>. Couchbase Lite 2.0 nos proporciona un amplio soporte para la manipulaci\u00f3n de arrays. Esto ser\u00e1 discutido m\u00e1s adelante en este <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-array-collections-couchbase-mobile\/\">entrada del blog sobre colecciones.<\/a><\/p>\n<h3 id=\"whatnext\">\u00bfQu\u00e9 sigue?<\/h3>\n<p>Esta entrada de blog te dio un vistazo a la nueva y poderosa Interfaz de Consulta soportada en Couchbase Lite 2.0. Puedes descargar las versiones preliminares de Couchbase Mobile 2.0 desde nuestro <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">descargas<\/a> p\u00e1gina.<\/p>\n<p>Aqu\u00ed hay otros posts relacionados con Couchbase Mobile Query que pueden ser de inter\u00e9s<br \/>\n- Este <a href=\"https:\/\/www.couchbase.com\/blog\/es\/full-text-search-couchbase-mobile-2-0\/\">entrada del blog<\/a> analiza las funciones de b\u00fasqueda de texto completo.<br \/>\n- Este <a href=\"https:\/\/www.couchbase.com\/blog\/es\/querying-array-collections-couchbase-mobile\/\">entrada del blog<\/a> explica c\u00f3mo consultar colecciones de matrices<br \/>\n- Este <a href=\"https:\/\/www.couchbase.com\/blog\/es\/join-queries-couchbase-mobile\/\">entrada del blog<\/a> explica c\u00f3mo realizar consultas JOIN<\/p>\n<p>Si tiene alguna pregunta o sugerencia, deje un comentario a continuaci\u00f3n o p\u00f3ngase en contacto conmigo en Twitter\u00a0<a href=\"https:\/\/twitter.com\/rajagp\">@rajagp<\/a>\u00a0o env\u00edeme un correo electr\u00f3nico\u00a0<a href=\"mailto:priya.rajagopal@couchbase.com\">priya.rajagopal@couchbase.com<\/a>.  En\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Foros de Couchbase<\/a> son otro buen lugar para plantear preguntas.<\/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 v26.0 (Yoast SEO v26.0) - 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\/es\/sql-for-json-query-interface-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Presentaci\u00f3n de la interfaz de consulta en Couchbase Mobile 2.0","description":"Couchbase Mobile 2.0 soporta una nueva interfaz de consulta basada en N1QL, el lenguaje de consulta declarativo de Couchbase que extiende SQL para 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\/es\/sql-for-json-query-interface-couchbase-mobile\/","og_locale":"es_MX","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\/es\/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":"es","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":"Presentaci\u00f3n de la interfaz de consulta en 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 soporta una nueva interfaz de consulta basada en N1QL, el lenguaje de consulta declarativo de Couchbase que extiende SQL para JSON.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sql-for-json-query-interface-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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, Directora de Gesti\u00f3n de Productos","image":{"@type":"ImageObject","inLanguage":"es","@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 es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/es\/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","author_category":"","last_name":"Rajagopal, Senior Director, Product Management","first_name":"Priya","job_title":"","user_url":"","description":"Priya Rajagopal es directora s\u00e9nior de gesti\u00f3n de productos en Couchbase y responsable de las plataformas de desarrollo para la nube y el per\u00edmetro. Lleva m\u00e1s de 20 a\u00f1os dedic\u00e1ndose profesionalmente al desarrollo de software en varios puestos de liderazgo t\u00e9cnico y de producto, con m\u00e1s de 10 a\u00f1os centrados en tecnolog\u00edas m\u00f3viles. Como delegada de est\u00e1ndares IPTV de TISPAN, fue una colaboradora clave en las especificaciones de est\u00e1ndares IPTV. Tiene 22 patentes en las \u00e1reas de redes y seguridad de plataformas."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4187","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4187"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4187\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4188"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4187"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4187"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4187"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4187"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}