{"id":1539,"date":"2014-12-16T19:22:10","date_gmt":"2014-12-16T19:22:10","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1539"},"modified":"2014-12-16T19:22:10","modified_gmt":"2014-12-16T19:22:10","slug":"couchbase-and-ziniki","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-and-ziniki\/","title":{"rendered":"Couchbase @ Ziniki : La odisea de encontrar \"Find"},"content":{"rendered":"<p><em>Ziniki Infrastructure Systems construy\u00f3 su nivel de integraci\u00f3n sobre Couchbase, porque la combinaci\u00f3n de almacenamiento de documentos con mapreduce incremental les proporcion\u00f3 una forma potente de consultar datos. En este blog, Gareth Powell, fundador y arquitecto de Ziniki, describe su experiencia en el uso de vistas mapreduce en Couchbase.\u00a0<\/em><\/p>\n<hr \/>\n<p>Tengo una gran experiencia en SQL y algo en MongoDB. Debido a que gran parte de SQL se basa en uniones y la sentencia \"SELECT\", ingenuamente supuse que habr\u00eda una funcionalidad similar de \"b\u00fasqueda\" en Couchbase como en MongoDB, que hab\u00eda utilizado brevemente en otro proyecto. Al principio me sorprendi\u00f3 ver que no era as\u00ed.<\/p>\n<h3>El problema<\/h3>\n<p>La raz\u00f3n por la que decid\u00ed usar Couchbase para este proyecto fue su capacidad de crear \u00edndices complejos en segundo plano usando su tecnolog\u00eda mapreduce incremental. Hablar\u00e9 un poco m\u00e1s de esto en la siguiente secci\u00f3n, pero antes de entrar en eso, d\u00e9jame describir primero lo que estaba tratando de construir.<\/p>\n<p>Estoy construyendo una capa de middleware sobre Couchbase. Este nivel tiene conocimiento sobre los usuarios, sus credenciales, identidades, datos personales, requisitos de seguridad y similares. Tambi\u00e9n es consciente de la aplicaci\u00f3n y tiene l\u00f3gica y reglas para controlar el acceso de la aplicaci\u00f3n a los datos de cualquier usuario individual.<\/p>\n<p>Para que todo esto funcione, es necesaria una \"capa de definici\u00f3n de datos\" que describa el dominio de datos de la aplicaci\u00f3n. Yo utilizo XML para ello, pero cualquier cosa, desde diagramas UML o herramientas de dise\u00f1o visual hasta JSON, ser\u00eda aceptable. Lo importante es que todas las definiciones tengan un significado inequ\u00edvoco y que no se planteen cuestiones delicadas como \"el problema de la parada\". Tambi\u00e9n es importante que la representaci\u00f3n sea esencialmente neutra en cuanto al lenguaje y pueda utilizarse para generar definiciones para cualquier lenguaje de programaci\u00f3n o clase de activo que pueda estar implicado. Por ahora, puedes pensar que esto equivale a un conjunto de definiciones de clases en tu lenguaje de programaci\u00f3n orientado a objetos favorito.<\/p>\n<p>Debido a la naturaleza abstracta de mi modelo de datos, opt\u00e9 por utilizar claves \u00fanicas globales (UUID) como claves para los documentos almacenados en Couchbase en lugar de codificar a mano las claves basadas en los datos. Esto me permiti\u00f3 generar una clave exactamente una vez. La clave identificar\u00e1 el objeto de forma \u00fanica y ser\u00e1 su identidad principal sin importar cu\u00e1nto pueda cambiar el objeto.<\/p>\n<p>El otro aspecto de mi modelo de datos es que asume que los datos pueden ser \"grumosos\", es decir, que ser\u00e1 muy com\u00fan definir objetos compuestos como grupos de objetos altamente interconectados, que est\u00e1n todos conectados al grafo de objetos principal a trav\u00e9s de un representante que tambi\u00e9n es responsable de manejar los aspectos de seguridad del grumo.<\/p>\n<h3>Mecanismos de almacenamiento de Couchbase<\/h3>\n<p>Couchbase define la noci\u00f3n de \"vistas\", que son incre\u00edblemente poderosas y se pueden utilizar de muchas maneras diferentes. En gran parte, sin embargo, esta entrada de blog es una advertencia contra su uso para cosas para las que no deber\u00edan usarse.<\/p>\n<p>Todo en Couchbase est\u00e1 dise\u00f1ado de tal manera que funciona eficazmente \"a escala\". Esto difiere de la mayor\u00eda de los otros sistemas que usar\u00e1s, los cuales est\u00e1n definidos alrededor de un conjunto particular de sem\u00e1ntica (teor\u00eda relacional, por ejemplo) y luego metidos con calzador hasta que pueden operar efectivamente a escala (como con Star Schema en bases de datos anal\u00edticas). La consecuencia de esto es que las garant\u00edas que te ofrece Couchbase son el conjunto m\u00ednimo que puede ofrecer a escala masiva. Como en todo sistema escalable, todo est\u00e1 desacoplado. Si planeas - como yo - ofrecer un sistema masivamente escalable, no tiene sentido que te quejes de estas restricciones. Tarde o temprano te encontrar\u00e1s con estos l\u00edmites y, en realidad, s\u00f3lo es cuesti\u00f3n de saber c\u00f3mo afrontar las consecuencias. <em>Mi consejo es que dejes todo lo que puedas a Couchbase y selecciones el mecanismo de acceso que mejor se adapte a tu aplicaci\u00f3n. Esencialmente, hay dos mecanismos de acceso en Couchbase -<\/em><\/p>\n<p><strong>El almac\u00e9n de claves\/valores es <em>esencialmente sincr\u00f3nico:<\/em><\/strong> en un \u00fanico conjunto de operaciones, puede asegurarse de que la asignaci\u00f3n de un \u00fanico valor a una clave espec\u00edfica se ha realizado correctamente, de forma \u00fanica o at\u00f3mica. Esto le permite asegurarse de que cualquier operaci\u00f3n que realice s\u00f3lo tenga \u00e9xito si se aplican las restricciones de unicidad de la clave.<\/p>\n<p><strong>La consulta de documentos mediante vistas es <em>as\u00edncrono <\/em>y <em>finalmente consistente:<\/em><\/strong> es decir, las vistas se actualizan en alg\u00fan momento (posiblemente lejano) de cuando usted pidi\u00f3 que se hiciera un cambio, pero en \u00faltima instancia, si deja de hacer algo en el sistema, se \"pondr\u00e1n al d\u00eda\" y cuando (finalmente) lo hagan, el sistema ser\u00e1 100% coherente.<\/p>\n<p>Estos dos mecanismos ofrecen otras sem\u00e1nticas diferentes. Por ejemplo, mientras que el almac\u00e9n clave-valor exige que las claves tengan valores distintos, las vistas no. La funci\u00f3n de mapeo de una vista puede crear tantas claves como quiera con los mismos valores; las vistas tambi\u00e9n admiten claves multiparte con una riqueza que el simple almac\u00e9n clave-valor no permite.<\/p>\n<p>Por \u00faltimo, los dos interact\u00faan, en el sentido de que la entrada a una vista es exactamente el conjunto de documentos que se encuentran en el almac\u00e9n de claves\/valores.<\/p>\n<h3>Definici\u00f3n de vistas<\/h3>\n<p>Las vistas en Couchbase se definen usando un par de funciones map y reduce. La funci\u00f3n reduce es opcional y simplemente est\u00e1 presente para permitir que m\u00faltiples filas de una vista sean \"colapsadas\" en una sola fila. Como para los prop\u00f3sitos de este art\u00edculo, estoy principalmente interesado en usar vistas para crear un \"\u00edndice\" de objetos en Couchbase, no discutir\u00e9 m\u00e1s los m\u00e9todos \"reduce\", pero si quieres hacer cosas excitantes (como an\u00e1lisis de datos), vale la pena echarles un vistazo en la documentaci\u00f3n.<\/p>\n<p>Las funciones map y reduce en Couchbase est\u00e1n definidas en JavaScript y l\u00f3gicamente son \"llamadas\" cuando se necesitan. Para depurar es posible definir un entorno sencillo en Chrome o Rhino que envuelva estas funciones y permita ver c\u00f3mo operar\u00edan \"sem\u00e1nticamente\" fuera de Couchbase. Sin embargo, este no es directamente el mecanismo que se utiliza para implementar la creaci\u00f3n de vistas dentro de Couchbase: m\u00e1s bien, las actualizaciones se retrasan, se agrupan y se procesan por lotes para lograr el m\u00e1ximo rendimiento a escala. Adem\u00e1s, las actualizaciones se desglosan por nodo servidor y pueden producirse en cualquier orden.<\/p>\n<p>Obviamente, se trata de un mecanismo incre\u00edblemente potente para definir un \u00edndice, sobre todo en comparaci\u00f3n con los mecanismos SQL est\u00e1ndar. Por ejemplo, si tienes un atributo en un documento que es un objeto array es posible calcular y poner la longitud (o de hecho la suma) del objeto en uno de los atributos.<\/p>\n<p>Desde mi punto de vista, uno de los problemas de este enfoque es que las funciones operan en una \"caja de arena\", es decir, cada documento que se presenta a la funci\u00f3n de mapa ha sido separado de su contexto. Si los datos son desiguales, esto puede ser un problema, pero en una visi\u00f3n del mundo escalable y estrictamente compartida, este enfoque tiene mucho sentido. Dado que los documentos est\u00e1n en hash en diferentes servidores, recuperarlos durante el procesamiento por lotes de JavaScript ser\u00eda relativamente caro e ineficiente.<\/p>\n<h3>Acceso a las vistas<\/h3>\n<p>Una vez definida una vista mediante estas funciones JavaScript, es bastante f\u00e1cil acceder a las vistas por rango de teclas, ya sea directamente mediante HTTP o a trav\u00e9s de uno de los muchos enlaces de cliente. En mi proyecto, utilizo la biblioteca de cliente Java, que abre las vistas que estoy utilizando y, a continuaci\u00f3n, realiza consultas basadas en las definiciones abstractas proporcionadas en mi archivo XML de definiciones. El problema de la coherencia \"eventual\" Una vez definidos los \u00edndices de mis datos, he intentado acceder a ellos para recuperar los datos almacenados. Dado que hab\u00eda optado por utilizar UUID sem\u00e1nticamente irrelevantes como claves en el almac\u00e9n de claves\/valores, hab\u00eda renunciado a la oportunidad inmediata de encontrar algo all\u00ed utilizando una clave \"natural\", y opt\u00e9 por utilizar el mecanismo de \u00edndices para generar estas claves \"naturales\". Pero r\u00e1pidamente descubr\u00ed que ten\u00eda casos de uso que no encajaban bien con la sem\u00e1ntica de la vista.<\/p>\n<h3>Credenciales<\/h3>\n<p>El primer problema que me encontr\u00e9 fue con las credenciales. Couchbase actualiza sus vistas despu\u00e9s de una cierta cantidad de actividad o una cierta cantidad de tiempo, lo que ocurra primero. Aunque eso probablemente ser\u00eda suficiente para casos de uso de la vida real, nuestras pruebas se basaban en scripts repetibles y automatizados. El primer gui\u00f3n que escrib\u00ed simulaba que un usuario se registraba en el sistema e inmediatamente se daba la vuelta y se conectaba. Utilizaba el mecanismo de vista para extraer las credenciales \"\u00fanicas\" del usuario (mecanismo de inicio de sesi\u00f3n e identificador de inicio de sesi\u00f3n) y asignarlas al UUID de las credenciales. Sin embargo, cuando fui a buscar esto desde la vista despu\u00e9s de crear la credencial, todav\u00eda no hab\u00eda llegado al \u00edndice. He intentado utilizar la opci\u00f3n \"stale\" en la vista, pero para las operaciones de inicio de sesi\u00f3n, esto puede ser costoso (normalmente alrededor de 2,5s para hacer la consulta).<\/p>\n<h3>Artefactos generados<\/h3>\n<p>Otro problema relacionado era el de los artefactos que generaba durante el procesamiento de las peticiones de los usuarios. Estos artefactos \"recordaban\" interacciones anteriores del usuario y permit\u00edan al sistema responder adecuadamente. En cada caso, el artefacto ten\u00eda una clave \"natural\" \u00fanica que reflejaba el usuario, la operaci\u00f3n que estaba realizando y el objeto sobre el que la estaba realizando. Utilic\u00e9 vistas para rastrearlos y volver a cargarlos cuando el mismo usuario realizaba la misma operaci\u00f3n en el mismo objeto en una fecha posterior.<\/p>\n<p>Me encontr\u00e9 con el mismo problema con la coherencia final: a la velocidad a la que se ejecutaban mis scripts de prueba automatizados, emit\u00eda la segunda solicitud antes de que el objeto creado en la primera hubiera llegado al \u00edndice.<\/p>\n<h3>Documentos anidados<\/h3>\n<p>El tercer caso que me encontr\u00e9 fue el de los documentos de un mismo \"grupo\". Una vez encontrado el principal -el que se estaba \"asegurando\" por usuario-, quer\u00eda navegar a algunos de los otros objetos de la misma \"vecindad\". Defin\u00ed una vista que describ\u00eda el tipo de objetos que quer\u00eda encontrar e inclu\u00eda el ID del objeto original. Buscando en este \u00edndice el ID de objeto que ten\u00eda y las caracter\u00edsticas que buscaba, cre\u00ed que podr\u00eda recuperar todos los documentos del grupo.<\/p>\n<p>De nuevo, la velocidad a la que mis pruebas generaban los documentos y luego intentaban acceder a ellos me estaba matando. Creaba los objetos, me daba la vuelta e intentaba acceder a la vista, s\u00f3lo para descubrir que segu\u00eda vac\u00eda. Unos segundos m\u00e1s tarde, cuando intentaba diagnosticar el problema a trav\u00e9s de la interfaz de usuario, los objetos estaban all\u00ed, pero el \u00edndice a\u00fan no se hab\u00eda actualizado.<\/p>\n<h3>La primera soluci\u00f3n: Duplicar los \u00edndices<\/h3>\n<p>A medida que experimentaba con Couchbase, reconoc\u00ed la diferencia entre el almac\u00e9n de claves\/valores y el mecanismo de vistas. Mi primer intento de resolver este problema fue simplemente duplicar todo el trabajo que Couchbase estaba haciendo en la vista pero en \"tiempo real\" en el almac\u00e9n de claves\/valores. En realidad, esto no fue una carga tan grande como podr\u00eda parecer: como todas mis definiciones de datos estaban en forma abstracta, estaba generando las definiciones de la vista y era relativamente f\u00e1cil extender esto para generar el mismo c\u00f3digo en Java para almacenar los elementos en el almac\u00e9n de claves\/valores.<\/p>\n<p>Esto solucion\u00f3 mis problemas, pero nunca me gust\u00f3 por varias razones. La m\u00e1s obvia, la ineficaz duplicaci\u00f3n me hizo cuestionar la elecci\u00f3n de Couchbase. Pero lo m\u00e1s importante es que el n\u00famero de casos diferentes que surg\u00edan en el c\u00f3digo suger\u00edan que estaba confundiendo cuestiones. Las dos bifurcaciones m\u00e1s importantes eran la diferencia entre \u00edndices \"\u00fanicos\" y \"no \u00fanicos\"; y la diferencia entre \u00edndices que necesitaban considerar contextos de seguridad y los que no.<\/p>\n<h3>La segunda soluci\u00f3n: Reconocer la naturaleza individual de las cosas<\/h3>\n<p>La servicial gente de Couchbase me indic\u00f3 el patr\u00f3n \"lookup\" en la documentaci\u00f3n de Couchbase, que describ\u00eda en detalle un problema muy similar al que yo ten\u00eda con las credenciales.<\/p>\n<p>El patr\u00f3n de b\u00fasqueda describe c\u00f3mo utilizar una indirecci\u00f3n dentro del almac\u00e9n de claves\/valores para tener esencialmente un \u00fanico objeto con m\u00faltiples claves. Hay una clave \u00fanica (el UUID en mi caso) y todas las dem\u00e1s claves secundarias apuntan a ella. Pude reelaborar mis definiciones de \u00edndice para distinguir entre el caso en el que quer\u00eda una vista que pudiera soportar m\u00faltiples filas con la misma clave, y el caso en el que quer\u00eda s\u00f3lo una fila con cualquier clave dada. Para ello, especifiqu\u00e9 c\u00f3mo se pod\u00eda construir una clave \u00fanica a partir de los campos del objeto de datos, que luego se utilizaba como una clave de b\u00fasqueda que apuntaba al UUID del objeto.<\/p>\n<p>Esto resolvi\u00f3 los dos primeros retos utilizados anteriormente. Para las credenciales, pude utilizar el \"mecanismo de credenciales\" (basic, OpenId, OAuth, etc.) y el identificador \u00fanico de inicio de sesi\u00f3n del usuario con ese mecanismo como clave \u00fanica; para los artefactos, pude utilizar la combinaci\u00f3n de identificador de usuario, operaci\u00f3n y UUID del objeto. En cada caso, a\u00f1ad\u00ed autom\u00e1ticamente el hecho de que se trataba de una clave secundaria y el tipo de objeto indexado.<\/p>\n<p>El tercer reto era de naturaleza diferente y requer\u00eda una soluci\u00f3n distinta, pero de nuevo utilizar una vista hab\u00eda sido la elecci\u00f3n equivocada. En este caso, el conjunto de identificadores de objeto \u00fanicos que hab\u00eda que tener en cuenta estaba contenido en la definici\u00f3n de objeto real que ya ten\u00eda en memoria. En lugar de buscar los objetos en una vista, el enfoque correcto era leer cada uno de estos objetos desde el almac\u00e9n de claves\/valores utilizando sus UUID y ver cu\u00e1les ten\u00edan las caracter\u00edsticas apropiadas.<\/p>\n<p>Aunque no est\u00e1 claro que este enfoque pueda ampliarse a miles o millones de objetos contenidos, por el momento tampoco est\u00e1 claro que sea necesario. Pero otros enfoques (h\u00edbridos) son posibles en este caso. Por ejemplo, ser\u00eda posible analizar cada objeto contenido a medida que se escribe en el almac\u00e9n de claves\/valores y a\u00f1adirle un conjunto adecuado de subelementos caracterizados si coincide con los criterios. Equilibrar el tama\u00f1o, el n\u00famero y las relaciones entre los objetos es un reto completamente distinto al que me enfrento y que puede que alg\u00fan d\u00eda constituya el contenido de otra entrada del blog.<\/p>\n<h3>Principales conclusiones<\/h3>\n<p>La principal conclusi\u00f3n es que es importante entender qu\u00e9 es lo que realmente quieres conseguir y asegurarte de que eliges el mecanismo de acceso a Couchbase adecuado para satisfacer las necesidades de tu aplicaci\u00f3n.<\/p>\n<p>En mi caso, yo estaba tratando de abusar de las vistas porque es una caracter\u00edstica fresca y poderosa que es dif\u00edcil de resistir. Pero el hecho es que, las vistas simplemente no son un buen ajuste para todos los requisitos de acceso a datos en su aplicaci\u00f3n.<\/p>\n<p>La otra cosa que hay que tener en cuenta es ser comprensivo con las necesidades del software de infraestructura y reconocer que para la escalabilidad es importante tener datos compartidos. Si te opones a ello o intentas evitarlo, s\u00f3lo conseguir\u00e1s sufrimiento.<\/p>\n<p><strong>Entonces, \u00bfc\u00f3mo elegir qu\u00e9 patrones de acceso a Couchbase usar para tus datos? A partir de esta experiencia, he escrito algunas pautas que los desarrolladores pueden utilizar para decidir qu\u00e9 patr\u00f3n de acceso a datos elegir. Aunque no se trata de una lista exhaustiva, aqu\u00ed tienes 4 patrones t\u00edpicos que deber\u00edas tener en cuenta: <\/strong><\/p>\n<p>1. Si tienes la clave de un objeto, \u00fasala para obtener el objeto directamente del almac\u00e9n de claves\/valores de Couchbase.<\/p>\n<p>2. Si no tienes eso, pero est\u00e1s buscando un objeto que tendr\u00eda una clave secundaria \u00fanica, entonces intenta encontrar la clave ley\u00e9ndola del \u00edndice secundario y luego obt\u00e9n el objeto del almac\u00e9n de claves\/valores de Couchbase usando su clave.<\/p>\n<p>3. Si ya tienes un objeto y contiene referencias a otros objetos, utiliza esas referencias directamente; no vayas a buscarlas bas\u00e1ndote en una relaci\u00f3n que se ha escrito en una vista.<\/p>\n<p>4. Finalmente, si est\u00e1s buscando recuperar todos los objetos que coinciden con ciertos criterios en toda la base de datos, y la sem\u00e1ntica de tu operaci\u00f3n es tal que no hay dependencia inherente de orden, entonces accede a una vista que hayas definido. Recuerda que las vistas en Couchbase son eventualmente consistentes.<\/p>","protected":false},"excerpt":{"rendered":"<p>Ziniki Infrastructure Systems built their integration tier on top of Couchbase, because the combination of document storage with incremental mapreduce gave them a powerful way to query data. In this blog, Gareth Powell, founder and architect at Ziniki, describes his [&hellip;]<\/p>","protected":false},"author":17,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[1248,1241],"ppma_author":[9016],"class_list":["post-1539","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-mapreduce","tag-views"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d - The Couchbase Blog<\/title>\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\/couchbase-and-ziniki\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d\" \/>\n<meta property=\"og:description\" content=\"Ziniki Infrastructure Systems built their integration tier on top of Couchbase, because the combination of document storage with incremental mapreduce gave them a powerful way to query data. In this blog, Gareth Powell, founder and architect at Ziniki, describes his [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-and-ziniki\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:22:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gareth Powell, Founder and Architect, Ziniki\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gareth Powell, Founder and Architect, Ziniki\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/\"},\"author\":{\"name\":\"Gareth Powell, Founder and Architect, Ziniki\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/dbfd9757166c833573ba59be8467217c\"},\"headline\":\"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d\",\"datePublished\":\"2014-12-16T19:22:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/\"},\"wordCount\":2690,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"MapReduce\",\"views\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/\",\"name\":\"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:22:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d\"}]},{\"@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\/dbfd9757166c833573ba59be8467217c\",\"name\":\"Gareth Powell, Founder and Architect, Ziniki\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/13d1e42888a60b2c1ca6f76884f4068f\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/67984ef192c980ba329e54e495be5f62ddb8a5b0ac29e0789190739cbcee0a76?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/67984ef192c980ba329e54e495be5f62ddb8a5b0ac29e0789190739cbcee0a76?s=96&d=mm&r=g\",\"caption\":\"Gareth Powell, Founder and Architect, Ziniki\"},\"description\":\"Gareth Powell is a Founder and Architect at Ziniki. Gareth Powell describes his experience of using mapreduce views in Couchbase.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/gareth-powell\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d - The Couchbase Blog","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\/couchbase-and-ziniki\/","og_locale":"es_MX","og_type":"article","og_title":"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d","og_description":"Ziniki Infrastructure Systems built their integration tier on top of Couchbase, because the combination of document storage with incremental mapreduce gave them a powerful way to query data. In this blog, Gareth Powell, founder and architect at Ziniki, describes his [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-and-ziniki\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:22:10+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Gareth Powell, Founder and Architect, Ziniki","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Gareth Powell, Founder and Architect, Ziniki","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/"},"author":{"name":"Gareth Powell, Founder and Architect, Ziniki","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/dbfd9757166c833573ba59be8467217c"},"headline":"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d","datePublished":"2014-12-16T19:22:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/"},"wordCount":2690,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["MapReduce","views"],"articleSection":["Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/","name":"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:22:10+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-and-ziniki\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase @ Ziniki : The odyssey to find \u201cFind\u201d"}]},{"@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\/dbfd9757166c833573ba59be8467217c","name":"Gareth Powell, fundador y arquitecto, Ziniki","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/13d1e42888a60b2c1ca6f76884f4068f","url":"https:\/\/secure.gravatar.com\/avatar\/67984ef192c980ba329e54e495be5f62ddb8a5b0ac29e0789190739cbcee0a76?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/67984ef192c980ba329e54e495be5f62ddb8a5b0ac29e0789190739cbcee0a76?s=96&d=mm&r=g","caption":"Gareth Powell, Founder and Architect, Ziniki"},"description":"Gareth Powell es fundador y arquitecto de Ziniki. Gareth Powell describe su experiencia en el uso de vistas mapreduce en Couchbase.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/gareth-powell\/"}]}},"authors":[{"term_id":9016,"user_id":17,"is_guest":0,"slug":"gareth-powell","display_name":"Gareth Powell, Founder and Architect, Ziniki","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/67984ef192c980ba329e54e495be5f62ddb8a5b0ac29e0789190739cbcee0a76?s=96&d=mm&r=g","author_category":"","last_name":"Powell","first_name":"Gareth","job_title":"","user_url":"","description":"Gareth Powell es fundador y arquitecto de Ziniki. Gareth Powell describe su experiencia en el uso de vistas mapreduce en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1539","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\/17"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1539"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1539\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1539"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}