{"id":4410,"date":"2018-01-03T10:28:26","date_gmt":"2018-01-03T18:28:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4410"},"modified":"2025-06-13T20:09:25","modified_gmt":"2025-06-14T03:09:25","slug":"querying-array-collections-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/querying-array-collections-couchbase-mobile\/","title":{"rendered":"C\u00f3mo consultar colecciones de matrices en Couchbase Lite"},"content":{"rendered":"<p>Una de las principales caracter\u00edsticas introducidas en <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/2.0\/whatsnew.html\">Couchbase Lite 2.0<\/a>es la nueva interfaz de consulta basada 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. Cubrimos los fundamentos de la interfaz en un anterior <a href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-for-json-query-interface-couchbase-mobile\/\">entrada del blog<\/a>. Las matrices son un componente integral del modelado de datos con JSON. En esta entrada del blog, hablaremos de la consulta de colecciones de matrices mediante la nueva API.<\/p>\n<p>En este blog se da por sentado que usted conoce los fundamentos, as\u00ed que si a\u00fan no lo ha hecho, aseg\u00farese de revisar la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-for-json-query-interface-couchbase-mobile\/\">entrada anterior<\/a> primero. La \u00faltima secci\u00f3n de la entrada contiene enlaces a otros blogs de consulta relevantes.<\/p>\n<div>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>\u00a0p\u00e1gina.<\/div>\n<div><\/div>\n<p><!--more--><\/p>\n<h3 id=\"background\">Fondo<\/h3>\n<p>Si estabas usando versiones 1.x de Couchbase Mobile, probablemente est\u00e9s familiarizado con <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 comentan utilizan Swift para iOS, ten en cuenta que, salvo algunas peque\u00f1as diferencias, la misma interfaz de consulta tambi\u00e9n es compatible con las plataformas Android y Windows. Por lo tanto, con algunos ajustes menores, deber\u00edas poder reutilizar los ejemplos de consulta 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<\/li>\n<\/ul>\n<pre><code>$ git clone https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground<\/code><\/pre>\n<ul>\n<li>Siga las instrucciones de instalaci\u00f3n en el <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-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> . A continuaci\u00f3n se muestra el modelo de documento JSON. Por brevedad, hemos omitido algunas de las propiedades del modelo a continuaci\u00f3n.<\/p>\n<p>En concreto, obs\u00e9rvese que el modelo incluye colecciones anidadas - <code>me gusta_p\u00fablico<\/code> y <code>rese\u00f1as<\/code>. Las consultas de las secciones siguientes tratar\u00e1n de estas colecciones anidadas.<\/p>\n<pre><code> {\r\n \"type\": \"hotel\",\r\n \"name\": \"Medway Youth Hostel\",\r\n \"address\": \"Capstone Road, ME7 3JE\",\r\n \"city\": \"Medway\",\r\n \"country\": \"United Kingdom\",\r\n \"description\": \"blah blah\",\r\n \"public_likes\": [\r\n \"Julius Tromp I\",\r\n \"Corrine Hilll\"\r\n ],\r\n \"reviews\": [\r\n {\r\n \"author\": \"Ozella Sipes\",\r\n \"content\": \"blah blah.\",\r\n \"date\": \"2013\u201306\u201322 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 5,\r\n \"Location\": 4,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n },\r\n {\r\n \"author\": \"Jeremy Snapes\",\r\n \"content\": \"blah blah.\",\r\n \"date\": \"2013\u201305\u201305 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 2,\r\n \"Location\": 2,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n }\r\n ],\r\n  \"url\":\"https:\/\/www.yha.org.uk\",\r\n    \"vacancy\": true\r\n    }<\/code><\/pre>\n<p>** Consulte el modelo anterior para cada uno de los ejemplos de consulta a continuaci\u00f3n. **<\/p>\n<h3 id=\"thedatabasehandle\">El asa de la base de datos<\/h3>\n<p>En las consultas siguientes, 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> var options = DatabaseConfiguration()\r\n let db = try Database(name: kDBName, config: options)<\/code><\/pre>\n<h3 id=\"indexes\">\u00cdndices<\/h3>\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<h3 id=\"arraycontainment\">Contenci\u00f3n de matrices<\/h3>\n<p>La siguiente consulta recupera los <em>ids<\/em>, <em>nombres<\/em> y <em>me gusta_p\u00fablico<\/em> propiedades de los documentos en los que <code>me gusta_p\u00fablico<\/code> en <em>\"hotel\"<\/em> <code>tipo<\/code> contiene el valor de <em>\"Corrine Hilll\"<\/em>. Para ello, el <code>**ArrayFunction.contains**<\/code> se utiliza en la funci\u00f3n <code>me gusta_p\u00fablico<\/code> matriz.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">let searchQuery = QueryBuilde.select(SelectResult.expression(Meta.id),\r\n                  SelectResult.expression(Expression.property(\"name\")),\r\n                  SelectResult.expression(Expression.property(\"public_likes\")))\r\n .from(DataSource.database(db))\r\n .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\"))\r\n .and( ArrayFunction.contains(Expression.property(\"public_likes\"), value: Expression.string(\"Corrine Hilll\"))))<\/pre>\n<h3 id=\"arraysize\">Tama\u00f1o de la matriz<\/h3>\n<p>La siguiente consulta recupera los <em>ids<\/em>, <em>nombres<\/em> y las propiedades <strong>talla<\/strong> de <em>me gusta_p\u00fablico<\/em> en <em>\"hotel\"<\/em> <code>tipo<\/code> documentos. Para ello, el <code>**ArrayFunction.length**<\/code> se utiliza en la funci\u00f3n <code>me gusta_p\u00fablico<\/code> para obtener el tama\u00f1o de la matriz.<\/p>\n<p>Adem\u00e1s, observe que estamos utilizando <code>como<\/code> expresi\u00f3n a <em>alias<\/em> el valor del recuento del array a <em>NumLikes<\/em>. Hab\u00edamos introducido <em>alias<\/em> en la entrada anterior del blog sobre Fundamentos de la consulta. Si no se asigna un alias al resultado de la consulta <code>arrayLength<\/code> la clave de la propiedad ser\u00eda <code>$1<\/code> lo cual no es muy intuitivo.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder.select(SelectResult.expression(Meta.id),\r\n           SelectResult.expression(Expression.property(\"name\")),\r\n           SelectResult.expression(ArrayFunction.length(Expression.property(\"public_likes\"))).as(\"NumLikes\"))\r\n .from(DataSource.database(db))\r\n .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\")))\r\n .limit(Expression.int(limit))<\/pre>\n<h3 id=\"evaluatingarraymembers\">Evaluaci\u00f3n de los miembros de la matriz<\/h3>\n<p>Mientras que el <code>ArrayFunction.contains<\/code> le permite comprobar si la matriz dada contiene un valor espec\u00edfico, la funci\u00f3n <code>en<\/code> se puede utilizar para evaluar uno o todos los miembros de una matriz en funci\u00f3n de un criterio especificado por la variable <code>satisface<\/code> expresi\u00f3n. Se trata de una potente funci\u00f3n de filtrado de documentos.<\/p>\n<p>En<code>en<\/code>se utiliza con la expresi\u00f3n <code>cualquier<\/code>, <code>cada<\/code> o el <code>anyAndEvery<\/code> operadores cuantificados en <code>ArrayExpression<\/code> para evaluar cualquier, todos o cualquier\/todos los elementos del objeto array.<\/p>\n<p>La siguiente consulta devuelve los documentos en los que <code>cualquier<\/code> de los valores del <code>me gusta_p\u00fablico<\/code> comienza con los caracteres \"Corr\".<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">\/\/1.\r\n let VAR_LIKEDBY = ArrayExpression.variable(\"likedby\")\r\n \r\n\/\/2.\r\n let searchQuery = QueryBuilder.select(SelectResult.expression(Meta.id),\r\n                  SelectResult.expression((Expression.property(\"public_likes\"))))\r\n.from(DataSource.database(db))\r\n.where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\"))\r\n.and(ArrayExpression.any(VAR_LIKEDBY).in(Expression.property(\"public_likes\"))\r\n.satisfies(VAR_LIKEDBY.like(Expression.string(\"Cor%\")))))\r\n.limit(Expression.int(limit))<code><\/code><\/pre>\n<ol>\n<li style=\"list-style-type: none\">\n<ol>\n<li>Declara una variable con el nombre \"likedby\" para representar cada elemento en el <code>me gusta_p\u00fablico<\/code> matriz<\/li>\n<li>En <code>cualquier<\/code> ArrayExpression comprueba si el elemento del array representado por la variable <code>me gustaen<\/code> cumple los criterios de la <code>como<\/code> expresi\u00f3n. El sitio <code>como<\/code> comprueba si el valor del elemento representado por la variable \"likedby\" empieza por \"Cor\".<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h3 id=\"indexingarrays\">Indexaci\u00f3n de matrices<\/h3>\n<p>Tambi\u00e9n puede consultar elementos en \u00edndices espec\u00edficos. La siguiente consulta devuelve el \u00edndice <code>nombre<\/code> y primer miembro de la <code>me gusta_p\u00fablico<\/code> matriz de propiedades de todos los documentos \"hotel<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> let searchQuery = QueryBuilder.select(SelectResult.expression(Meta.id),\r\n           SelectResult.expression(Expression.property(\"name\")),\r\n           SelectResult.expression(Expression.property(\"public_likes[0]\")))\r\n .from(DataSource.database(db))\r\n .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\")))\r\n .limit(Expression.int(limit))<\/pre>\n<h3 id=\"evaluatingnestedarrays\">Evaluaci\u00f3n de matrices anidadas<\/h3>\n<p>Puede evaluar los miembros de un array anidado. Para ello, puede aplicar un <code>ruta de acceso<\/code> a la expresi\u00f3n de la variable. La matriz anidada debe tener un nivel de profundidad.<\/p>\n<p>La siguiente consulta devuelve los documentos en los que <code>cualquier<\/code> de los valores anidados <code>clasificaciones<\/code> tiene el valor <code>En general<\/code> calificaci\u00f3n de la propiedad superior o igual a 4.<br \/>\nComo habr\u00e1 observado en el modelo de datos anterior, la propiedad \"reviews\" contiene una matriz de objetos. Cada uno de los objetos contiene un <code>clasificaciones<\/code> que a su vez contiene la matriz <code>En general<\/code> propiedad.<\/p>\n<pre class=\"wrap:true lang:swift decode:true\">\/\/ 1.\r\n let VAR_OVERALL = ArrayExpression.variable(\"review.ratings.Overall\")\r\n \/\/2.\r\n let VAR_REVIEWS = ArrayExpression.variable(\"review\")\r\n \/\/3.\r\n let 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(ArrayExpression.any(VAR_REVIEWS).in(Expression.property(\"reviews\"))\r\n .satisfies(VAR_OVERALL.greaterThanOrEqualTo(Expression.int(4)))))\r\n .limit(Expression.int(limit))<\/pre>\n<ol>\n<li>Declarar una variable para representar un elemento del <code>review.ratings.Overall<\/code> matriz<\/li>\n<li>Declarar una variable para representar cada elemento del <code>rese\u00f1as<\/code> matriz<\/li>\n<li>En <code>cualquier<\/code> comprueba si el elemento de la matriz representado por <code>revise<\/code> cumple los criterios de la <code>comparaci\u00f3n<\/code> expresi\u00f3n. El sitio <code>comparaci\u00f3n<\/code> comprueba el valor de <code>En general<\/code> propiedad del <code>clasificaciones<\/code> en el objeto representado por la variable \"review\" es mayor o igual que 4.<\/li>\n<\/ol>\n<h3 id=\"limitations\">Limitaciones<\/h3>\n<p>Las capacidades de manipulaci\u00f3n de matrices no son tan amplias como las de N1QL <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.0\/n1ql\/n1ql-language-reference\/arrayfun.html\">conjunto de caracter\u00edsticas<\/a>. Pero es un buen punto de partida. Estas capacidades pueden estar disponibles en futuras versiones de Couchbase Mobile.<\/p>\n<p>As\u00ed que, por ahora, depende de la aplicaci\u00f3n manipular los resultados del array utilizando las capacidades de procesamiento de colecciones del lenguaje.<\/p>\n<p>Veamos este ejemplo en swift<\/p>\n<ul>\n<li>Refiri\u00e9ndonos al modelo de datos, digamos que desea determinar el <em>m\u00ednimo<\/em> <code>Limpieza<\/code> para un hotel determinado en funci\u00f3n de las opiniones sobre el mismo.<\/li>\n<\/ul>\n<p>Del modelo anterior , obs\u00e9rvese que el <code>Limpieza<\/code> es un miembro de la propiedad <code>clasificaciones<\/code> contenida en cada objeto miembro de <code>rese\u00f1as<\/code> matriz.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/12\/array_model_1.png\" alt=\"\" \/><\/figure>\n<p>Para ello, puede realizar una consulta a Couchbase Lite para obtener el archivo <code>rese\u00f1as<\/code> para un hotel con Id especificado de la siguiente manera -<\/p>\n<pre class=\"wrap:true lang:swift decode:true\"> \/\/ 1. Query for reviews property array for the given hotel\r\n let searchQuery = QueryBuilder.select( \r\n        SelectResult.expression(Expression.property(\"reviews\")))\r\n .from(DataSource.database(db))\r\n .where(Expression.property(\"type\").equalTo(Expression.string(\"hotel\"))\r\n .and(Meta.id.equalTo(Expression.string(\"hotel_10025\"))))<\/pre>\n<p>En <code>resultSet<\/code> La respuesta a la consulta anterior ser\u00eda un array con un \u00fanico elemento. Este elemento corresponder\u00eda al documento \"hotel\" para el Id especificado.<\/p>\n<pre><code>[\r\n {\r\n \"reviews\": [\r\n {\r\n \"author\": \"Ozella Sipes\",\r\n \"content\": \"blah\",\r\n \"date\": \"2013\u201306\u201322 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 5,\r\n \"Location\": 4,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n },\r\n {\r\n \"author\": \"fuzzy Snipes\",\r\n \"content\": \"blah\",\r\n \"date\": \"2013\u201306\u201322 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 2,\r\n \"Location\": 3,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n }\r\n ]\r\n }\r\n]<\/code><\/pre>\n<p>Ahora, la aplicaci\u00f3n tiene que implementar la l\u00f3gica para iterar sobre los archivos <code>rese\u00f1as<\/code> y, para cada miembro de la matriz, obtener el archivo <code>clasificaciones<\/code> y la propiedad <code>Limpieza<\/code> valor.<\/p>\n<p>He aqu\u00ed una posible forma de hacerlo en swift.<\/p>\n<ul>\n<li>Primero, iteramos sobre el resultSet y extraemos el valor de la propiedad \"reviews\".<\/li>\n<\/ul>\n<pre class=\"wrap:true lang:swift decode:true\"> var matches:[[String:Any]] = [[String:Any]]()\r\n do {\r\n       for row in try searchQuery.execute() {\r\n          if let reviewData = row.array(forKey: \"reviews\")?.toArray() as? [[String:Any]] {\r\n          matches.append(reviewData)\r\n      }\r\n    }\r\n }<\/pre>\n<p>Tras el procesamiento del bucle, la matriz \"matches\" ser\u00eda algo parecido a lo que se muestra a continuaci\u00f3n. Ser\u00eda un array que contendr\u00eda el array anidado correspondiente a las rese\u00f1as -<\/p>\n<pre><code>[\r\n [\r\n {\r\n \"author\": \"Ozella Sipes\",\r\n \"content\": \"blah\",\r\n \"date\": \"2013\u201306\u201322 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 5,\r\n \"Location\": 4,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n },\r\n {\r\n \"author\": \"fuzzy Snipes\",\r\n \"content\": \"blah\",\r\n \"date\": \"2013\u201306\u201322 18:33:50 +0300\",\r\n \"ratings\": {\r\n \"Cleanliness\": 2,\r\n \"Location\": 3,\r\n \"Overall\": 4,\r\n \"Rooms\": 3,\r\n \"Service\": 5,\r\n \"Value\": 4\r\n }\r\n }\r\n ]\r\n]\r\n<\/code><\/pre>\n<ul>\n<li>A continuaci\u00f3n, puede utilizar funciones del lenguaje swift como <code>flatMap<\/code> y <code>mapa<\/code> procesar la matriz resultante para obtener la calificaci\u00f3n m\u00ednima de \"Limpieza\" de un hotel determinado<\/li>\n<\/ul>\n<pre class=\"wrap:true lang:swift decode:true\">let minCleanlinessValue = matches.flatMap{$0}\r\n .map{return ($0[\"ratings\"] as? [String:Any])?[\"Cleanliness\"] as? Int}\r\n .flatMap{$0}\r\n .min { (a, b) -&gt; Bool in\r\n      return a &lt; b\r\n }<\/pre>\n<p>Se har\u00eda algo similar en lenguajes que soportan construcciones funcionales como <code>mapa plano<\/code> y <code>mapa<\/code>.<\/p>\n<h3 id=\"whatnext\">\u00bfQu\u00e9 sigue?<\/h3>\n<p>En esta entrada de blog vimos c\u00f3mo puedes manejar tipos de colecci\u00f3n Array usando el nuevo Query API en Couchbase Mobile 2.0. Esto es un comienzo. Espera ver m\u00e1s funcionalidades en futuras versiones. Puedes descargar la versi\u00f3n preliminar de 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\/sql-for-json-query-interface-couchbase-mobile\/\">entrada del blog<\/a> analiza los fundamentos de la API de consulta<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\/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>","protected":false},"excerpt":{"rendered":"<p>One of the major features introduced in Couchbase Lite 2.0, is the new Query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON. If you are familiar with SQL, you will feel right at home with [&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":[1811,1815,7667,1810,1812],"tags":[1536,1909],"ppma_author":[8948],"class_list":["post-4410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","category-n1ql-query","tag-ios","tag-swift"],"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>Query Array Collections in Couchbase Lite Using New API<\/title>\n<meta name=\"description\" content=\"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.\" \/>\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\/querying-array-collections-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Query Array Collections in Couchbase Lite\" \/>\n<meta property=\"og:description\" content=\"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/querying-array-collections-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-03T18:28:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:09:25+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=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"How to Query Array Collections in Couchbase Lite\",\"datePublished\":\"2018-01-03T18:28:26+00:00\",\"dateModified\":\"2025-06-14T03:09:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/\"},\"wordCount\":1333,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"keywords\":[\"ios\",\"swift\"],\"articleSection\":[\".NET\",\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/\",\"name\":\"Query Array Collections in Couchbase Lite Using New API\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png\",\"datePublished\":\"2018-01-03T18:28:26+00:00\",\"dateModified\":\"2025-06-14T03:09:25+00:00\",\"description\":\"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/querying-array-collections-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\/querying-array-collections-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Query Array Collections in Couchbase Lite\"}]},{\"@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":"Query Array Collections in Couchbase Lite Using New API","description":"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.","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\/querying-array-collections-couchbase-mobile\/","og_locale":"es_MX","og_type":"article","og_title":"How to Query Array Collections in Couchbase Lite","og_description":"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/querying-array-collections-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-01-03T18:28:26+00:00","article_modified_time":"2025-06-14T03:09:25+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":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"How to Query Array Collections in Couchbase Lite","datePublished":"2018-01-03T18:28:26+00:00","dateModified":"2025-06-14T03:09:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/"},"wordCount":1333,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","keywords":["ios","swift"],"articleSection":[".NET","Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/","name":"Query Array Collections in Couchbase Lite Using New API","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/11\/feature_image.png","datePublished":"2018-01-03T18:28:26+00:00","dateModified":"2025-06-14T03:09:25+00:00","description":"In this Couchbase blog post, we will discuss array query collections conducted using Couchbase Lite, the new API query interface based on N1QL.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/querying-array-collections-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/querying-array-collections-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\/querying-array-collections-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Query Array Collections in Couchbase Lite"}]},{"@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\/4410","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=4410"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4410\/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=4410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4410"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}