{"id":9023,"date":"2020-08-04T07:00:04","date_gmt":"2020-08-04T14:00:04","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=9023"},"modified":"2025-06-13T23:42:32","modified_gmt":"2025-06-14T06:42:32","slug":"arrays-in-json-modeling-querying-and-indexing","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/arrays-in-json-modeling-querying-and-indexing\/","title":{"rendered":"Arrays en JSON: modelado, consulta y rendimiento de indexaci\u00f3n"},"content":{"rendered":"<blockquote><p><span style=\"font-weight: 400\">La matriz es <strong>LA<\/strong> diferencia entre el modelo relacional y el modelo JSON.   - <a href=\"https:\/\/twitter.com\/N1QL\/status\/804472885096026112\">Gerald Sangudi<\/a><\/span><\/p><\/blockquote>\n<h4>Resumen<\/h4>\n<p>JSON array te da flexibilidad en el tipo de elementos, n\u00famero de elementos, tama\u00f1o de los elementos, y la profundidad de los elementos.  Esto se suma a la flexibilidad de las bases de datos operacionales JSON como Couchbase y MongoDB. El rendimiento de las consultas con un predicado de matriz en bases de datos operativas depende de los \u00edndices de matriz. Sin embargo, los \u00edndices de matrices en estas bases de datos vienen con importantes <a href=\"https:\/\/docs.mongodb.com\/manual\/core\/index-multikey\/#limitations\">limitaciones.<\/a> Por ejemplo, s\u00f3lo se permite una clave de matriz por \u00edndice. Los \u00edndices de arrays, incluso cuando se crean, s\u00f3lo pueden procesar predicados AND eficientemente.  La pr\u00f3xima versi\u00f3n de Couchbase 6.6 elimina estas limitaciones de JSON usando un \u00edndice invertido integrado para indexar y consultar arrays en N1QL.  Este art\u00edculo explica los antecedentes y el funcionamiento de esta novedosa implementaci\u00f3n.<\/p>\n<h4>Introducci\u00f3n<\/h4>\n<p>Un array es un tipo b\u00e1sico integrado en <a href=\"https:\/\/www.json.org\/json-en.html\">JSON<\/a>\u00a0definido como\u00a0<em>En\u00a0<i>matriz<\/i>\u00a0es una colecci\u00f3n ordenada de valores. Un array empieza por\u00a0<tt>[<\/tt><small>soporte izquierdo<\/small>\u00a0y termina con\u00a0<tt>]<\/tt><small>soporte derecho<\/small>. Los valores est\u00e1n separados por\u00a0<tt>,<\/tt><small>coma<\/small>.\u00a0<\/em>Una matriz le ofrece flexibilidad porque puede contener un n\u00famero arbitrario de valores escalares, vectoriales y de objeto. Un perfil de usuario puede tener un array de aficiones, un perfil de cliente un array de coches, un perfil de miembro un array de amigos. Couchbase N1QL proporciona un <a href=\"https:\/\/www.slideshare.net\/journalofinformix\/utilizing-arrays\">rico conjunto de operadores<\/a> para manipular matrices; MongoDB tiene una lista de <a href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/query-arrays\/\">operadores para manejar matrices<\/a> tambi\u00e9n.<\/p>\n<p><span style=\"font-weight: 400\">Antes de empezar a consultar, necesitas modelar tus datos en arrays. Todas las bases de datos de documentos JSON como Couchbase, MongoDB te recomiendan desnormalizar tu modelo de datos para mejorar tu rendimiento y appdev. Lo que eso significa es, transformar tu relaci\u00f3n 1:N en un \u00fanico documento incrustando el N en 1. En JSON, har\u00edas eso usando un array.  En el ejemplo de abajo, el documento(1) contiene 8 (N) gustos. En lugar de almacenar una referencia de clave externa a otra tabla, en JSON, almacenamos los datos en l\u00ednea.\u00a0<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 whitespace-before:2 whitespace-after:1 lang:js decode:true\">            \"public_likes\": [\r\n                \"Julius Tromp I\",\r\n                \"Corrine Hilll\",\r\n                \"Jaeden McKenzie\",\r\n                \"Vallie Ryan\",\r\n                \"Brian Kilback\",\r\n                \"Lilian McLaughlin\",\r\n                \"Ms. Moses Feeney\",\r\n                \"Elnora Trantow\"\r\n            ],<\/pre>\n<p><span style=\"font-weight: 400\">Los valores aqu\u00ed son matrices de cadenas. En JSON, cada elemento puede ser de cualquier tipo JSON v\u00e1lido: escalares (num\u00e9ricos, cadenas, etc.) u objetos o vectores (matrices).  Cada documento de hotel contiene una matriz de rese\u00f1as.  Este es el proceso de desnormalizaci\u00f3n.  Conversi\u00f3n de m\u00faltiples relaciones 1:N en un \u00fanico objeto hotel que contiene N public_likes y M reviews.  Con esto, el objeto hotel contiene dos matrices: public_likes y reviews.  Puede haber cualquier n\u00famero de valores de cualquier tipo bajo estas matrices.  Este es el factor clave que contribuye a la flexibilidad del esquema JSON.  Cuando necesites a\u00f1adir nuevos gustos o comentarios, simplemente a\u00f1ade un nuevo valor o un objeto a esto.\u00a0<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 whitespace-before:2 whitespace-after:1 lang:js decode:true\">  \"reviews\": [\r\n                {\r\n                    \"author\": \"Ozella Sipes\",\r\n                    \"content\": \"This was our 2nd trip here...\",\r\n                    \"date\": \"2013-06-22 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\": \"Barton Marks\",\r\n                    \"content\": \"We found the hotel ...\",\r\n                    \"date\": \"2015-03-02 19:56:13 +0300\",\r\n                    \"ratings\": {\r\n                        \"Business service (e.g., internet access)\": 4,\r\n                        \"Check in \/ front desk\": 4,\r\n                        \"Cleanliness\": 4,\r\n                        \"Location\": 4,\r\n                        \"Overall\": 4,\r\n                        \"Rooms\": 3,\r\n                        \"Service\": 3,\r\n                        \"Value\": 5\r\n                    }\r\n                }\r\n            ],\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Al igual que el objeto del hotel anterior, si desnormalizas tu modelo de datos en JSON, puede haber muchas matrices para cada objeto. Los perfiles tienen matrices para aficiones, coches, tarjetas de cr\u00e9dito, preferencias, etc. Cada una de ellas puede ser escalar (simples valores num\u00e9ricos\/cadenas\/booleanos) o vectores (matrices de otros escalares, matrices de objetos, etc.).\u00a0<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Una vez modelados y almacenados los datos, hay que procesarlos: seleccionar, unir, proyectar. Couchbase <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\"><span style=\"font-weight: 400\">N1QL<\/span><\/a><span style=\"font-weight: 400\"> (SQL para JSON) proporciona un lenguaje expresivo para hacer esto y mucho m\u00e1s.   Estos son los casos de uso m\u00e1s comunes.<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 wrap:true whitespace-before:02 whitespace-after:02 lang:mysql decode:true\" title=\"CASO DE USO 1.\">1. Find all the documents with a simple value can be done by either of the following queries.\r\n\r\nSELECT *\r\nFROM `travel-sample`\r\nWHERE type = \"hotel\"\r\n    AND ANY p IN public_likes SATISFIES p = \"Vallie Ryan\" END\r\n\r\n\r\nSELECT t\r\nFROM `travel-sample` t\r\n      UNNEST t.public_likes AS p\r\nWHERE t.type = \"hotel\"\r\n    AND p = \"Vallie Ryan\"\r\n<\/pre>\n<pre class=\"theme:eclipse font-size:17 line-height:20 wrap:true whitespace-before:02 whitespace-after:02 lang:mysql decode:true\" title=\"CASO DE USO 2.\">2. Find all the documents that match a range.  In this case, we try to find all the documents that have atleast one rating has \u201cOverall\u201d &gt; 4\r\n\r\nSELECT COUNT(1)\r\nFROM `travel-sample`\r\nWHERE type = \"hotel\"\r\n    AND ANY r IN reviews SATISFIES r.ratings.Overall &gt; 4 END\r\n\r\nSELECT COUNT(1) \r\nFROM `travel-sample` t\r\nUNNEST reviews AS r\r\nWHERE t.type = \"hotel\"\r\n    AND r.ratings.Overall &gt; 4\r\nGROUP BY t.type\r\n\r\n<\/pre>\n<pre class=\"theme:eclipse font-size:17 line-height:20 height-set:true wrap:true whitespace-before:02 whitespace-after:02 lang:default mark:1 decode:true\" title=\"CASO DE USO 3.\">3. Find all the documents where every rating for  \u201cOverall\u201d &gt; 4\r\n\r\nSELECT * FROM `travel-sample` WHERE type = \u2018hotel\u2019 AND ANY AND EVERY r in reviews SATISFIES r.Overall &gt; 4 END\r\n\r\nSELECT COUNT(1)\r\nFROM `travel-sample`\r\nWHERE type = \"hotel\"\r\n    AND ANY\r\n    AND EVERY r IN reviews SATISFIES r.ratings.Overall &gt; 4 END\r\n\r\nSELECT reviews[*].ratings[*].Overall\r\nFROM `travel-sample`\r\nWHERE type = \"hotel\"\r\n    AND ANY\r\n    AND EVERY r IN reviews SATISFIES r.ratings.Overall &gt; 4 END\r\nlimit 10;\r\n\r\n\t[\r\n    {\r\n        \"Overall\": [\r\n            5\r\n        ],\r\n        \"name\": \"The Bulls Head\"\r\n    },\r\n    {\r\n        \"Overall\": [\r\n            5,\r\n            5,\r\n            5,\r\n            5,\r\n            5\r\n        ],\r\n        \"name\": \"La Pradella\"\r\n    },\r\n    {\r\n        \"Overall\": [\r\n            5,\r\n            5,\r\n            5\r\n        ],\r\n        \"name\": \"Culloden House Hotel\"\r\n    },\r\n    {\r\n        \"Overall\": [\r\n            5\r\n        ],\r\n        \"name\": \"Auberge-Camping Bagatelle\"\r\n    },\r\n    {\r\n        \"Overall\": [\r\n            5,\r\n            5\r\n        ],\r\n        \"name\": \"Avignon Hotel Monclar\"\r\n    }\r\n    ]\r\n<\/pre>\n<h4>Indexaci\u00f3n de matrices:<\/h4>\n<p><span style=\"font-weight: 400\">La indexaci\u00f3n de matrices es un reto para los \u00edndices basados en \u00e1rboles B.  Sin embargo, la base de datos JSON tiene que hacerlo para cumplir los requisitos de rendimiento: <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/index-multikey\/\"><span style=\"font-weight: 400\">MongoDB lo hace<\/span><\/a><span style=\"font-weight: 400\">; <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/indexing-arrays.html\"><span style=\"font-weight: 400\">Couchbase lo hace<\/span><\/a><span style=\"font-weight: 400\">. Sin embargo, ambos tienen sus limitaciones.  S\u00f3lo se puede tener una clave de matriz dentro de un \u00edndice.  Esto es<\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/core\/index-multikey\/#limitations\"><span style=\"font-weight: 400\"> verdadero de MongoDB<\/span><\/a><span style=\"font-weight: 400\">esto es <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/indexing-arrays.html#syntax\"><span style=\"font-weight: 400\">verdadero de Couchbase N1QL<\/span><\/a><span style=\"font-weight: 400\">.  La raz\u00f3n principal de esta limitaci\u00f3n es que, cuando se indexan elementos de una matriz, se necesitan entradas de \u00edndice separadas.\u00a0\u00a0<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 wrap:true whitespace-before:02 whitespace-after:02 lang:js decode:true\" title=\"Indexaci\u00f3n de matrices mediante \u00edndices basados en B-TREE\">Consider the array:\r\n\r\nDocument key: \u201cbob\u201d\r\n{\r\n   \u201cId\u201d: \u201cbob123\u201d\r\n   \u201cA\u201d: [1, 2, 3, 4]\r\n   \u201cB\u201d: [521, 4892, 284]\r\n}\r\n\r\nIndexing of the field \u201cid\u201d  simply requires 1 entry in the index:   \r\n         \u201cbob123\u201d:bob\r\n\r\nIndexing of the field \u201ca\u201d requires 4 entries in the index: \r\n        \u201c1\u201d:\u201dbob\u201d, 2:\u201dbob\u201d, 3:\u201dbob\u201d, 4:\u201dbob\u201d\r\n\r\nIndexing of the composite index (id, a) requires 4 entries:\r\n   \u201cbob123\u201d, 1: bob\r\n   \u201cbob123\u201d, 2: bob\r\n   \u201cbob123\u201d, 3: bob\r\n   \u201cbob123\u201d, 4: bob\r\n\r\nIndexing of the composite index (id, a, b) requires the following 12 entries:\r\n   \u201cbob123\u201d, 1, 521: bob\r\n   \u201cbob123\u201d, 1,4982: bob\r\n   \u201cbob123\u201d, 1, 284: bob\r\n   \u201cbob123\u201d, 2, 521: bob\r\n   \u201cbob123\u201d, 2,4982: bob\r\n   \u201cbob123\u201d, 2, 284: bob\r\n   \u201cbob123\u201d, 3, 521: bob\r\n   \u201cbob123\u201d, 3,4982: bob\r\n   \u201cbob123\u201d, 3, 284: bob\r\n   \u201cbob123\u201d, 4, 521: bob\r\n   \u201cbob123\u201d, 4,4982: bob\r\n   \u201cbob123\u201d, 4, 284: bob\r\n<\/pre>\n<p><span style=\"font-weight: 400\">El tama\u00f1o del \u00edndice crece exponencialmente como el n\u00famero de claves del array en el \u00edndice y el n\u00famero de elementos del array en el \u00edndice.    De ah\u00ed la limitaci\u00f3n.   Las implicaciones de esta limitaci\u00f3n son:\u00a0<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Introduce s\u00f3lo un predicado de matriz en el escaneo del \u00edndice y maneja otros predicados despu\u00e9s del escaneo del \u00edndice.<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Esto significa que las consultas con m\u00faltiples predicados de matriz pueden ser lentas.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Evite los \u00edndices compuestos con claves de matriz para evitar \u00edndices enormes.<\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Esto significa que las consultas con predicados complejos sobre claves de matrices ser\u00e1n lentas.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Buenas noticias de la <a href=\"https:\/\/en.wikipedia.org\/wiki\/Out_of_left_field\">CAMPO IZQUIERDO<\/a>.<\/h4>\n<p><span style=\"font-weight: 400\">El \u00edndice de b\u00fasqueda de texto completo se dise\u00f1\u00f3 para gestionar la b\u00fasqueda de patrones de texto basada en la relevancia.   Lo hace tokenizando cada campo.  En este ejemplo, cada documento se analiza para obtener tokens:<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 wrap:true whitespace-before:02 whitespace-after:02 lang:js decode:true\" title=\"Ejemplo de tokenizaci\u00f3n de texto\">\u201cdoc:1\u201d-&gt;\u201ddesc\u201d:   {\u201cdesc\u201d: \u201can appel a day, keeps the doctor away.\u201d}\r\n\u201cdoc:2\u201d-&gt;\u201ddesc\u201d: {\u201cdesc\u201d:\u201dan appel a day, keeps Billl Gates away.\u201d}\r\n\u201cdoc:3\u201d-&gt;\u201ddesc\u201d: {\u201cdesc\u201d: \u201can apple a dday, keeps the apple farmer rich.\u201d}\r\n\r\n\u201cdoc:1\u201d-&gt;\u201ddesc\u201d: [\u201capple\u201d, \u201cday\u201d, \u201ckeep\u201d, \u201cdoctor\u201d, \u201caway\u201d]\r\n\u201cdoc:2\u201d-&gt;\u201ddesc\u201d: [\u201capple\u201d, \u201cday\u201d, \u201ckeep\u201d, \u201cbill\u201d, \u201cgates\u201d,  \u201caway\u201d]\r\n\u201cdoc:3\u201d-&gt;\u201ddesc\u201d: [\u201capple\u201d, \u201cday\u201d, \u201ckeep\u201d, \u201cfarmer\u201d, \u201crich\u201d]\r\n\r\nThis then is combined to get a single array of tokens:\r\n\r\n[\u201capple\u201d, \u201caway\u201d, \u201cbill\u201d, \u201cday\u201d, \u201cdoctor\u201d, \u201cfarmer\u201d, \u201cgates\u201d, \u201ckeep\u201d, \u201crich\u201d]\r\n\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Para cada token, guarda la lista de documentos en los que est\u00e1 presente.  Esta es la estructura de \u00e1rbol invertida. A diferencia de un \u00edndice basado en un \u00e1rbol B, evita repetir el mismo valor de token N veces, una por cada documento en el que est\u00e1 presente.  Cuando se tienen millones o miles de millones de documentos, el ahorro es enorme.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">La segunda cosa a tener en cuenta aqu\u00ed es, el \u00edndice invertido utilizado para <\/span><b>\u00a1un ARRECIBO DE TOKENS!<\/b><span style=\"font-weight: 400\">\u00a0 \u00a0 De hecho, la estructura de \u00e1rbol invertido de la b\u00fasqueda de texto completo es ideal para indexar y buscar valores de matrices, especialmente cuando estos valores tienen duplicados.\u00a0 <\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9042\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM-300x91.png\" alt=\"\" width=\"583\" height=\"177\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM-300x91.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM-1024x312.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM-768x234.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM-20x6.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.46.27-PM.png 1242w\" sizes=\"auto, (max-width: 583px) 100vw, 583px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400\">Indexar matrices utilizando el \u00edndice invertido ser\u00e1 el mismo proceso, excepto que no hay tokenizaci\u00f3n. Volvamos a indexar nuestro documento \"bob\", con documentos adicionales, \"Sam\" y \"Neill\"<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 wrap:true whitespace-before:02 whitespace-after:02 lang:js decode:true\" title=\"Ejemplos de documentos\">Document key: \u201cbob\u201d\r\n{\r\n   id\u201d: \u201cbob123\u201d\r\n   \u201ca\u201d: [1, 2, 3, 4]\r\n  \u201cb\u201d: [521, 4892, 284]\r\n}\r\nDocument key: \u201csam\u201d\r\n{\r\n   \u201cid\u201d: \u201csam456\u201d\r\n   \u201ca\u201d: [1,3, 4, 9]\r\n  \u201cb\u201d: [521, 232, 284]\r\n}\r\nDocument key: \u201cneil\u201d\r\n{\r\n   \u201cid\u201d: \u201cneil987\u201d\r\n   \u201cA\u201d[1, 2, 4, 6]\r\n  \u201cb\u201d: [521, 4892, 543]\r\n}\r\n\r\n<\/pre>\n<p>En <a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/full-text-intro.html\">Couchbase FTS<\/a> tiene un analizador llamado <a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/fts-using-analyzers.html#pre-constructed-analyzers\">analizador de palabras clave<\/a>. Esto indexa los valores tal cual en lugar de tratar de encontrar su ra\u00edz por stemming. B\u00e1sicamente, el valor es el token.  Para la indexaci\u00f3n de valores de matrices, podemos utilizar este \u00edndice y explotar las eficiencias de un \u00edndice invertido.  Construyamos un \u00edndice FTS en los documentos bob, sam, neil.\u00a0 <span style=\"font-weight: 400\">En el caso del \u00e1rbol invertido, cada campo tiene su propio \u00e1rbol invertido: uno para id, uno para a y uno para b. Al tratarse de \u00e1rboles individuales, no crecen exponencialmente como el \u00edndice compuesto del \u00e1rbol B. El n\u00famero de entradas del \u00edndice es proporcional al n\u00famero de elementos \u00fanicos de cada campo.  En este caso, tenemos <strong>14 entradas<\/strong> para los 3 documentos con tres campos de un total de 24 valores.  La creaci\u00f3n de un \u00edndice de \u00e1rbol B en (id, a, b) para el mismo documento crear\u00e1 <strong>\u00a136 entradas! <\/strong><\/span><\/p>\n<p><span style=\"color: #0000ff\">Observe que para tres documentos con dos entradas de \u00edndice la diferencia es de 157%. A medida que aumenta el n\u00famero de documentos y el n\u00famero de matrices, tambi\u00e9n aumenta el ahorro al utilizar un \u00edndice invertido.<\/span><\/p>\n<div id=\"attachment_9043\" style=\"width: 753px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-9043\" class=\"wp-image-9043\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-300x170.png\" alt=\"Inverted index on three fields.\" width=\"743\" height=\"421\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-300x170.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-1024x580.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-768x435.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-1536x871.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM-1320x748.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-2.58.36-PM.png 1842w\" sizes=\"auto, (max-width: 743px) 100vw, 743px\" \/><\/a><p id=\"caption-attachment-9043\" class=\"wp-caption-text\">\u00cdndice invertido en tres campos.<\/p><\/div>\n<p><span style=\"font-weight: 400\">Sin embargo, tenemos un problema.\u00a0 <\/span><span style=\"font-weight: 400\">\u00bfC\u00f3mo se procesan los predicados?<\/span><\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 whitespace-before:02 whitespace-after:02 lang:mysql decode:true\">WHERE\u00a0 id between \"ada\" and \"tate\"\r\n       AND ANY\u00a0 x IN a SATISFIES x = 3 END\r\n       AND ANY y in b SATISFIES y = 521 END<\/pre>\n<p>El \u00edndice B-Tree almacena todos los valores de (id, a y b) juntos, el \u00edndice invertido en FTS tiene \u00e1rboles distintos para cada campo. Por lo tanto, aplicar predicados m\u00faltiples no es tan f\u00e1cil.  Esto se aplica tanto al procesamiento de matrices como al de texto.  En el tratamiento de textos es habitual hacer preguntas del tipo: buscar todos <span style=\"color: #0000ff\">California <span style=\"color: #ff0000\">residentes<\/span><\/span>\u00a0con <span style=\"color: #0000ff\">Esqu\u00ed<\/span> como su <span style=\"color: #ff0000\">hobby<\/span>.<\/p>\n<p>Para procesar esto, FTS aplica el predicado en cada campo individualmente para obtener la lista de claves de documento para cada predicado.  A continuaci\u00f3n, aplica el predicado booleano <span style=\"color: #0000ff\">Y<\/span> encima. Esta capa utiliza el famoso <a href=\"https:\/\/roaringbitmap.org\/\">paquete bitmap rugiente<\/a> para crear y procesar el mapa de bits de ids de documentos para finalizar el resultado.   S\u00ed, hay un procesamiento adicional aqu\u00ed en comparaci\u00f3n con un \u00edndice basado en B-TREE m\u00e1s simple, pero esto hace que sea posible indexar muchas matrices y procesar la consulta en un tiempo razonable.<a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM.png\"><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-9045\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM-300x235.png\" alt=\"\" width=\"694\" height=\"545\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM-300x235.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM-1024x802.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM-768x602.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM-20x16.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/Screen-Shot-2020-08-03-at-3.41.36-PM.png 1054w\" sizes=\"auto, (max-width: 694px) 100vw, 694px\" \/><\/a><\/p>\n<h4>\u00c1rbol invertido:  Un \u00e1rbol que sigue dando.<\/h4>\n<p>El \u00edndice compuesto B-Tree combina la exploraci\u00f3n y la aplicaci\u00f3n del predicado AND.   El enfoque de \u00e1rbol invertido separa ambos.  Indexar y escanear cada campo es diferente de procesar el predicado compuesto.  Debido a esta separaci\u00f3n, la capa de mapa de bits puede procesar los predicados OR, NOT junto con los predicados AND.  Cambiar el AND del ejemplo anterior por OR es simplemente una instrucci\u00f3n al procesamiento del mapa de bits en la calificaci\u00f3n y deduplicaci\u00f3n del documento<\/p>\n<pre class=\"theme:eclipse font-size:17 line-height:20 whitespace-before:02 whitespace-after:02 lang:mysql decode:true\">WHERE\u00a0 id BETWEEN \"ada\" AND \"tate\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OR ANY\u00a0 x IN a SATISFIES x = 3 END\u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0OR ANY y in b SATISFIES y = 521 END<b><\/b><\/pre>\n<h4>Liberaci\u00f3n de COUCHBASE:<\/h4>\n<p>Couchbase 6.6 soportar\u00e1 el uso de \u00edndices FTS para procesar predicados de arrays complejos.  Esto mejora el coste total de propiedad de la gesti\u00f3n de arrays y permite a los desarrolladores y dise\u00f1adores utilizar, indexar y consultar arrays seg\u00fan sus necesidades sin limitaciones. Est\u00e9 atento a los pr\u00f3ximos anuncios, documentaci\u00f3n, blogs de caracter\u00edsticas, etc.<\/p>\n<h4>Referencias<\/h4>\n<ol>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/working-json-arrays-n1ql\/\">Trabajando con Arrays JSON en N1QL<\/a><\/li>\n<li><a href=\"https:\/\/www.slideshare.net\/journalofinformix\/utilizing-arrays\">Utilizaci\u00f3n de matrices: Modelizaci\u00f3n, consulta e indexaci\u00f3n<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/collectionops.html\">Operadores de recogida N1QL de Couchbase<\/a><\/li>\n<li><a href=\"https:\/\/docs.mongodb.com\/manual\/tutorial\/query-arrays\/\">MongoDB: Consulta de un arrray<\/a><\/li>\n<li><a href=\"https:\/\/docs.couchbase.com\/server\/current\/fts\/full-text-intro.html\">Couchbase FTS<\/a><\/li>\n<li><a href=\"https:\/\/learn.couchbase.com\/store\/509465-cb121-intro-to-couchbase-full-text-search-fts\">GRATUITO Formaci\u00f3n interactiva sobre Couchbase<\/a><\/li>\n<li>FTS BLogs:\u00a0 <a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/fts\/\">https:\/\/www.couchbase.com\/blog\/tag\/fts\/<\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/collectionops.html\"><span style=\"font-weight: 400\">Operadores de recogida<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/indexing-arrays.html\"><span style=\"font-weight: 400\">Indexaci\u00f3n ARRAY<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/making-the-most-of-your-arrays-with-array-indexing\/\"><span style=\"font-weight: 400\">Saca el m\u00e1ximo partido a tus arrays... con N1QL Array Indexing<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/1.making-most-of-your-arrays..-with-covering-array-indexes-and-more\/\"><span style=\"font-weight: 400\">Aproveche al m\u00e1ximo sus matrices... con \u00edndices de matrices de cobertura y mucho m\u00e1s.<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/services-and-indexes\/indexes\/indexing-and-query-perf.html#array-index\"><span style=\"font-weight: 400\">Indexaci\u00f3n de Couchbase<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/dzone.com\/articles\/nesting-and-unnesting-in-couchbase-n1ql\"><span style=\"font-weight: 400\">NEST y UNNEST: normalizaci\u00f3n y desnormalizaci\u00f3n de JSON sobre la marcha<\/span><\/a><\/li>\n<\/ol>","protected":false},"excerpt":{"rendered":"<p>Array is THE difference between the relational model and the JSON model.\u00a0 \u00a0&#8212; Gerald Sangudi Abstract JSON array gives you flexibility in the type of elements,\u00a0 number of elements, size of the elements, and the depth of the elements.\u00a0 This [&hellip;]<\/p>","protected":false},"author":55,"featured_media":9024,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1821,1819,2165,1812],"tags":[1865,1840,1572,1696,1261,1725],"ppma_author":[8929],"class_list":["post-9023","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-architecture","category-data-modeling","category-full-text-search","category-n1ql-query","tag-array","tag-array-index","tag-database","tag-indexing","tag-json","tag-nosql-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Arrays in JSON: Modeling, Querying + Indexing Performance<\/title>\n<meta name=\"description\" content=\"Find out how Couchbase 6.6 removes limitations on JSON arrays by using a built-in inverted index to be used to index and query arrays in 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\/arrays-in-json-modeling-querying-and-indexing\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Arrays in JSON: Modeling, Querying and Indexing Performance\" \/>\n<meta property=\"og:description\" content=\"Find out how Couchbase 6.6 removes limitations on JSON arrays by using a built-in inverted index to be used to index and query arrays in N1QL.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/arrays-in-json-modeling-querying-and-indexing\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-04T14:00:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:42:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Keshav Murthy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rkeshavmurthy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keshav Murthy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"Arrays in JSON: Modeling, Querying and Indexing Performance\",\"datePublished\":\"2020-08-04T14:00:04+00:00\",\"dateModified\":\"2025-06-14T06:42:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/\"},\"wordCount\":1387,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg\",\"keywords\":[\"array\",\"Array Index\",\"database\",\"Indexing\",\"JSON\",\"NoSQL Database\"],\"articleSection\":[\"Application Design\",\"Couchbase Architecture\",\"Data Modeling\",\"Full-Text Search\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/\",\"name\":\"Arrays in JSON: Modeling, Querying + Indexing Performance\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg\",\"datePublished\":\"2020-08-04T14:00:04+00:00\",\"dateModified\":\"2025-06-14T06:42:32+00:00\",\"description\":\"Find out how Couchbase 6.6 removes limitations on JSON arrays by using a built-in inverted index to be used to index and query arrays in N1QL.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg\",\"width\":2560,\"height\":1440,\"caption\":\"An array of houses. Bay farm island, Alameda, California\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Arrays in JSON: Modeling, Querying and Indexing Performance\"}]},{\"@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\/c261644262bf98e146372fe647682636\",\"name\":\"Keshav Murthy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"caption\":\"Keshav Murthy\"},\"description\":\"Keshav Murthy is a Vice President at Couchbase R&amp;D. Previously, he was at MapR, IBM, Informix, Sybase, with more than 20 years of experience in database design &amp; development. He lead the SQL and NoSQL R&amp;D team at IBM Informix. He has received two President's Club awards at Couchbase, two Outstanding Technical Achievement Awards at IBM. Keshav has a bachelor's degree in Computer Science and Engineering from the University of Mysore, India, holds eleven US patents and has four US patents pending.\",\"sameAs\":[\"https:\/\/blog.planetnosql.com\/\",\"https:\/\/x.com\/rkeshavmurthy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Arrays in JSON: Modeling, Querying + Indexing Performance","description":"Descubre c\u00f3mo Couchbase 6.6 elimina las limitaciones de los arrays JSON utilizando un \u00edndice invertido integrado para indexar y consultar arrays en 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\/arrays-in-json-modeling-querying-and-indexing\/","og_locale":"es_MX","og_type":"article","og_title":"Arrays in JSON: Modeling, Querying and Indexing Performance","og_description":"Find out how Couchbase 6.6 removes limitations on JSON arrays by using a built-in inverted index to be used to index and query arrays in N1QL.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/arrays-in-json-modeling-querying-and-indexing\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-08-04T14:00:04+00:00","article_modified_time":"2025-06-14T06:42:32+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg","type":"image\/jpeg"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"Arrays in JSON: Modeling, Querying and Indexing Performance","datePublished":"2020-08-04T14:00:04+00:00","dateModified":"2025-06-14T06:42:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/"},"wordCount":1387,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg","keywords":["array","Array Index","database","Indexing","JSON","NoSQL Database"],"articleSection":["Application Design","Couchbase Architecture","Data Modeling","Full-Text Search","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/","url":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/","name":"Arrays in JSON: Modeling, Querying + Indexing Performance","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg","datePublished":"2020-08-04T14:00:04+00:00","dateModified":"2025-06-14T06:42:32+00:00","description":"Descubre c\u00f3mo Couchbase 6.6 elimina las limitaciones de los arrays JSON utilizando un \u00edndice invertido integrado para indexar y consultar arrays en N1QL.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/08\/IMG_20200726_200132-scaled.jpg","width":2560,"height":1440,"caption":"An array of houses. Bay farm island, Alameda, California"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/arrays-in-json-modeling-querying-and-indexing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Arrays in JSON: Modeling, Querying and Indexing Performance"}]},{"@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\/c261644262bf98e146372fe647682636","name":"Keshav Murthy","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4","url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","caption":"Keshav Murthy"},"description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de once patentes estadounidenses y tiene cuatro pendientes.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/keshav-murthy\/"}]}},"authors":[{"term_id":8929,"user_id":55,"is_guest":0,"slug":"keshav-murthy","display_name":"Keshav Murthy","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","author_category":"","last_name":"Murthy","first_name":"Keshav","job_title":"","user_url":"https:\/\/blog.planetnosql.com\/","description":"Keshav Murthy es Vicepresidente de Couchbase R&amp;D. Anteriormente, estuvo en MapR, IBM, Informix, Sybase, con m\u00e1s de 20 a\u00f1os de experiencia en dise\u00f1o y desarrollo de bases de datos. Dirigi\u00f3 el equipo de I+D de SQL y NoSQL en IBM Informix. Ha recibido dos premios President's Club en Couchbase y dos premios Outstanding Technical Achievement en IBM. Keshav es licenciado en Inform\u00e1tica e Ingenier\u00eda por la Universidad de Mysore (India), es titular de diez patentes estadounidenses y tiene tres pendientes."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/9023","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\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=9023"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/9023\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/9024"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=9023"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=9023"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=9023"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=9023"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}