{"id":2841,"date":"2017-02-27T07:19:19","date_gmt":"2017-02-27T15:19:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2841"},"modified":"2020-02-16T18:00:29","modified_gmt":"2020-02-17T02:00:29","slug":"joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","title":{"rendered":"Uniendo datos NoSQL: Lenguaje de consulta MongoDB vs Couchbase N1QL"},"content":{"rendered":"<p>Una de las preguntas m\u00e1s frecuentes que recibo cuando se trata de NoSQL es sobre el tema de unir datos de m\u00faltiples documentos en un \u00fanico resultado de consulta. Aunque esta pregunta la plantean con m\u00e1s frecuencia los desarrolladores de RDBMS, tambi\u00e9n la recibo de desarrolladores de NoSQL.<\/p>\n<p>Cuando se trata de unir datos, cada base de datos lo hace de forma diferente, algunas de las cuales requieren que se haga a trav\u00e9s de la capa de aplicaci\u00f3n, en lugar de la capa de base de datos. Vamos a explorar algunas opciones de uni\u00f3n de datos entre tecnolog\u00edas de bases de datos.<\/p>\n<p><!--more--><\/p>\n<p>En este blog, compararemos el proceso de unir documentos NoSQL utilizando el operador $lookup de MongoDB frente a <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a>El lenguaje de consulta N1QL es m\u00e1s intuitivo.<\/p>\n<h2>Datos de la muestra<\/h2>\n<p>Para este ejemplo, nos basaremos tanto en MongoDB como en Couchbase en dos documentos de ejemplo. Supongamos que estamos trabajando con un ejemplo cl\u00e1sico de pedido e inventario. Para el inventario, nuestros documentos podr\u00edan ser algo como esto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Documentos del producto\">{\r\n    \"id\": \"product-1\",\r\n    \"type\": \"product\",\r\n    \"name\": \"Pokemon Red\",\r\n    \"price\": 29.99\r\n}<\/pre>\n<p>Si bien es plano, el documento anterior puede explicar adecuadamente un producto en particular. Tiene un identificador \u00fanico que intervendr\u00e1 durante el proceso de uni\u00f3n. Para los pedidos, podr\u00edamos tener un documento con el siguiente aspecto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Pedir documentos\">{\r\n    \"id\": \"order-1\",\r\n    \"type\": \"order\",\r\n    \"products\": [\r\n        {\r\n            \"product_id\": \"product-1\",\r\n            \"quantity\": 2\r\n        }\r\n    ]\r\n}<\/pre>\n<p>El objetivo aqu\u00ed ser\u00e1 unir estos dos documentos en una sola consulta utilizando tanto MongoDB como Couchbase. Sin embargo, dejando a un lado el lenguaje de consulta, estos documentos siempre se pueden unir a trav\u00e9s de la capa de aplicaci\u00f3n a trav\u00e9s de m\u00faltiples consultas. Sin embargo, este no es el resultado que buscamos.<\/p>\n<h3>Unir documentos con MongoDB y el operador $lookup<\/h3>\n<p>En versiones recientes de MongoDB, las consultas join implican un <code>1TP4B\u00fasqueda<\/code> que forma parte de las consultas de agregaci\u00f3n. Seg\u00fan el manual de MongoDB <a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/\" target=\"_blank\" rel=\"noopener noreferrer\">documentaci\u00f3n<\/a>, este operador se comporta como sigue:<\/p>\n<blockquote><p>Realiza una uni\u00f3n exterior izquierda con una colecci\u00f3n no separada de la misma base de datos para filtrar los documentos de la colecci\u00f3n \"unida\" para su procesamiento. La etapa $lookup realiza una comparaci\u00f3n de igualdad entre un campo de los documentos de entrada y un campo de los documentos de la colecci\u00f3n \"unida\".<\/p><\/blockquote>\n<p>Para utilizar el <code>1TP4B\u00fasqueda<\/code> operador, tendr\u00edas algo as\u00ed:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Consulta agregada de MongoDB\">db.collection.aggregate([\r\n    {\r\n       $lookup:\r\n         {\r\n           from: &lt;collection to join&gt;,\r\n           localField: &lt;field from the input documents&gt;,\r\n           foreignField: &lt;field from the documents of the \"from\" collection&gt;,\r\n           as: &lt;output array field&gt;\r\n         }\r\n    }\r\n])<\/pre>\n<p>Esto est\u00e1 muy bien, pero no funciona con las relaciones que se encuentran en las matrices. Esto significa que el <code>1TP4B\u00fasqueda<\/code> no puede unirse a la operaci\u00f3n <code>producto_id<\/code> que se encuentra en el <code>productos<\/code> a otro documento. En su lugar, la matriz debe \"desenrollarse\" o \"desanidarse\" primero, lo que a\u00f1ade complejidad a nuestra consulta:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"MongoDB Desenrollar y luego buscar\">db.orders.aggregate([\r\n    { $unwind: \"$products\" },\r\n    {\r\n        $lookup: {\r\n            from: \"products\",\r\n            localField: \"products.product_id\",\r\n            foreignField: \"_id\",\r\n            as: \"productObjects\"\r\n        }\r\n    }\r\n])<\/pre>\n<p>En <code>$unwind<\/code> aplanar\u00e1 la matriz y luego har\u00e1 una uni\u00f3n en los objetos ahora planos que se produjeron. El resultado de esta consulta ser\u00eda el siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">{\r\n    \"_id\" : ObjectId(\"58a3869acbf64c4ace55e713\"),\r\n    \"products\" : {\r\n        \"product_id\" : ObjectId(\"58a3851b2f14a900caa7a731\"),\r\n        \"quantity\" : 2\r\n    },\r\n    \"productObjects\" : [\r\n        {\r\n            \"_id\" : ObjectId(\"58a3851b2f14a900caa7a731\"),\r\n            \"name\" : \"Pokemon Red\",\r\n            \"price\" : 29.99\r\n        }\r\n    ]\r\n}<\/pre>\n<p>Si hubiera habido m\u00e1s de una referencia en la matriz, se habr\u00edan devuelto m\u00e1s resultados. Sin embargo, lo que se devuelve no es muy atractivo. Seguimos teniendo el antiguo <code>productos<\/code> y ahora un <code>productosObjeto<\/code> array. Es necesario realizar m\u00e1s manipulaciones en el flujo de datos.<\/p>\n<p>En <code>productosObjeto<\/code> debe ser \"desenrollado\" y luego reconstruido como queremos. Esto se puede lograr haciendo lo siguiente:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">db.orders.aggregate([\r\n    { $unwind: \"$products\" },\r\n    {\r\n        $lookup: {\r\n            from: \"products\",\r\n            localField: \"products.product_id\",\r\n            foreignField: \"_id\",\r\n            as: \"productObjects\"\r\n        }\r\n    },\r\n    { $unwind: \"$productObjects\"},\r\n    {\r\n        $project: {\r\n            products: {\r\n                \"quantity\": \"$products.quantity\",\r\n                \"name\": \"$productObjects.name\",\r\n                \"price\": \"$productObjects.price\"\r\n            }\r\n        }\r\n    }\r\n])<\/pre>\n<p>Obs\u00e9rvese que el <code>agregado<\/code> La consulta se vuelve m\u00e1s compleja. Despu\u00e9s de realizar la uni\u00f3n, el resultado se \"desenrolla\" y se reconstruye utilizando la funci\u00f3n <code>Proyecto $<\/code> operador.<\/p>\n<p>En este punto se pueden realizar otras manipulaciones del resultado, como agrupar los resultados de forma que el <code>productos<\/code> se convierten de nuevo en un \u00fanico array. Cada manipulaci\u00f3n del conjunto de datos requiere m\u00e1s c\u00f3digo de agregaci\u00f3n, que puede volverse desordenado, complicado y dif\u00edcil de leer.<\/p>\n<p>Aqu\u00ed es donde Couchbase N1QL se vuelve mucho m\u00e1s agradable para trabajar.<\/p>\n<h3>Uso de Couchbase y N1QL para unir documentos NoSQL<\/h3>\n<p>Usemos el mismo ejemplo de documento que usamos para MongoDB. Esta vez vamos a escribir consultas SQL con N1QL para hacer el trabajo.<\/p>\n<p>Lo primero que se nos ocurre puede ser utilizar un <code>\u00daNASE A<\/code> en SQL. Nuestra consulta podr\u00eda ser algo as\u00ed<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.*, product\r\nFROM example AS orders\r\nJOIN example AS product ON KEYS orders.products[*].product_id\r\nWHERE orders.type = 'order'<\/pre>\n<p>En el ejemplo anterior, ambos documentos existen en el mismo Bucket de Couchbase. A <code>\u00daNASE A<\/code> con los identificadores de los documentos se basa en <code>producto_id<\/code> que se encuentran en el <code>productos<\/code> array. La consulta anterior arrojar\u00eda resultados como los siguientes:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">[\r\n  {\r\n    \"id\": \"order-1\",\r\n    \"product\": {\r\n      \"id\": \"product-1\",\r\n      \"name\": \"Pokemon Red\",\r\n      \"price\": 29.99,\r\n      \"type\": \"product\"\r\n    },\r\n    \"products\": [\r\n      {\r\n        \"product_id\": \"product-1\",\r\n        \"quantity\": 2\r\n      }\r\n    ],\r\n    \"type\": \"order\"\r\n  }\r\n]<\/pre>\n<p>Al igual que con MongoDB, habr\u00e1 un resultado para cada elemento de la base de datos <code>productos<\/code> que coincida. Para ser justos, aunque la versi\u00f3n N1QL era m\u00e1s f\u00e1cil de escribir, no era necesariamente m\u00e1s dif\u00edcil que el Lenguaje de Consulta MongoDB en este punto. A medida que manipulamos m\u00e1s los datos, Couchbase se vuelve mucho m\u00e1s f\u00e1cil en comparaci\u00f3n.<\/p>\n<p>Por ejemplo, supongamos que queremos limpiar los resultados:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.id, orders.type, OBJECT_PUT(product, \"quantity\", products.quantity) AS product\r\nFROM example AS orders\r\nUNNEST orders.products AS products\r\nJOIN example AS product ON KEYS products.product_id\r\nWHERE orders.type = 'order'<\/pre>\n<p>Hay algunas diferencias importantes en lo que estamos haciendo en lo anterior, pero diferencias menores en c\u00f3mo lo estamos haciendo. En lugar de unir directamente en la matriz, primero estamos aplanando o \"unnesting\" la matriz, como lo que vimos en el MongoDB <code>$unwind<\/code> operador. La uni\u00f3n se produce ahora en cada uno de los resultados aplanados. Por \u00faltimo, el operador <code>cantidad<\/code> del objeto original se a\u00f1ade al nuevo objeto.<\/p>\n<p>El resultado de la consulta anterior ser\u00eda algo parecido a esto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">[\r\n  {\r\n    \"id\": \"order-1\",\r\n    \"product\": {\r\n      \"id\": \"product-1\",\r\n      \"name\": \"Pokemon Red\",\r\n      \"price\": 29.99,\r\n      \"quantity\": 2,\r\n      \"type\": \"product\"\r\n    },\r\n    \"type\": \"order\"\r\n  }\r\n]<\/pre>\n<p>Digamos que el original <code>productos<\/code> ten\u00eda m\u00e1s de una referencia de producto. En lugar de devolver varios objetos basados en el <code>\u00daNASE A<\/code> que vimos anteriormente, podr\u00eda tener sentido volver a empaquetar esa matriz original.<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.id, orders.type, ARRAY_AGG(OBJECT_PUT(product, \"quantity\", products.quantity)) AS products\r\nFROM example AS orders\r\nUNNEST orders.products AS products\r\nJOIN example AS product ON KEYS products.product_id\r\nWHERE orders.type = 'order'\r\nGROUP BY orders<\/pre>\n<p>En la consulta anterior s\u00f3lo hemos a\u00f1adido <code>ARRAY_AGG<\/code> y un <code>GRUPO POR<\/code>pero, como resultado, cada documento unido aparece en la carpeta <code>productos<\/code> en lugar del valor id.<\/p>\n<p>No quiero usar un <code>\u00daNASE A<\/code> \u00bfoperador? Pruebe a utilizar una subconsulta SQL.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>En NoSQL, unir datos es una preocupaci\u00f3n muy popular para los desarrolladores que son veteranos RDBMS. Como MongoDB es una tecnolog\u00eda NoSQL muy popular, pens\u00e9 que ser\u00eda bueno usarla para comparar c\u00f3mo Couchbase maneja la uni\u00f3n de documentos. Para operaciones ligeras, <code>1TP4B\u00fasqueda<\/code> es tolerable, pero a medida que las consultas join en MongoDB se vuelven m\u00e1s complejas, puede que necesite dar un paso atr\u00e1s. Con N1QL, escribir consultas complejas que incluyen operaciones de uni\u00f3n se vuelve muy f\u00e1cil y sigue siendo f\u00e1cil independientemente de lo compleja que sea la consulta.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre N1QL y Couchbase, visite la p\u00e1gina <a href=\"https:\/\/developer.couchbase.com\" target=\"_blank\" rel=\"noopener noreferrer\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the most frequent questions I receive when it comes to NoSQL is on the subject of joining data from multiple documents into a single query result. While this question is brought up more frequently from RDBMS developers, I [&hellip;]<\/p>","protected":false},"author":63,"featured_media":2787,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,1812],"tags":[1309,1861],"ppma_author":[9032],"class_list":["post-2841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-n1ql-query","tag-mongodb","tag-unnest"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL<\/title>\n<meta name=\"description\" content=\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase&#039;s intuitive N1QL query language.\" \/>\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\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\" \/>\n<meta property=\"og:description\" content=\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase&#039;s intuitive N1QL query language.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-27T15:19:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-02-17T02:00:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mongo-to-couchbase.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"389\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\",\"datePublished\":\"2017-02-27T15:19:19+00:00\",\"dateModified\":\"2020-02-17T02:00:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"},\"wordCount\":975,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"keywords\":[\"mongodb\",\"unnest\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\",\"name\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"datePublished\":\"2017-02-27T15:19:19+00:00\",\"dateModified\":\"2020-02-17T02:00:29+00:00\",\"description\":\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"width\":1100,\"height\":389},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Uniendo datos NoSQL: Lenguaje de consulta MongoDB vs Couchbase N1QL","description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","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\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","og_locale":"es_MX","og_type":"article","og_title":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL","og_description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-02-27T15:19:19+00:00","article_modified_time":"2020-02-17T02:00:29+00:00","og_image":[{"width":1100,"height":389,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mongo-to-couchbase.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL","datePublished":"2017-02-27T15:19:19+00:00","dateModified":"2020-02-17T02:00:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"},"wordCount":975,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","keywords":["mongodb","unnest"],"articleSection":["Best Practices and Tutorials","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","name":"Uniendo datos NoSQL: Lenguaje de consulta MongoDB vs Couchbase N1QL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","datePublished":"2017-02-27T15:19:19+00:00","dateModified":"2020-02-17T02:00:29+00:00","description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","width":1100,"height":389},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2841","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2841"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/2787"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2841"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}