{"id":4498,"date":"2018-02-12T10:00:54","date_gmt":"2018-02-12T18:00:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4498"},"modified":"2025-06-13T20:09:22","modified_gmt":"2025-06-14T03:09:22","slug":"join-queries-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/join-queries-couchbase-mobile\/","title":{"rendered":"Introducci\u00f3n a las consultas JOIN en Couchbase Mobile"},"content":{"rendered":"<p>Couchbase Lite 2.0 soporta la capacidad de realizar JOINS a trav\u00e9s de tus documentos JSON . Esto es parte de 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.<\/p>\n<p>Los JOINS permiten combinar el contenido de m\u00faltiples documentos. En este post, proporcionaremos ejemplos para ilustrar los tipos de JOINS posibles con Couchbase Lite. Para cada una de las consultas, proporcionaremos la consulta SQL equivalente. Este blog asume que est\u00e1s familiarizado con los fundamentos de la nueva API de consultas, as\u00ed que si a\u00fan no lo has hecho, aseg\u00farate de revisar la secci\u00f3n <a href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-for-json-query-interface-couchbase-mobile\/\">entrada anterior<\/a> primero. Si le interesa, al final de esta entrada encontrar\u00e1 enlaces a blogs en los que se tratan otras caracter\u00edsticas de la interfaz de consulta.<\/p>\n<p>Puede descargar las \u00faltimas versiones de Couchbase Mobile 2.0 Pre-Release 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 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 en los ejemplos aqu\u00ed expuestos se utiliza Swift para iOS, la misma interfaz de consulta es compatible tambi\u00e9n con las plataformas Android y Windows.<\/p>\n<p><strong>As\u00ed que, con unos peque\u00f1os ajustes, deber\u00edas poder reutilizar los ejemplos de consulta de este art\u00edculo cuando trabajes con otras plataformas.<\/strong><\/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 una base de datos de muestra situada <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-lite-ios-api-playground\/tree\/master\/joindb.cblite2\">aqu\u00ed<\/a>. Puede incrustar esta base de datos preconstruida en su aplicaci\u00f3n m\u00f3vil y empezar a utilizarla para sus consultas.<\/p>\n<p>El conjunto de datos de muestra es un poco artificioso, pero el objetivo es demostrar algunos casos t\u00edpicos de uso de <code>\u00fanase a<\/code> preguntas.<\/p>\n<ul>\n<li>\"documento de tipo \"empleado<\/li>\n<\/ul>\n<pre class=\"lang:js decode:true\">{\r\n \"type\": \"employee\",\r\n \"firstname\": \"John\",\r\n \"lastname\": \"Smith\",\r\n \"department\": \"1000\",\r\n \"location\": \"101\"\r\n}<\/pre>\n<ul>\n<li>\"documento de tipo \"departamento<\/li>\n<\/ul>\n<pre class=\"lang:js decode:true\">{\r\n \"type\": \"department\",\r\n \"name\": \"Product Management\",\r\n \"code\": \"2000\",\r\n \"head\": {\r\n \"firstname\": \"Patricia\",\r\n \"lastname\": \"Shoji\"\r\n },\r\n \"location\":[\"101\",\"102\"]\r\n}\r\n<code><\/code><\/pre>\n<ul>\n<li>\"documento de tipo \"localizaci\u00f3n<\/li>\n<\/ul>\n<pre class=\"lang:js decode:true\">{\r\n \"type\": \"location\",\r\n \"name\": \"HQ\",\r\n \"address\": \"1123 6th St. Melbourne, FL 32904 \",\r\n \"code\": \"101\"\r\n}<\/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 class=\"wrap:true lang:swift decode:true\"> let options = DatabaseConfiguration()\r\n let db = try Database(name: kDBName, config: options)<\/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<h3 id=\"joinorinnerjoin\">JOIN o Inner JOIN<\/h3>\n<p>Puede utilizar una consulta JOIN simple o Inner JOIN para obtener propiedades de los documentos participantes si y s\u00f3lo si ambos documentos cumplen las condiciones especificadas en el campo <code>EN<\/code> cl\u00e1usula.<\/p>\n<p>Por ejemplo, teniendo en cuenta el modelo de datos que hemos presentado anteriormente, supongamos que desea obtener la informaci\u00f3n <code>firstName<\/code>, <code>apellido<\/code> de un \"empleado\" y la correspondiente <code>nombre<\/code> del \"departamento\" al que pertenec\u00eda el empleado. En este caso, <code>nombre<\/code> y <code>apellido<\/code> se obtienen del documento de <code>tipo<\/code> \"empleado\" y el departamento <code>nombre<\/code> se obtiene del documento de <code>tipo<\/code> \"departamento\" si y s\u00f3lo si el <code>departamento<\/code> del \"empleado\" coincide con la propiedad <code>c\u00f3digo<\/code> propiedad en el \"departamento<\/p>\n<p>Esto implica que si no hay documentos del \"departamento\" que coincidan con el <code>c\u00f3digo<\/code> en el documento \"empleado\", los datos de ese empleado no se incluyen en el resultado de salida<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/inner_join_explain.png\" alt=\"\" \/><\/figure>\n<h4 id=\"request\">Solicitar<\/h4>\n<pre class=\"wrap:true lang:swift decode:true\"> try db.createIndex(IndexBuilder.valueIndex(items: ValueIndexItem.property(\"type\")),withName: \"typeIndex\")\r\n\/\/ set up aliases to represent the data source for &amp;quot;department&amp;quot; type document\r\nlet departmentDS = DataSource.database(db).as(\"departmentDS\")\r\n\r\n\/\/ Property expression for &amp;quot;department&amp;quot; (in employee documents)\r\nlet employeeDeptExpr = Expression.property(\"department\").from(\"employeeDS\")\r\n\r\n\/\/ Property expression for &amp;quot;code&amp;quot; (in department documents)\r\nlet departmentCodeExpr = Expression.property(\"code\").from(\"departmentDS\")\r\n\r\n\/\/ Join clause: Join employee type and department type documents where the\r\n\/\/ \"department\" field of employee documents is equal to the department \"code\";\r\n\/\/ of \"department\" documents\r\nlet joinExpr = employeeDeptExpr.equalTo(departmentCodeExpr)\r\n    .and(Expression.property(\"type\").from(\"employeeDS\").equalTo(Expression.string(\"employee\")))\r\n    .and(Expression.property(\"type\").from(\"departmentDS\").equalTo(Expression.string(\"department\")))\r\n\r\n\r\n\/\/ Construct inner join expression with ON query.\r\nlet join = Join.join(departmentDS).on(joinExpr)\r\n\r\n\/\/ return the \"firstname\", \"lastname\"; and \"department\"; name from the documents that are joined based\r\n\/\/ on the JOIN expression\r\nlet searchQuery = Query.select(\r\n    SelectResult.expression(Expression.property(\"firstname\").from(\"employeeDS\")),\r\n    SelectResult.expression(Expression.property(\"lastname\").from(\"employeeDS\")),\r\n    SelectResult.expression(Expression.property(\"name\").from(\"departmentDS\")))\r\n    .from(employeeDS)\r\n    .join(join)<\/pre>\n<p>&nbsp;<\/p>\n<h4>ANSI SQL<\/h4>\n<p>La sentencia SQL equivalente para la consulta anterior ser\u00eda<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\">SELECT\r\n  employeeDS.firstname,\r\n  employeeDS.lastname,\r\n  departmentDS.name\r\nFROM\r\n  `travel-sample` employeeDS\r\n  INNER JOIN `travel-sample` departmentDS ON employeeDS.department = departmentDS.code\r\nWHERE\r\n  employeeDS.type = \"employee\"\r\n  AND departmentDS.type = \"department\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 id=\"leftjoinorleftouterjoin\">Left JOIN o Left Outer JOIN<\/h3>\n<p>Puede utilizar una consulta JOIN izquierda para obtener propiedades de los documentos participantes si ambos documentos cumplen las condiciones especificadas en el campo <code>EN<\/code> . Sin embargo, a diferencia de un JOIN normal, los resultados tambi\u00e9n incluir\u00e1n los documentos no coincidentes a la izquierda de la cl\u00e1usula <code>EN<\/code> de la expresi\u00f3n JOIN.<\/p>\n<p>Por ejemplo, teniendo en cuenta el modelo de datos que hemos presentado anteriormente, supongamos que desea obtener la informaci\u00f3n <code>firstName<\/code>, <code>apellido<\/code> de un \"empleado\" y la correspondiente <code>nombre<\/code> del \"departamento\" al que pertenec\u00eda el empleado.<br \/>\nAdem\u00e1s, supongamos que tambi\u00e9n nos interesa el<code>firstName<\/code> y <code>apellido<\/code> de un \"empleado\" cuyo <code>departamento<\/code> c\u00f3digo hace <em>no<\/em> corresponden a un departamento v\u00e1lido. Este podr\u00eda ser el caso, por ejemplo, si el <code>departamento<\/code> el c\u00f3digo del empleado se ha introducido incorrectamente.<\/p>\n<p>En este caso, <code>nombre<\/code> y <code>apellido<\/code> se obtienen del documento de <code>tipo<\/code> \"empleado\" y el departamento <code>nombre<\/code> se obtiene del documento de <code>tipo<\/code> \"departamento\" si el <code>departamento<\/code> del \"empleado\" coincide con la propiedad <code>c\u00f3digo<\/code> en el \"departamento\".<\/p>\n<p>Si no hay ning\u00fan departamento que coincida, entonces s\u00f3lo el <code>nombre<\/code> y <code>apellido<\/code> del documento \"empleado\".<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/outer_join_explain.png\" alt=\"\" \/><\/figure>\n<h4 id=\"request\">Solicitar<\/h4>\n<pre class=\"wrap:true lang:swift decode:true\"> \/\/ set up aliases to represent the data source for \"employee\" type document\r\n let employeeDS = DataSource.database(db).as(\"employeeDS\")\r\n\/\/ set up aliases to represent the data source for \"department\" type document\r\nlet departmentDS = DataSource.database(db).as(\"departmentDS\")\r\n\r\n\/\/ Property expression for \"department\" (in employee documents)\r\nlet employeeDeptExpr = Expression.property(\"department\").from(\"employeeDS\")\r\n\r\n\/\/ Property expression for \"code\" (in department documents)\r\nlet departmentCodeExpr = Expression.property(&amp;quot;code&amp;quot;).from(\"departmentDS\")\r\n\r\n\/\/ Join clause: Join department type and employee type documents where the\r\n\/\/ \"department\" field of employee documents is equal to the department \"code\" of\r\n\/\/ \"department\" documents\r\nlet joinExpr = employeeDeptExpr.equalTo(departmentCodeExpr)\r\n    .and(Expression.property(\"type\").from(\"employeeDS\").equalTo(Expression.string(\"employee\")))\r\n    .and(Expression.property(\"type\").from(\"departmentDS\").equalTo(Expression.string(\"department\")))\r\n\r\n\r\n\/\/ join expression with ON query\r\nlet join = Join.leftJoin(departmentDS).on(joinExpr)\r\n\r\n\/\/ return the \"firstname\", \"lastname\" and \"department\" name from the documents that are joined based on the JOIN expression\r\n let searchQuery = Query.select(\r\n     SelectResult.expression(Expression.property(\"firstname\").from(\"employeeDS\")),\r\n     SelectResult.expression(Expression.property(\"lastname\").from(\"employeeDS\")),\r\n     SelectResult.expression(Expression.property(\"name\").from(\"departmentDS\")))\r\n    .from(employeeDS)\r\n    .join(join)<\/pre>\n<h4>ANSI SQL<\/h4>\n<p>La sentencia SQL equivalente para la consulta anterior ser\u00eda<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\"> SELECT\r\n  employeeDS.firstname,\r\n  employeeDS.lastname,\r\n  departmentDS.name\r\nFROM\r\n  `travel-sample` employeeDS\r\n  LEFT JOIN `travel-sample` departmentDS ON employeeDS.department = departmentDS.code\r\nWHERE\r\n  employeeDS.type = \"employee\"\r\n  AND departmentDS.type = \"department\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 id=\"crossjoin\">Cruz JOIN<\/h3>\n<p>Puede utilizar una consulta JOIN cruzada para obtener el producto cartesiano de las propiedades de los documentos participantes, que normalmente no est\u00e1n relacionados entre s\u00ed. Es el equivalente de un JOIN interno <em>sin<\/em> el <code>EN<\/code> de la expresi\u00f3n join.<\/p>\n<p>Por ejemplo, teniendo en cuenta el modelo de datos que hemos presentado anteriormente, supongamos que desea obtener el producto cartesiano de todos los documentos de <code>tipo<\/code> \"ubicaci\u00f3n\" y <code>tipo<\/code> \"departamento\". En otras palabras, cada \"ubicaci\u00f3n\" <code>tipo<\/code> documento se combinar\u00eda con cada uno de los \"departamentos\" <code>tipo<\/code> documentos.<\/p>\n<p>Dado que no hay <code>en<\/code> especificada en la expresi\u00f3n cross JOIN, deber\u00e1 incluir una cl\u00e1usula <code>donde<\/code> para filtrar el subconjunto de documentos a considerar en funci\u00f3n del documento <code>tipo<\/code>.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/cross_join_explain.png\" alt=\"\" \/><\/figure>\n<h4 id=\"request\">Solicitar<\/h4>\n<pre class=\"wrap:true lang:swift decode:true\">\/\/ set up aliases to represent the data source for \"department\" type document\r\n let departmentDS = DataSource.database(db).as(\"departmentDS\")\r\n\/\/ set up aliases to represent the data source for \"location\" type document\r\nlet locationDS = DataSource.database(db).as(\"locationDS\")\r\n\r\n\/\/ Property expression for \"department\" (in employee documents)\r\nlet employeeDeptExpr = Expression.property(\"code\").from(\"departmentDS\")\r\n\r\n\/\/ Property expression for \"department\" (in location documents)\r\nlet departmentCodeExpr = Expression.property(\"code\").from(\"locationDS\")\r\n\r\n\/\/ cross join expression\r\nlet join = Join.crossJoin(locationDS)\r\n\r\n\/\/ type property expressions\r\nlet deptTypeExpr = Expression.property(\"type\").from(\"departmentDS\")\r\nlet locationTypeExpr = Expression.property(\"type\").from(\"locationDS\")\r\n\r\n\/\/ The where clauses filters the set of documents to cross-join on\r\n\/\/ We alias the \"code\" properties since it exists in both the department and location docs\r\n\r\n\/\/ NOTE: The where clause is used to filter the documents to be considered as\r\n\/\/ part of the cartesian join\r\nlet searchQuery = Query.select(\r\n    SelectResult.expression(Expression.property(\"name\").from(\"departmentDS\")).as(\"DeptName\"),\r\n     SelectResult.expression(Expression.property(\"name\").from(\"locationDS\")).as(\"LocationName\"),\r\n    SelectResult.expression(Expression.property(\"address\").from(\"locationDS\")))\r\n    .from(departmentDS)\r\n    .join(join)\r\n    .where(deptTypeExpr.equalTo(Expression.string(\"department\"))\r\n                .and(locationTypeExpr.equalTo(Expression.string(\"location\"))))<\/pre>\n<h4>ANSI SQL<\/h4>\n<p>La sentencia SQL equivalente para la consulta anterior ser\u00eda<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\">SELECT\r\n  departmentDS.name AS DeptName,\r\n  locationDS.name AS LocationName,\r\n  locationDS.address\r\nFROM\r\n  `travel-sample` departmentDS\r\n  CROSS JOIN `travel-sample` locationDS\r\nWHERE\r\n  departmentDS.type = \"department\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 id=\"chainingofjoins\">Encadenamiento de JOINs<\/h3>\n<p>Es posible especificar varias expresiones JOIN en el campo <code>seleccione<\/code> para poder realizar JOIN entre documentos basados en diferentes criterios.<\/p>\n<p>Por ejemplo, teniendo en cuenta el modelo de datos que hemos presentado anteriormente, supongamos que desea obtener la informaci\u00f3n <code>firstName<\/code>, <code>apellido<\/code> de un \"empleado\" y la correspondiente <code>nombre<\/code> del \"departamento\" al que pertenec\u00eda el empleado. Adem\u00e1s, tambi\u00e9n quer\u00eda identificar el <code>nombre<\/code> del \"lugar\" en el que estaba destinado el empleado.<\/p>\n<p>En este caso, utilizamos dos expresiones JOIN.<br \/>\nLa primera expresi\u00f3n JOIN se utiliza para JOIN documentos de <code>tipo<\/code> \"empleado\" con documentos de <code>tipo<\/code> \"departamento\" en funci\u00f3n de la propiedad \"c\u00f3digo de departamento\". En este caso, la propiedad <code>nombre<\/code> y <code>apellido<\/code> se obtienen del documento de <code>tipo<\/code> \"empleado\" y el departamento <code>nombre<\/code> se obtiene del documento de <code>tipo<\/code> \"departamento\" si y s\u00f3lo si el <code>departamento<\/code> del \"empleado\" coincide con la propiedad <code>c\u00f3digo<\/code> en el \"departamento\".<\/p>\n<p>La segunda expresi\u00f3n JOIN se utiliza para JOIN documentos de <code>tipo<\/code> \"empleado\" con documentos de <code>tipo<\/code> \"ubicaci\u00f3n\" en funci\u00f3n de la propiedad \"c\u00f3digo de ubicaci\u00f3n\". En este caso, la propiedad <code>nombre<\/code> y <code>apellido<\/code> se obtienen del documento de <code>tipo<\/code> \"empleado\" y la ubicaci\u00f3n <code>nombre<\/code> se obtiene del documento de <code>tipo<\/code> \"ubicaci\u00f3n\" si y s\u00f3lo si el <code>ubicaci\u00f3n<\/code> del \"empleado\" coincide con la propiedad <code>c\u00f3digo<\/code> en el \"departamento\".<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/multi-join.png\" alt=\"\" \/><\/figure>\n<h4 id=\"request\">Solicitar<\/h4>\n<pre class=\"wrap:true lang:swift decode:true\"> \/\/ set up aliases to represent the data source for \"employee\" type document\r\n let employeeDS = DataSource.database(db).as(\"employeeDS\")\r\n \/\/ set up aliases to represent the data source for \"department\" type document\r\n let departmentDS = DataSource.database(db).as(\"departmentDS\")\r\n \/\/ set up aliases to represent the data source for \"location\" type document\r\n let locationDS = DataSource.database(db).as(\"locationDS\")\r\n \/\/ Property expression for \"department\"  property (in employee documents)   \r\n let employeeDeptExpr = Expression.property(\"department\").from(\"employeeDS\")\r\n\r\n \/\/ Property expression for \"location\"  property (in employee documents) \r\n let employeeLocationExpr = Expression.property(\"location\").from(\"employeeDS\")\r\n\r\n \/\/ Property expression for \"code\"  property (in department documents) \r\n let departmentCodeExpr = Expression.property(\"code\").from(\"departmentDS\")\r\n\r\n \/\/ Property expression for \"code\"  property (in location documents) \r\n let locationCodeExpr = Expression.property(\"code\").from(\"locationDS\")\r\n    \r\n \/\/ Join Criteria 1\r\n \/\/ Join where the \"department\" field of employee documents is equal to the department \"code\" of \"department\" documents\r\n let joinDeptCodeExpr = employeeDeptExpr.equalTo(departmentCodeExpr)\r\n        .and(Expression.property(\"type\").from(\"employeeDS\").equalTo(Expression.string(\"employee\")))\r\n        .and(Expression.property(\"type\").from(\"departmentDS\").equalTo(Expression.string(\"department\")))\r\n    \r\n\r\n \/\/ Join Criteria 2\r\n \/\/ Join where the \"department\" field of employee documents is equal to the department \"code\" of \"department\" documents\r\n let joinLocationCodeExpr = employeeLocationExpr.equalTo(locationCodeExpr)\r\n        .and(Expression.property(\"type\").from(\"employeeDS\").equalTo(Expression.string(\"employee\")))\r\n        .and(Expression.property(\"type\").from(\"locationDS\").equalTo(Expression.string(\"location\")))\r\n    \r\n \/\/ join expression for department code\r\n let joinDeptCode = Join.join(departmentDS).on(joinDeptCodeExpr)\r\n    \r\n \/\/ join expression for location code\r\n let joinLocationCode = Join.join(locationDS).on(joinLocationCodeExpr)\r\n    \r\n \/\/ Multiple join expressions in the join clause\r\n let searchQuery = QueryBuilder.select(SelectResult.expression(Expression.property(\"firstname\").from(\"employeeDS\")),\r\n       SelectResult.expression(Expression.property(\"lastname\").from(\"employeeDS\")),\r\n       SelectResult.expression(Expression.property(\"name\").from(\"departmentDS\")).as(\"deptName\"),\r\n       SelectResult.expression(Expression.property(\"name\").from(\"locationDS\")).as(\"locationName\"))\r\n        .from(employeeDS)\r\n        .join(joinDeptCode,joinLocationCode)<\/pre>\n<h3><\/h3>\n<h4>ANSI SQL<\/h4>\n<p>La sentencia SQL equivalente para la consulta anterior ser\u00eda<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\">SELECT\r\n  employeeDS.firstname,\r\n  employeeDS.lastname,\r\n  departmentDS.name AS deptName,\r\n  locationDS.name AS locationName\r\nFROM\r\n  `travel-sample` employeeDS\r\n  JOIN `travel-sample` departmentDS ON employeeDS.department = departmentDS.code\r\n  JOIN `travel-sample` locationDS ON employeeDS.location = locationDS.code\r\nWHERE\r\n  departmentDS.type = \"department\"\r\n  AND locationDS.type = \"location\"\r\n  AND employeeDS.type = \"employee\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 id=\"joinexpressionswithfunctions\">Unir expresiones con funciones<\/h3>\n<p>Aunque en todos los ejemplos se utiliz\u00f3 el <code>equalTo<\/code> en la expresi\u00f3n JOIN, debe tenerse en cuenta que se puede utilizar cualquier operador de comparaci\u00f3n, como por ejemplo <code>entre<\/code>, <code>greaterThanOrEqualTo<\/code> etc. en la expresi\u00f3n JOIN. Tambi\u00e9n puede incluir cualquier <code>Funci\u00f3n<\/code> expresiones. Se trata de una funci\u00f3n muy potente.<\/p>\n<p>Por ejemplo, teniendo en cuenta el modelo de datos que hemos presentado anteriormente, supongamos que desea obtener el departamento <code>nombre<\/code> y la correspondiente <code>ubicaci\u00f3n<\/code> nombres de las \"sedes\" en las que ten\u00eda su sede el departamento. Un departamento puede pertenecer a una o varias sedes.<br \/>\nEn este caso, la expresi\u00f3n JOIN unir\u00eda documentos de tipo \"departamento\" y \"ubicaci\u00f3n\" buscando coincidencias en cualquiera de los miembros de la cadena <code>ubicaci\u00f3n<\/code> del documento del departamento utilizando la propiedad <code>ArrayFunction<\/code> expresi\u00f3n.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/02\/join_expression.png\" alt=\"\" \/><\/figure>\n<pre class=\"wrap:true lang:swift decode:true\">\/\/ set up aliases to represent the data source for \"department\" type document\r\n let departmentDS = DataSource.database(db).as(\"departmentDS\")\r\n\/\/ set up aliases to represent the data source for \"location\" type document\r\nlet locationDS = DataSource.database(db).as(\"locationDS\")\r\n\r\n\/\/ Property expression for &amp;quot;location&amp;quot;  property (in department documents)\r\nlet departmentLocationExpr = Expression.property(\"location\").from(\"departmentDS\")\r\n\r\n\/\/ Property expression for \"code\" property (in location documents)\r\nlet locationCodeExpr = Expression.property(\"code\").from(\"locationDS\")\r\n\r\n\/\/ Join where the \"code\" field of location documents is contained in\r\n\/\/ the \"location\"  array of \"department\" documents\r\nlet joinDeptCodeExpr = ArrayFunction.contains(departmentLocationExpr, value: locationCodeExpr)\r\n    .and(Expression.property(\"type\").from(\"locationDS\").equalTo(Expression.string(\"location\"))\r\n    .and(Expression.property(\"type\").from(\"departmentDS\").equalTo(Expression.string(\"department\"))))\r\n\r\n\/\/ join expression\r\nlet joinLocationCode = Join.join(departmentDS).on(joinDeptCodeExpr)\r\n\r\n\/\/ Search query with JOIN\r\nlet searchQuery = QueryBuilder.select(\r\nSelectResult.expression(Expression.property(\"name\").from(\"departmentDS\")).as(\"departmentName\"),\r\n    SelectResult.expression(Expression.property(\"name\").from(\"locationDS\")).as(\"locationName\"))\r\n    .from(locationDS)\r\n    .join(joinLocationCode)<\/pre>\n<p>&nbsp;<\/p>\n<h4>ANSI SQL<\/h4>\n<p>Las matrices no est\u00e1n soportadas en SQL. Sin embargo, N1QL incluye soporte para arrays. La sentencia SQL correspondiente para la consulta anterior ser\u00eda<\/p>\n<pre class=\"wrap:true lang:mysql decode:true\">SELECT\r\n  departmentDS.name AS departmentName,\r\n  locationDS.name AS locationName\r\nFROM\r\n  `travel-sample` locationDS\r\n  JOIN `travel-sample` departmentDS ON \r\n    ANY code IN departmentDS.location SATISFIES code = locationDS.location\r\n    END \r\n  \r\nWHERE\r\n  departmentDS.type = \"department\"\r\n  AND locationDS.type = \"location\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 id=\"whatnext\">\u00bfQu\u00e9 sigue?<\/h3>\n<p>Esta entrada de blog revis\u00f3 la poderosa caracter\u00edstica JOIN en Couchbase Mobile 2.0 que te permite combinar resultados de m\u00faltiples documentos JSON. Puedes <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">descargar<\/a> Couchbase Mobile 2.0 y probar las consultas discutidas en este post. Esto es un comienzo. Espera ver m\u00e1s funcionalidades en futuras versiones.<\/p>\n<p>Aqu\u00ed hay algunos 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<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\/full-text-search-couchbase-mobile-2-0\/\">entrada del blog<\/a> discute las capacidades de B\u00fasqueda de Texto Completo (FTS).<\/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>Couchbase Lite 2.0 supports the ability to perform JOINS across your JSON documents . This is part of the new Query interface based on N1QL, Couchbase\u2019s declarative query language that extends SQL for JSON. If you are familiar with SQL, [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":4586,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,7667,1810,1812],"tags":[2004],"ppma_author":[8948],"class_list":["post-4498","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","category-n1ql-query","tag-couchbase-mobile-2-0"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing JOIN Queries in Couchbase Mobile - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This post discusses how you can JOIN JSON documents in Couchbase Mobile. This capability allows you to combine the contents of multiple JSON documents.\" \/>\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\/join-queries-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing JOIN Queries in Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"This post discusses how you can JOIN JSON documents in Couchbase Mobile. This capability allows you to combine the contents of multiple JSON documents.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/join-queries-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-02-12T18:00:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:09:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png\" \/>\n\t<meta property=\"og:image:width\" content=\"722\" \/>\n\t<meta property=\"og:image:height\" content=\"483\" \/>\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=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Introducing JOIN Queries in Couchbase Mobile\",\"datePublished\":\"2018-02-12T18:00:54+00:00\",\"dateModified\":\"2025-06-14T03:09:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/\"},\"wordCount\":1438,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png\",\"keywords\":[\"couchbase mobile 2.0\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/\",\"name\":\"Introducing JOIN Queries in Couchbase Mobile - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png\",\"datePublished\":\"2018-02-12T18:00:54+00:00\",\"dateModified\":\"2025-06-14T03:09:22+00:00\",\"description\":\"This post discusses how you can JOIN JSON documents in Couchbase Mobile. This capability allows you to combine the contents of multiple JSON documents.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png\",\"width\":722,\"height\":483,\"caption\":\"join on array\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing JOIN Queries in Couchbase Mobile\"}]},{\"@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":"Introducing JOIN Queries in Couchbase Mobile - The Couchbase Blog","description":"Este post trata sobre c\u00f3mo puedes JOIN documentos JSON en Couchbase Mobile. Esta capacidad le permite combinar el contenido de varios documentos 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\/join-queries-couchbase-mobile\/","og_locale":"es_MX","og_type":"article","og_title":"Introducing JOIN Queries in Couchbase Mobile","og_description":"This post discusses how you can JOIN JSON documents in Couchbase Mobile. This capability allows you to combine the contents of multiple JSON documents.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/join-queries-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-02-12T18:00:54+00:00","article_modified_time":"2025-06-14T03:09:22+00:00","og_image":[{"width":722,"height":483,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.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":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Introducing JOIN Queries in Couchbase Mobile","datePublished":"2018-02-12T18:00:54+00:00","dateModified":"2025-06-14T03:09:22+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/"},"wordCount":1438,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png","keywords":["couchbase mobile 2.0"],"articleSection":["Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/","name":"Introducing JOIN Queries in Couchbase Mobile - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png","datePublished":"2018-02-12T18:00:54+00:00","dateModified":"2025-06-14T03:09:22+00:00","description":"Este post trata sobre c\u00f3mo puedes JOIN documentos JSON en Couchbase Mobile. Esta capacidad le permite combinar el contenido de varios documentos JSON.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/02\/join_expression.png","width":722,"height":483,"caption":"join on array"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/join-queries-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing JOIN Queries in Couchbase Mobile"}]},{"@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\/4498","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=4498"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4498\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/4586"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4498"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}