{
    "componentChunkName": "component---node-modules-gatsby-theme-try-ghost-src-templates-post-js",
    "path": "/javascript-funcional-intro/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__5fa68e1fa6c0f5058bff43ac","title":"Javascript Funcional I: Intro e Inmutabilidad","slug":"javascript-funcional-intro","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Capture-5.jpeg","excerpt":"Empezamos nueva serie donde explicaremos los conceptos básicos de la\nprogramación funcional orientados al mundo JavaScript.\nEmpecemos por lo básico, ¿qué es la programación funcional? Citando directamente\na la wikipedia\n\n> En informática, la programación funcional es un paradigma de programación\ndeclarativa basado en el uso de verdaderas funciones matemáticas. En este estilo\nde programación las funciones son ciudadanas de primera clase, porque sus\nexpresiones pueden ser asignadas a variables com","custom_excerpt":null,"visibility":"public","created_at_pretty":"7 Nov 2020","published_at_pretty":"7 Nov 2020","updated_at_pretty":"19 Jan 2021","created_at":"2020-11-07T13:07:59.000+01:00","published_at":"2020-11-07T14:57:05.000+01:00","updated_at":"2021-01-19T21:05:11.000+01:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},"tags":[{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"ramda","url":"https://jlgarcia.fulldev.ninja/tag/ramda/","name":"ramda","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"javascript","url":"https://jlgarcia.fulldev.ninja/tag/javascript/","name":"javascript","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null}],"plaintext":"Empezamos nueva serie donde explicaremos los conceptos básicos de la\nprogramación funcional orientados al mundo JavaScript.\nEmpecemos por lo básico, ¿qué es la programación funcional? Citando directamente\na la wikipedia\n\n> En informática, la programación funcional es un paradigma de programación\ndeclarativa basado en el uso de verdaderas funciones matemáticas. En este estilo\nde programación las funciones son ciudadanas de primera clase, porque sus\nexpresiones pueden ser asignadas a variables como se haría con cualquier otro\nvalor; además de que pueden crearse funciones de orden superior.\n\n\nDigamos que es un parádigma donde todo esta basado en algún tipo de función o\nteoría matemática (su centro fué el cálculo lambda) y nos obliga a realizar\nabstracciones que no son habituales en paradigmas más habituales como la\nprogramación orientada a objetos, pero esto no implica que tengamos que ser\nlicenciados en matemáticas para porder usarlo y beneficiarnos de sus ventajas.\n\nLas carácteristicas y ventajas que se suelen comentar sobre este paradigma:\n\n * En lugar de centrarse en el ¿cómo? se centra en el ¿qué? queremos hacer, lo\n   que hace que nos abstraigamos un poco más del problema que queremos resolver.\n * Como su nombre indica está básado en el trabajo con funciones, practicamente\n   todo es una función, y se tiende a la realización de funciones con un trabajo\n   mínimo y específico, por lo que tendremos funciones pequeñas donde por\n   ejemplo si estamos trabajando en un carrito de la compra existirian métodos\n   como sumar precio o añadir descuento, y estos métodos devolverían siempre lo\n   mismo siempre y cuando sus valores de entrada fueran los mismos. Muchos se\n   preguntaran pero con esto ¿cómo contruimos toda la lógica de un carrito de la\n   compra?... esto se basaría en la composición de funciones, es decir, cogemos\n   esas funciones pequeñas que hemos creado y componemos una lógica que cumpla\n   con nuestras necesidades. Siguiendo con el ejemplo del carrito si se añade\n   algo al carrito de la compra tendriamos un método añadir producto que lo que\n   podría hacer sería incluir producto al listado, sumar precio y aplicar\n   descuento. Esto ya lo veremos más adelante.\n * Usa lo que se conoce como funciones puras, estás funciones se llaman así\n   porque no tienen efectos colaterales, es decir, no cambián ni hacen nada\n   fuera del propio método (incluso un console.log es considerado un efecto\n   colateral), por eso siempre obtenemos el mismo resultado pasandole los mismos\n   parámetros.\n * Al basarse en las funciones puras es un lenguaje muy apto para el\n   paralelismo, ya que no modifica no accede a valores externos no tendremos\n   problemas de race condition o casi cualquier otro que pudiera venir surgido\n   de la concurrencia.\n * Las funciones son ciudadanos de primera clase, son funciones de orden\n   superior. Ambos casos están relacionados, las funciones de orden superior se\n   las llama asi cuando son funciones que actuan directamente sobre otras\n   funciones y entedemos funciones como ciudadanos de primera clase cuando las\n   funciones pueden ser tratadas como cualquier otro elemento del lenguaje, es\n   decir se pueden pasar como parámetros o se pueden devolver funciones\n   directamente como resultado.\n * Hace uso de lo que se conoce como recursividad, es decir, una función se\n   puede llamar a si misma, por ejemplo para recorrer un árbol de directorios,\n   podemos tener un método que sea abrir carpeta y según vaya recorriendo si el\n   fichero en cuestión no es una carpeta lo devuelve y si es una carpeta se\n   llama de nuevo a abrir carpeta y así hasta que se termina el arbol.\n * Todo es inmutable, es decir, no se modifica nada existente se crean elementos\n   nuevos dentro de las propias funciones con los cambios necesarios.\n * Suele ser un código más expresivo\n * Es un código más facilmente testeable\n * Se tiende menos a la repetición de código, ya que todo está planteado como\n   mini funciones con un trabajo en concreto, solo tenemos que reutilizarlas\n   cuando toque o componer funciones que las usen.\n\nSi me pongo podría seguir escribiendo características pero bueno en general creo\nque nos hacemos una idea de lo que os estoy vendiendo aquí y por mucho que siga\nhasta que no se vean ejemplos concretos no entenderemos lo que es esto realmente\npor lo que vamos a empezar hablando de Javascript e Inmutabilidad\n\nJavascript funcional\nPrimero hablemos un poco del caso concreto de Javascript como lenguaje\nfuncional. Para mi Javascript es de los mejores lenguajes que existen por su\nversatilidad y sus minimas obligaciones, es decir, podemos hacer lo que nos de\nla gana. Esto en general suele crear incovenientes porque no tenemos normas que\nseguir como puede ser establecer un tipo a las variables, como ya sabemos una\nvariable ahora puede ser un número y más tarde convertirse en un string sin ni\nsiquiera hacer un casting de tipos. Esta libertad viene de la mano de multitud\nde posibles errores si nos descuidamos con estas cosas (que no suelen pasar en\notros lenguajes).\nPero gracias a esto podemos programar como más nos convenga o nos guste y\ncombinar soluciones de distintos tipos para nuestro beneficio.\nComo sabemos en Javascript practicamente todo es un tipo Object o parte de un\ntipo Object, incluso las funciones, esto nos permite usar las funciones como\ncualquier otro objeto: asignarlo a variables, pasarlas por parámetro, devolver\nfunciones como resultado.... como hemos dicho al principio esto es lo básico\npara que un lenguaje sea funcional por lo que ya tenemos esta posibilidad,\nveamos como podemos cumplir con las carácteristicas básicas de un lenguaje\nfuncional: Inmutabilidad, Funciones puras, Funciones de orden superior, Uso de\ncurrificación y composición de funciones\n\nInmutabilidad\nVeamos lo primero el problema en cuestión\n\nconst oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = oldNinjas\ntotalNinjas.push(newNinja)\n\nconsole.log(oldNinjas) <-- Result: [ \"Ninja1\", \"Ninja2\", \"Ninja3\" ]\n\n\nComo vemos se ha modificado oldNinjas también, esto es funcionamiento interno de\nJavascript, digamos que lo que tenemos dentro de totalNinjas es una referencia\nen memoria a oldNinjas por eso hagamos lo que hagamos con totalNinjas se verá\nreproducido en oldNinjas, ojo que es un ejemplo un poco forzado para ver el caso\nconcreto, con un oldNinjas.concat no tendriamos este problema.\n\nSuponiendo que tenemos este problema tenemos varias opciones para resolverlo, la\nprimera hacemos un freeze sobre oldNinjas para que no se pueda modificar hagamos\nlo que hagamos (nos daria error) y a continuación realizamos una copia del\narray:\n\nconst oldNinjas = Object.freeze(['Ninja1', 'Ninja2'])\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = [...oldNinjas] // Copiamos\ntotalNinjas.push(newNinja)\n\nconsole.log(totalNinjas) // result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]\nconsole.log(oldNinjas) // result --> [ \"Ninja1\", \"Ninja2\"]\n\n\n\nEsta sería una opción para cumplir con este principio, otra es usar alguna\nlibrería funcional que haga esto por nosotros, a mí la que más me gusta es Ramda\n[https://ramdajs.com/], es muy eficiente y cumple más o menos bien con los\nrequerimientos funcionales\n\nconst R = require('ramda')\n\nconst oldNinjas = Object.freeze(['Ninja1', 'Ninja2'])\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = R.append(newNinja, oldNinjas)\n\nconsole.log(totalNinjas) // result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]\nconsole.log(oldNinjas) // result --> [ \"Ninja1\", \"Ninja2\"]\n\n\nEsto es un ejemplo de como podemos cumplir con el principio de inmutabalidad\nnecesario en la programación funcional.\n\nCreo que por el momento es suficiente para un único post, continuaremos con los\nsiguientes conceptos en proximos capítulos, cuadaaaos y un abrazooooooo","html":"<!--kg-card-begin: markdown--><p>Empezamos nueva serie donde explicaremos los conceptos básicos de la programación funcional orientados al mundo JavaScript.<br>\nEmpecemos por lo básico, ¿qué es la programación funcional? Citando directamente a la wikipedia</p>\n<blockquote>\n<p>En informática, la programación funcional es un paradigma de programación declarativa basado en el uso de verdaderas funciones matemáticas. En este estilo de programación las funciones son ciudadanas de primera clase, porque sus expresiones pueden ser asignadas a variables como se haría con cualquier otro valor; además de que pueden crearse funciones de orden superior.</p>\n</blockquote>\n<p>Digamos que es un parádigma donde todo esta basado en algún tipo de función o teoría matemática (su centro fué el cálculo lambda) y nos obliga a realizar abstracciones que no son habituales en paradigmas más habituales como la programación orientada a objetos, pero esto no implica que tengamos que ser licenciados en matemáticas para porder usarlo y beneficiarnos de sus ventajas.</p>\n<p>Las carácteristicas y ventajas que se suelen comentar sobre este paradigma:</p>\n<ul>\n<li>En lugar de centrarse en el <strong>¿cómo?</strong> se centra en el <strong>¿qué?</strong> queremos hacer, lo que hace que nos abstraigamos un poco más del problema que queremos resolver.</li>\n<li>Como su nombre indica está básado en el trabajo con funciones, practicamente todo es una función, y se tiende a la realización de funciones con un trabajo mínimo y específico, por lo que tendremos funciones pequeñas donde por ejemplo si estamos trabajando en un carrito de la compra existirian métodos como <strong>sumar precio o añadir descuento</strong>, y estos métodos devolverían siempre lo mismo siempre y cuando sus valores de entrada fueran los mismos. Muchos se preguntaran pero con esto ¿cómo contruimos toda la lógica de un carrito de la compra?... esto se basaría en la <strong>composición de funciones</strong>, es decir, cogemos esas funciones pequeñas que hemos creado y <em>componemos</em> una lógica que cumpla con nuestras necesidades. Siguiendo con el ejemplo del carrito si se añade algo al carrito de la compra tendriamos un método <strong>añadir producto</strong> que lo que podría hacer sería <strong>incluir producto al listado, sumar precio y aplicar descuento</strong>. Esto ya lo veremos más adelante.</li>\n<li>Usa lo que se conoce como <strong>funciones puras</strong>, estás funciones se llaman así porque no tienen efectos colaterales, es decir, no cambián ni hacen nada fuera del propio método (incluso un console.log es considerado un efecto colateral), por eso siempre obtenemos el mismo resultado pasandole los mismos parámetros.</li>\n<li>Al basarse en las funciones puras es un lenguaje muy apto para el paralelismo, ya que no modifica no accede a valores externos no tendremos problemas de <em>race condition</em> o casi cualquier otro que pudiera venir surgido de la concurrencia.</li>\n<li>Las funciones son <strong>ciudadanos de primera clase</strong>, son <strong>funciones de orden superior</strong>. Ambos casos están relacionados, las funciones de orden superior se las llama asi cuando son funciones que actuan directamente sobre otras funciones y entedemos funciones como ciudadanos de primera clase cuando las funciones pueden ser tratadas como cualquier otro elemento del lenguaje, es decir se pueden pasar como parámetros o se pueden devolver funciones directamente como resultado.</li>\n<li>Hace uso de lo que se conoce como <strong>recursividad</strong>, es decir, una función se puede llamar a si misma, por ejemplo para recorrer un árbol de directorios, podemos tener un método que sea <strong>abrir carpeta</strong> y según vaya recorriendo si el fichero en cuestión no es una carpeta lo devuelve y si es una carpeta se llama de nuevo a <strong>abrir carpeta</strong> y así hasta que se termina el arbol.</li>\n<li>Todo es inmutable, es decir, no se modifica nada existente se crean elementos nuevos dentro de las propias funciones con los cambios necesarios.</li>\n<li>Suele ser un código más expresivo</li>\n<li>Es un código más facilmente testeable</li>\n<li>Se tiende menos a la repetición de código, ya que todo está planteado como mini funciones con un trabajo en concreto, solo tenemos que reutilizarlas cuando toque o componer funciones que las usen.</li>\n</ul>\n<p>Si me pongo podría seguir escribiendo características pero bueno en general creo que nos hacemos una idea de lo que os estoy vendiendo aquí y por mucho que siga hasta que no se vean ejemplos concretos no entenderemos lo que es esto realmente por lo que vamos a empezar hablando de <strong>Javascript e Inmutabilidad</strong></p>\n<h2 id=\"javascriptfuncional\">Javascript funcional</h2>\n<p>Primero hablemos un poco del caso concreto de Javascript como lenguaje funcional. Para mi Javascript es de los mejores lenguajes que existen por su versatilidad y sus minimas obligaciones, es decir, <strong>podemos hacer lo que nos de la gana</strong>. Esto en general suele crear incovenientes porque no tenemos normas que seguir como puede ser establecer un tipo a las variables, como ya sabemos una variable ahora puede ser un número y más tarde convertirse en un string sin ni siquiera hacer un casting de tipos. Esta libertad viene de la mano de multitud de posibles errores si nos descuidamos con estas cosas (que no suelen pasar en otros lenguajes).<br>\nPero gracias a esto podemos programar como más nos convenga o nos guste y combinar soluciones de distintos tipos para nuestro beneficio.<br>\nComo sabemos en Javascript practicamente todo es un tipo Object o parte de un tipo Object, incluso las funciones, esto nos permite usar las funciones como cualquier otro objeto: asignarlo a variables, pasarlas por parámetro, devolver funciones como resultado.... como hemos dicho al principio esto es lo básico para que un lenguaje sea funcional por lo que ya tenemos esta posibilidad, veamos como podemos cumplir con las carácteristicas básicas de un lenguaje funcional: <strong>Inmutabilidad</strong>, <strong>Funciones puras</strong>, <strong>Funciones de orden superior</strong>, <strong>Uso de currificación</strong> y <strong>composición de funciones</strong></p>\n<h3 id=\"inmutabilidad\">Inmutabilidad</h3>\n<p>Veamos lo primero el problema en cuestión</p>\n<pre><code class=\"language-javascript\">const oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = oldNinjas\ntotalNinjas.push(newNinja)\n\nconsole.log(oldNinjas) &lt;-- Result: [ &quot;Ninja1&quot;, &quot;Ninja2&quot;, &quot;Ninja3&quot; ]\n</code></pre>\n<p>Como vemos se ha modificado <em>oldNinjas</em> también, esto es funcionamiento interno de Javascript, digamos que lo que tenemos dentro de <em>totalNinjas</em> es una referencia en memoria a <em>oldNinjas</em> por eso hagamos lo que hagamos con totalNinjas se verá reproducido en oldNinjas, ojo que es un ejemplo un poco forzado para ver el caso concreto, con un <strong>oldNinjas.concat</strong> no tendriamos este problema.</p>\n<p>Suponiendo que tenemos este problema tenemos varias opciones para resolverlo, la primera hacemos un <strong>freeze</strong> sobre oldNinjas para que no se pueda modificar hagamos lo que hagamos (nos daria error) y a continuación realizamos una copia del array:</p>\n<pre><code class=\"language-javascript\">const oldNinjas = Object.freeze(['Ninja1', 'Ninja2'])\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = [...oldNinjas] // Copiamos\ntotalNinjas.push(newNinja)\n\nconsole.log(totalNinjas) // result --&gt; [ &quot;Ninja1&quot;, &quot;Ninja2&quot;, &quot;Ninja3&quot;]\nconsole.log(oldNinjas) // result --&gt; [ &quot;Ninja1&quot;, &quot;Ninja2&quot;]\n\n</code></pre>\n<p>Esta sería una opción para cumplir con este principio, otra es usar alguna librería funcional que haga esto por nosotros, a mí la que más me gusta es <a href=\"https://ramdajs.com/\">Ramda</a>, es muy eficiente y cumple más o menos bien con los requerimientos funcionales</p>\n<pre><code class=\"language-javascript\">const R = require('ramda')\n\nconst oldNinjas = Object.freeze(['Ninja1', 'Ninja2'])\nconst newNinja = 'Ninja3'\n\nconst totalNinjas = R.append(newNinja, oldNinjas)\n\nconsole.log(totalNinjas) // result --&gt; [ &quot;Ninja1&quot;, &quot;Ninja2&quot;, &quot;Ninja3&quot;]\nconsole.log(oldNinjas) // result --&gt; [ &quot;Ninja1&quot;, &quot;Ninja2&quot;]\n</code></pre>\n<p>Esto es un ejemplo de como podemos cumplir con el principio de inmutabalidad necesario en la programación funcional.</p>\n<p>Creo que por el momento es suficiente para un único post, continuaremos con los siguientes conceptos en proximos capítulos, cuadaaaos y un abrazooooooo</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/javascript-funcional-intro/","canonical_url":null,"uuid":"b07c9ffd-7cf7-46c2-9239-a2170e2764e4","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5fa68e1fa6c0f5058bff43ac","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Empezamos nueva serie donde explicaremos los conceptos básicos de la programación funcional orientados al mundo JavaScript.<br>\nEmpecemos por lo básico, ¿qué es la programación funcional? Citando directamente a la wikipedia</p>\n<blockquote>\n<p>En informática, la programación funcional es un paradigma de programación declarativa basado en el uso de verdaderas funciones matemáticas. En este estilo de programación las funciones son ciudadanas de primera clase, porque sus expresiones pueden ser asignadas a variables como se haría con cualquier otro valor; además de que pueden crearse funciones de orden superior.</p>\n</blockquote>\n<p>Digamos que es un parádigma donde todo esta basado en algún tipo de función o teoría matemática (su centro fué el cálculo lambda) y nos obliga a realizar abstracciones que no son habituales en paradigmas más habituales como la programación orientada a objetos, pero esto no implica que tengamos que ser licenciados en matemáticas para porder usarlo y beneficiarnos de sus ventajas.</p>\n<p>Las carácteristicas y ventajas que se suelen comentar sobre este paradigma:</p>\n<ul>\n<li>En lugar de centrarse en el <strong>¿cómo?</strong> se centra en el <strong>¿qué?</strong> queremos hacer, lo que hace que nos abstraigamos un poco más del problema que queremos resolver.</li>\n<li>Como su nombre indica está básado en el trabajo con funciones, practicamente todo es una función, y se tiende a la realización de funciones con un trabajo mínimo y específico, por lo que tendremos funciones pequeñas donde por ejemplo si estamos trabajando en un carrito de la compra existirian métodos como <strong>sumar precio o añadir descuento</strong>, y estos métodos devolverían siempre lo mismo siempre y cuando sus valores de entrada fueran los mismos. Muchos se preguntaran pero con esto ¿cómo contruimos toda la lógica de un carrito de la compra?... esto se basaría en la <strong>composición de funciones</strong>, es decir, cogemos esas funciones pequeñas que hemos creado y <em>componemos</em> una lógica que cumpla con nuestras necesidades. Siguiendo con el ejemplo del carrito si se añade algo al carrito de la compra tendriamos un método <strong>añadir producto</strong> que lo que podría hacer sería <strong>incluir producto al listado, sumar precio y aplicar descuento</strong>. Esto ya lo veremos más adelante.</li>\n<li>Usa lo que se conoce como <strong>funciones puras</strong>, estás funciones se llaman así porque no tienen efectos colaterales, es decir, no cambián ni hacen nada fuera del propio método (incluso un console.log es considerado un efecto colateral), por eso siempre obtenemos el mismo resultado pasandole los mismos parámetros.</li>\n<li>Al basarse en las funciones puras es un lenguaje muy apto para el paralelismo, ya que no modifica no accede a valores externos no tendremos problemas de <em>race condition</em> o casi cualquier otro que pudiera venir surgido de la concurrencia.</li>\n<li>Las funciones son <strong>ciudadanos de primera clase</strong>, son <strong>funciones de orden superior</strong>. Ambos casos están relacionados, las funciones de orden superior se las llama asi cuando son funciones que actuan directamente sobre otras funciones y entedemos funciones como ciudadanos de primera clase cuando las funciones pueden ser tratadas como cualquier otro elemento del lenguaje, es decir se pueden pasar como parámetros o se pueden devolver funciones directamente como resultado.</li>\n<li>Hace uso de lo que se conoce como <strong>recursividad</strong>, es decir, una función se puede llamar a si misma, por ejemplo para recorrer un árbol de directorios, podemos tener un método que sea <strong>abrir carpeta</strong> y según vaya recorriendo si el fichero en cuestión no es una carpeta lo devuelve y si es una carpeta se llama de nuevo a <strong>abrir carpeta</strong> y así hasta que se termina el arbol.</li>\n<li>Todo es inmutable, es decir, no se modifica nada existente se crean elementos nuevos dentro de las propias funciones con los cambios necesarios.</li>\n<li>Suele ser un código más expresivo</li>\n<li>Es un código más facilmente testeable</li>\n<li>Se tiende menos a la repetición de código, ya que todo está planteado como mini funciones con un trabajo en concreto, solo tenemos que reutilizarlas cuando toque o componer funciones que las usen.</li>\n</ul>\n<p>Si me pongo podría seguir escribiendo características pero bueno en general creo que nos hacemos una idea de lo que os estoy vendiendo aquí y por mucho que siga hasta que no se vean ejemplos concretos no entenderemos lo que es esto realmente por lo que vamos a empezar hablando de <strong>Javascript e Inmutabilidad</strong></p>\n<h2 id=\"javascriptfuncional\">Javascript funcional</h2>\n<p>Primero hablemos un poco del caso concreto de Javascript como lenguaje funcional. Para mi Javascript es de los mejores lenguajes que existen por su versatilidad y sus minimas obligaciones, es decir, <strong>podemos hacer lo que nos de la gana</strong>. Esto en general suele crear incovenientes porque no tenemos normas que seguir como puede ser establecer un tipo a las variables, como ya sabemos una variable ahora puede ser un número y más tarde convertirse en un string sin ni siquiera hacer un casting de tipos. Esta libertad viene de la mano de multitud de posibles errores si nos descuidamos con estas cosas (que no suelen pasar en otros lenguajes).<br>\nPero gracias a esto podemos programar como más nos convenga o nos guste y combinar soluciones de distintos tipos para nuestro beneficio.<br>\nComo sabemos en Javascript practicamente todo es un tipo Object o parte de un tipo Object, incluso las funciones, esto nos permite usar las funciones como cualquier otro objeto: asignarlo a variables, pasarlas por parámetro, devolver funciones como resultado.... como hemos dicho al principio esto es lo básico para que un lenguaje sea funcional por lo que ya tenemos esta posibilidad, veamos como podemos cumplir con las carácteristicas básicas de un lenguaje funcional: <strong>Inmutabilidad</strong>, <strong>Funciones puras</strong>, <strong>Funciones de orden superior</strong>, <strong>Uso de currificación</strong> y <strong>composición de funciones</strong></p>\n<h3 id=\"inmutabilidad\">Inmutabilidad</h3>\n<p>Veamos lo primero el problema en cuestión</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> oldNinjas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Ninja1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ninja2'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> newNinja <span class=\"token operator\">=</span> <span class=\"token string\">'Ninja3'</span>\n\n<span class=\"token keyword\">const</span> totalNinjas <span class=\"token operator\">=</span> oldNinjas\ntotalNinjas<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>newNinja<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">)</span> <span class=\"token operator\">&#x3C;</span><span class=\"token operator\">--</span> Result<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"Ninja1\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Ninja2\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Ninja3\"</span> <span class=\"token punctuation\">]</span>\n</code></pre></div>\n<p>Como vemos se ha modificado <em>oldNinjas</em> también, esto es funcionamiento interno de Javascript, digamos que lo que tenemos dentro de <em>totalNinjas</em> es una referencia en memoria a <em>oldNinjas</em> por eso hagamos lo que hagamos con totalNinjas se verá reproducido en oldNinjas, ojo que es un ejemplo un poco forzado para ver el caso concreto, con un <strong>oldNinjas.concat</strong> no tendriamos este problema.</p>\n<p>Suponiendo que tenemos este problema tenemos varias opciones para resolverlo, la primera hacemos un <strong>freeze</strong> sobre oldNinjas para que no se pueda modificar hagamos lo que hagamos (nos daria error) y a continuación realizamos una copia del array:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> oldNinjas <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">freeze</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'Ninja1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ninja2'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> newNinja <span class=\"token operator\">=</span> <span class=\"token string\">'Ninja3'</span>\n\n<span class=\"token keyword\">const</span> totalNinjas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token operator\">...</span>oldNinjas<span class=\"token punctuation\">]</span> <span class=\"token comment\">// Copiamos</span>\ntotalNinjas<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>newNinja<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>totalNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result --> [ \"Ninja1\", \"Ninja2\"]</span>\n\n</code></pre></div>\n<p>Esta sería una opción para cumplir con este principio, otra es usar alguna librería funcional que haga esto por nosotros, a mí la que más me gusta es <a href=\"https://ramdajs.com/\">Ramda</a>, es muy eficiente y cumple más o menos bien con los requerimientos funcionales</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token constant\">R</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ramda'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> oldNinjas <span class=\"token operator\">=</span> Object<span class=\"token punctuation\">.</span><span class=\"token function\">freeze</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">'Ninja1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ninja2'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> newNinja <span class=\"token operator\">=</span> <span class=\"token string\">'Ninja3'</span>\n\n<span class=\"token keyword\">const</span> totalNinjas <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span>newNinja<span class=\"token punctuation\">,</span> oldNinjas<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>totalNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result --> [ \"Ninja1\", \"Ninja2\"]</span>\n</code></pre></div>\n<p>Esto es un ejemplo de como podemos cumplir con el principio de inmutabalidad necesario en la programación funcional.</p>\n<p>Creo que por el momento es suficiente para un único post, continuaremos con los siguientes conceptos en proximos capítulos, cuadaaaos y un abrazooooooo</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empezamos nueva serie donde explicaremos los conceptos básicos de la programación funcional orientados al mundo JavaScript."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEmpecemos por lo básico, ¿qué es la programación funcional? Citando directamente a la wikipedia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En informática, la programación funcional es un paradigma de programación declarativa basado en el uso de verdaderas funciones matemáticas. En este estilo de programación las funciones son ciudadanas de primera clase, porque sus expresiones pueden ser asignadas a variables como se haría con cualquier otro valor; además de que pueden crearse funciones de orden superior."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Digamos que es un parádigma donde todo esta basado en algún tipo de función o teoría matemática (su centro fué el cálculo lambda) y nos obliga a realizar abstracciones que no son habituales en paradigmas más habituales como la programación orientada a objetos, pero esto no implica que tengamos que ser licenciados en matemáticas para porder usarlo y beneficiarnos de sus ventajas."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Las carácteristicas y ventajas que se suelen comentar sobre este paradigma:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"En lugar de centrarse en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"¿cómo?"}]},{"type":"text","value":" se centra en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"¿qué?"}]},{"type":"text","value":" queremos hacer, lo que hace que nos abstraigamos un poco más del problema que queremos resolver."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Como su nombre indica está básado en el trabajo con funciones, practicamente todo es una función, y se tiende a la realización de funciones con un trabajo mínimo y específico, por lo que tendremos funciones pequeñas donde por ejemplo si estamos trabajando en un carrito de la compra existirian métodos como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sumar precio o añadir descuento"}]},{"type":"text","value":", y estos métodos devolverían siempre lo mismo siempre y cuando sus valores de entrada fueran los mismos. Muchos se preguntaran pero con esto ¿cómo contruimos toda la lógica de un carrito de la compra?... esto se basaría en la "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"composición de funciones"}]},{"type":"text","value":", es decir, cogemos esas funciones pequeñas que hemos creado y "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"componemos"}]},{"type":"text","value":" una lógica que cumpla con nuestras necesidades. Siguiendo con el ejemplo del carrito si se añade algo al carrito de la compra tendriamos un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"añadir producto"}]},{"type":"text","value":" que lo que podría hacer sería "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"incluir producto al listado, sumar precio y aplicar descuento"}]},{"type":"text","value":". Esto ya lo veremos más adelante."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Usa lo que se conoce como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"funciones puras"}]},{"type":"text","value":", estás funciones se llaman así porque no tienen efectos colaterales, es decir, no cambián ni hacen nada fuera del propio método (incluso un console.log es considerado un efecto colateral), por eso siempre obtenemos el mismo resultado pasandole los mismos parámetros."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Al basarse en las funciones puras es un lenguaje muy apto para el paralelismo, ya que no modifica no accede a valores externos no tendremos problemas de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"race condition"}]},{"type":"text","value":" o casi cualquier otro que pudiera venir surgido de la concurrencia."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Las funciones son "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ciudadanos de primera clase"}]},{"type":"text","value":", son "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"funciones de orden superior"}]},{"type":"text","value":". Ambos casos están relacionados, las funciones de orden superior se las llama asi cuando son funciones que actuan directamente sobre otras funciones y entedemos funciones como ciudadanos de primera clase cuando las funciones pueden ser tratadas como cualquier otro elemento del lenguaje, es decir se pueden pasar como parámetros o se pueden devolver funciones directamente como resultado."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Hace uso de lo que se conoce como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"recursividad"}]},{"type":"text","value":", es decir, una función se puede llamar a si misma, por ejemplo para recorrer un árbol de directorios, podemos tener un método que sea "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abrir carpeta"}]},{"type":"text","value":" y según vaya recorriendo si el fichero en cuestión no es una carpeta lo devuelve y si es una carpeta se llama de nuevo a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"abrir carpeta"}]},{"type":"text","value":" y así hasta que se termina el arbol."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Todo es inmutable, es decir, no se modifica nada existente se crean elementos nuevos dentro de las propias funciones con los cambios necesarios."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Suele ser un código más expresivo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Es un código más facilmente testeable"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Se tiende menos a la repetición de código, ya que todo está planteado como mini funciones con un trabajo en concreto, solo tenemos que reutilizarlas cuando toque o componer funciones que las usen."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si me pongo podría seguir escribiendo características pero bueno en general creo que nos hacemos una idea de lo que os estoy vendiendo aquí y por mucho que siga hasta que no se vean ejemplos concretos no entenderemos lo que es esto realmente por lo que vamos a empezar hablando de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Javascript e Inmutabilidad"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"javascriptfuncional"},"children":[{"type":"text","value":"Javascript funcional"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Primero hablemos un poco del caso concreto de Javascript como lenguaje funcional. Para mi Javascript es de los mejores lenguajes que existen por su versatilidad y sus minimas obligaciones, es decir, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"podemos hacer lo que nos de la gana"}]},{"type":"text","value":". Esto en general suele crear incovenientes porque no tenemos normas que seguir como puede ser establecer un tipo a las variables, como ya sabemos una variable ahora puede ser un número y más tarde convertirse en un string sin ni siquiera hacer un casting de tipos. Esta libertad viene de la mano de multitud de posibles errores si nos descuidamos con estas cosas (que no suelen pasar en otros lenguajes)."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPero gracias a esto podemos programar como más nos convenga o nos guste y combinar soluciones de distintos tipos para nuestro beneficio."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo sabemos en Javascript practicamente todo es un tipo Object o parte de un tipo Object, incluso las funciones, esto nos permite usar las funciones como cualquier otro objeto: asignarlo a variables, pasarlas por parámetro, devolver funciones como resultado.... como hemos dicho al principio esto es lo básico para que un lenguaje sea funcional por lo que ya tenemos esta posibilidad, veamos como podemos cumplir con las carácteristicas básicas de un lenguaje funcional: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Inmutabilidad"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Funciones puras"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Funciones de orden superior"}]},{"type":"text","value":", "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Uso de currificación"}]},{"type":"text","value":" y "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"composición de funciones"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"inmutabilidad"},"children":[{"type":"text","value":"Inmutabilidad"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos lo primero el problema en cuestión"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" oldNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja1'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja2'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newNinja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja3'"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" totalNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" oldNinjas\ntotalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"push"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"--"}]},{"type":"text","value":" Result"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ninja1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ninja2\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Ninja3\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos se ha modificado "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oldNinjas"}]},{"type":"text","value":" también, esto es funcionamiento interno de Javascript, digamos que lo que tenemos dentro de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"totalNinjas"}]},{"type":"text","value":" es una referencia en memoria a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oldNinjas"}]},{"type":"text","value":" por eso hagamos lo que hagamos con totalNinjas se verá reproducido en oldNinjas, ojo que es un ejemplo un poco forzado para ver el caso concreto, con un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"oldNinjas.concat"}]},{"type":"text","value":" no tendriamos este problema."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suponiendo que tenemos este problema tenemos varias opciones para resolverlo, la primera hacemos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"freeze"}]},{"type":"text","value":" sobre oldNinjas para que no se pueda modificar hagamos lo que hagamos (nos daria error) y a continuación realizamos una copia del array:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" oldNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Object"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"freeze"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja1'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja2'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newNinja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja3'"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" totalNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"..."}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// Copiamos"}]},{"type":"text","value":"\ntotalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"push"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"totalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result --> [ \"Ninja1\", \"Ninja2\"]"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta sería una opción para cumplir con este principio, otra es usar alguna librería funcional que haga esto por nosotros, a mí la que más me gusta es "},{"type":"element","tagName":"a","properties":{"href":"https://ramdajs.com/"},"children":[{"type":"text","value":"Ramda"}]},{"type":"text","value":", es muy eficiente y cumple más o menos bien con los requerimientos funcionales"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"R"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"require"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ramda'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" oldNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Object"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"freeze"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja1'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja2'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newNinja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja3'"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" totalNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"R"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"append"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"totalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result --> [ \"Ninja1\", \"Ninja2\", \"Ninja3\"]"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result --> [ \"Ninja1\", \"Ninja2\"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto es un ejemplo de como podemos cumplir con el principio de inmutabalidad necesario en la programación funcional."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que por el momento es suficiente para un único post, continuaremos con los siguientes conceptos en proximos capítulos, cuadaaaos y un abrazooooooo"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"javascriptfuncional","heading":"Javascript funcional","items":[{"id":"inmutabilidad","heading":"Inmutabilidad"}]}]},"featureImageSharp":{"base":"Capture-5.jpeg","publicURL":"/static/28e76839a7fb382fbbe244b857f2980c/Capture-5.jpeg","imageMeta":{"width":628,"height":263},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMG/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABz9giD//EABcQAQADAAAAAAAAAAAAAAAAAAADERL/2gAIAQEAAQUCS4t//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEQEv/aAAgBAQAGPwIWJ//EABkQAAIDAQAAAAAAAAAAAAAAAAERACFREP/aAAgBAQABPyGERsI0r3n/2gAMAwEAAgADAAAAEHAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAIDAQAAAAAAAAAAAAAAASExABARUf/aAAgBAQABPxDERjkbBCDxvX//2Q==","aspectRatio":2.385321100917431,"src":"/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5.jpg","srcSet":"/static/28e76839a7fb382fbbe244b857f2980c/65d8c/Capture-5.jpg 260w,\n/static/28e76839a7fb382fbbe244b857f2980c/c5f21/Capture-5.jpg 520w,\n/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5.jpg 628w","srcWebp":"/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5.webp","srcSetWebp":"/static/28e76839a7fb382fbbe244b857f2980c/dc8f3/Capture-5.webp 260w,\n/static/28e76839a7fb382fbbe244b857f2980c/2db4b/Capture-5.webp 520w,\n/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5.webp 628w","sizes":"(max-width: 628px) 100vw, 628px"}}}},"prev":{"id":"Ghost__Post__5c3e0fda2dd6610fd828cb5b","title":"JS Algoritmos y estructuras de datos III: Patrón Multiple Pointers","slug":"js-algoritmos-y-estructurdas","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2020/11/unordered-3192273_640.png","excerpt":"Continuemos con nuestra serie sobre algoritmos y estructuras de datos, en este\ncaso vamos a ver el patrón Multiple pointers.\n\nMultiple pointers pattern\nEste patrón, pensando en arrays, se basa en crear puntos o valores que\ncorresponden a una posición y moverse al principio, el medio o al final según\nciertos condiciones. Este patrón es muy eficiente para reducir al mínimo posible\nla complejidad espacial.\n\nPensemos lo primero en un ejemplo donde poder usarlo, vamos a crear un método\nque dentro de ","custom_excerpt":null,"visibility":"public","created_at_pretty":"15 Jan 2019","published_at_pretty":"9 Nov 2020","updated_at_pretty":"19 Jan 2021","created_at":"2019-01-15T17:52:42.000+01:00","published_at":"2020-11-09T10:06:00.000+01:00","updated_at":"2021-01-19T21:05:30.000+01:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"algoritmos","url":"https://jlgarcia.fulldev.ninja/tag/algoritmos/","name":"algoritmos","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},"tags":[{"slug":"algoritmos","url":"https://jlgarcia.fulldev.ninja/tag/algoritmos/","name":"algoritmos","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"javascript","url":"https://jlgarcia.fulldev.ninja/tag/javascript/","name":"javascript","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null}],"plaintext":"Continuemos con nuestra serie sobre algoritmos y estructuras de datos, en este\ncaso vamos a ver el patrón Multiple pointers.\n\nMultiple pointers pattern\nEste patrón, pensando en arrays, se basa en crear puntos o valores que\ncorresponden a una posición y moverse al principio, el medio o al final según\nciertos condiciones. Este patrón es muy eficiente para reducir al mínimo posible\nla complejidad espacial.\n\nPensemos lo primero en un ejemplo donde poder usarlo, vamos a crear un método\nque dentro de un array ordenado nos devuelva la primera pareja que sume 0.\n\nEn un primer momento lo que nos vendría a la cabeza sería hacer 2 loops\nrecorriendo dos veces todo:\n\nfunction sumZero (arr) {\n  for (let i = 0; i < arr.length; i++) {\n    for (let j = 0; j < arr.length; j++) {\n      if (arr[i] + arr[j] === 0) {\n        return [arr[i], arr[j]]\n      } \n    }\n  }\n}\n\nconsole.log(sumZero([-2, -1, 0, 1, 2])) // [-2, 2]\n\n\nEste algoritmo tiene una complejidad:\n\n * Temporal O(n^2)\n * Espacial O(1)\n\nQue aunque en complejidad espacial no esta mal en temporal se nos puede ir de\nlas manos.\n\nVeamos una solución algo mejor usando este patrón, pero antes de continuar\nquiero recalcar que esto es posible porque el array esta ordenado, en general\nmuchos de los algoritmos cuentan con esto para poder resolverse (más adelante\nveremos varios de los mejores patrones de ordenación). Vamos con la solución:\n\nfunction sumZero (arr) {\n  // Establecemos los puntos de inicio (multiple pointers u know)\n  let left = 0\n  let right = arr.length - 1\n\n  while (left < right) { // para no pasarnos\n    let sum = arr[left] + arr[right]\n\n    if (sum === 0) {\n      return [arr[left], arr[right]]\n    } else if (sum > 0) {\n      right--\n    } else {\n      left++\n    }\n  }\n}\n\nconsole.log(sumZero([-3, -2, -1, 0, 1, 2, 4])) // [-2, 2]\n\n\nEn esta solución lo que hacemos es ir moviendo nuestros puntos y comprobando si\ncumple la condición de ser igual a 0. Como es un array ordenado si la suma es\nmayor de 0 quiere decir que el valor es superior por la derecha del 0 (nuestra\nvariable right) y si el valor es negativo quiere decir que el valor es superior\npor la izquierda (varible left). Según cual sea de los dos lo que hacemos es ir\nmoviendo nuestros puntos hasta que en algun momento de 0 o hayamos recorrido\ntodos los valores por entre ambos puntos.\n\nEsta solución tiene una complejidad de:\n\n * Temporal O(n), solo recorremos una vez los valores.\n * Espacial O(1)\n\nVeamos un ejemplo algo más dificil, en este caso queremos comprobar si un string\nes una subsecuencia de otro, o más bien si aparece como una secuencia de los\ncarácteres de otro pero de manera ordenada, es decir, si word estaría dentro de \nhello world en orden (no es word pero el orden es primero w y ultimo d)\n\nfunction isInString (string1, string2) {\n  // Establecemos los puntos de inicio (multiple pointers u know)\n  let s1 = 0\n  let s2 = 0\n\n  while (s2 < string2.length) { // para no pasarnos\n    if (string1[s1] === string2[s2]) s1++\n    if (s1 === string1.length) return true\n    s2++\n  }\n  return false\n}\n\nconsole.log(isInString('ninja', 'new in jail')) // true si quitamos lo que sobra n__ in ja__\n\n\nEn este caso tenemos dos strings que debemos recorrer y queremos comprobar si el\nprimero string1 es una subsecuencia del segundo string2. En este caso nuestros\npuntos los situamos al inicio de cada string y vamos recorriendo, si encontramos\nuna coincidencia de la primera posición del string1 en la primera posición del\nstring2, movemos la posición del string1 si no, movemos la posición del string2\ny así sucesivamente una vez que hayamos recorrido todo el string1 quiere decir\nque ya tenemos coincidencia y devolvemos true, en el caso de que la posición de\nstring2 sea mayor que el tamaño del string2 quiere decir que no tenemos\ncoincidencias por lo que devolvemos false.\n\nEste patrón como vemos es muy util para comparar de alguna forma ya sea un\nelemento o varios y no tener que recorrerlos todos n veces convirtiendo la\ncomplejidad temporal en O(n^x) siendo x la cantidad de veces (o la cantidad de\nelementos) que tenemos que recorrer un elemento (o varios) al completo. En este\ncaso por ejemplo tenemos una complejidad de:\n\n * Temporal O(n + m). Dos strings que en el peor de los casos recorreremos\n   enteros pero solo una vez cada uno.\n * Espacial O(1)\n\nHasta aquí lo referente a este patrón de resolución de problemas, nos vemos en\nel siguienteeee un abraazoooo","html":"<!--kg-card-begin: markdown--><p>Continuemos con nuestra serie sobre algoritmos y estructuras de datos, en este caso vamos a ver el patrón <strong>Multiple pointers</strong>.</p>\n<h3 id=\"multiplepointerspattern\">Multiple pointers pattern</h3>\n<p>Este patrón, pensando en arrays, se basa en crear puntos o valores que corresponden a una posición y moverse al principio, el medio o al final según ciertos condiciones. Este patrón es muy eficiente para reducir al mínimo posible la complejidad espacial.</p>\n<p>Pensemos lo primero en un ejemplo donde poder usarlo, vamos a crear un método que dentro de un array ordenado nos devuelva la primera pareja que sume 0.</p>\n<p>En un primer momento lo que nos vendría a la cabeza sería hacer 2 loops recorriendo dos veces todo:</p>\n<pre><code class=\"language-javascript\">function sumZero (arr) {\n  for (let i = 0; i &lt; arr.length; i++) {\n    for (let j = 0; j &lt; arr.length; j++) {\n      if (arr[i] + arr[j] === 0) {\n        return [arr[i], arr[j]]\n      } \n    }\n  }\n}\n\nconsole.log(sumZero([-2, -1, 0, 1, 2])) // [-2, 2]\n</code></pre>\n<p>Este algoritmo tiene una complejidad:</p>\n<ul>\n<li>Temporal <strong>O(n^2)</strong></li>\n<li>Espacial  <strong>O(1)</strong></li>\n</ul>\n<p>Que aunque en complejidad espacial no esta mal en temporal se nos puede ir de las manos.</p>\n<p>Veamos una solución algo mejor usando este patrón, pero antes de continuar quiero recalcar que esto es posible porque <strong>el array esta ordenado</strong>, en general muchos de los algoritmos cuentan con esto para poder resolverse (más adelante veremos varios de los mejores patrones de ordenación). Vamos con la solución:</p>\n<pre><code class=\"language-javascript\">function sumZero (arr) {\n  // Establecemos los puntos de inicio (multiple pointers u know)\n  let left = 0\n  let right = arr.length - 1\n\n  while (left &lt; right) { // para no pasarnos\n    let sum = arr[left] + arr[right]\n\n    if (sum === 0) {\n      return [arr[left], arr[right]]\n    } else if (sum &gt; 0) {\n      right--\n    } else {\n      left++\n    }\n  }\n}\n\nconsole.log(sumZero([-3, -2, -1, 0, 1, 2, 4])) // [-2, 2]\n</code></pre>\n<p>En esta solución lo que hacemos es ir moviendo nuestros puntos y comprobando si cumple la condición de ser igual a 0. Como es un array ordenado si la suma es mayor de 0 quiere decir que el valor es superior por la derecha del 0  (nuestra variable right) y si el valor es negativo quiere decir que el valor es superior por la izquierda (varible left). Según cual sea de los dos lo que hacemos es ir moviendo nuestros puntos hasta que en algun momento de 0 o hayamos recorrido todos los valores por entre ambos puntos.</p>\n<p>Esta solución tiene una complejidad de:</p>\n<ul>\n<li>Temporal <strong>O(n)</strong>, solo recorremos una vez los valores.</li>\n<li>Espacial <strong>O(1)</strong></li>\n</ul>\n<p>Veamos un ejemplo algo más dificil, en este caso queremos comprobar si un string es una subsecuencia de otro, o más bien si aparece como una secuencia de los carácteres de otro pero de manera ordenada, es decir, si <em>word</em> estaría dentro de <em>hello world</em> en orden (no es word pero el orden es primero w y ultimo d)</p>\n<pre><code class=\"language-javascript\">function isInString (string1, string2) {\n  // Establecemos los puntos de inicio (multiple pointers u know)\n  let s1 = 0\n  let s2 = 0\n\n  while (s2 &lt; string2.length) { // para no pasarnos\n    if (string1[s1] === string2[s2]) s1++\n    if (s1 === string1.length) return true\n    s2++\n  }\n  return false\n}\n\nconsole.log(isInString('ninja', 'new in jail')) // true si quitamos lo que sobra n__ in ja__\n</code></pre>\n<p>En este caso tenemos dos strings que debemos recorrer y queremos comprobar si el primero <em>string1</em> es una subsecuencia del segundo <em>string2</em>. En este caso nuestros puntos los situamos al inicio de cada string y vamos recorriendo, si encontramos una coincidencia de la primera posición del string1 en la primera posición del string2, movemos la posición del string1 si no, movemos la posición del string2 y así sucesivamente una vez que hayamos recorrido todo el string1 quiere decir que ya tenemos coincidencia y devolvemos <em>true</em>, en el caso de que la posición de string2 sea mayor que el tamaño del string2 quiere decir que no tenemos coincidencias por lo que devolvemos <em>false</em>.</p>\n<p>Este patrón como vemos es muy util para comparar de alguna forma ya sea un elemento o varios y no tener que recorrerlos todos <strong>n</strong> veces convirtiendo la complejidad temporal en <strong>O(n^x)</strong> siendo x la cantidad de veces (o la cantidad de elementos) que tenemos que recorrer un elemento (o varios) al completo. En este caso por ejemplo tenemos una complejidad de:</p>\n<ul>\n<li>Temporal <strong>O(n + m)</strong>. Dos strings que en el peor de los casos recorreremos enteros pero solo una vez cada uno.</li>\n<li>Espacial <strong>O(1)</strong></li>\n</ul>\n<p>Hasta aquí lo referente a este patrón de resolución de problemas, nos vemos en el siguienteeee un abraazoooo</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/js-algoritmos-y-estructurdas/","canonical_url":null,"uuid":"b102a2f6-1565-4a9f-94f5-a78ff12e173d","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5c3e0fda2dd6610fd828cb5b","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Continuemos con nuestra serie sobre algoritmos y estructuras de datos, en este caso vamos a ver el patrón <strong>Multiple pointers</strong>.</p>\n<h3 id=\"multiplepointerspattern\">Multiple pointers pattern</h3>\n<p>Este patrón, pensando en arrays, se basa en crear puntos o valores que corresponden a una posición y moverse al principio, el medio o al final según ciertos condiciones. Este patrón es muy eficiente para reducir al mínimo posible la complejidad espacial.</p>\n<p>Pensemos lo primero en un ejemplo donde poder usarlo, vamos a crear un método que dentro de un array ordenado nos devuelva la primera pareja que sume 0.</p>\n<p>En un primer momento lo que nos vendría a la cabeza sería hacer 2 loops recorriendo dos veces todo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">sumZero</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&#x3C;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&#x3C;</span> arr<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> arr<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>arr<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span> \n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sumZero</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// [-2, 2]</span>\n</code></pre></div>\n<p>Este algoritmo tiene una complejidad:</p>\n<ul>\n<li>Temporal <strong>O(n^2)</strong></li>\n<li>Espacial  <strong>O(1)</strong></li>\n</ul>\n<p>Que aunque en complejidad espacial no esta mal en temporal se nos puede ir de las manos.</p>\n<p>Veamos una solución algo mejor usando este patrón, pero antes de continuar quiero recalcar que esto es posible porque <strong>el array esta ordenado</strong>, en general muchos de los algoritmos cuentan con esto para poder resolverse (más adelante veremos varios de los mejores patrones de ordenación). Vamos con la solución:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">sumZero</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">arr</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Establecemos los puntos de inicio (multiple pointers u know)</span>\n  <span class=\"token keyword\">let</span> left <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n  <span class=\"token keyword\">let</span> right <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">.</span>length <span class=\"token operator\">-</span> <span class=\"token number\">1</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>left <span class=\"token operator\">&#x3C;</span> right<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// para no pasarnos</span>\n    <span class=\"token keyword\">let</span> sum <span class=\"token operator\">=</span> arr<span class=\"token punctuation\">[</span>left<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> arr<span class=\"token punctuation\">[</span>right<span class=\"token punctuation\">]</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>sum <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">[</span>arr<span class=\"token punctuation\">[</span>left<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> arr<span class=\"token punctuation\">[</span>right<span class=\"token punctuation\">]</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>sum <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      right<span class=\"token operator\">--</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      left<span class=\"token operator\">++</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">sumZero</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token operator\">-</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// [-2, 2]</span>\n</code></pre></div>\n<p>En esta solución lo que hacemos es ir moviendo nuestros puntos y comprobando si cumple la condición de ser igual a 0. Como es un array ordenado si la suma es mayor de 0 quiere decir que el valor es superior por la derecha del 0  (nuestra variable right) y si el valor es negativo quiere decir que el valor es superior por la izquierda (varible left). Según cual sea de los dos lo que hacemos es ir moviendo nuestros puntos hasta que en algun momento de 0 o hayamos recorrido todos los valores por entre ambos puntos.</p>\n<p>Esta solución tiene una complejidad de:</p>\n<ul>\n<li>Temporal <strong>O(n)</strong>, solo recorremos una vez los valores.</li>\n<li>Espacial <strong>O(1)</strong></li>\n</ul>\n<p>Veamos un ejemplo algo más dificil, en este caso queremos comprobar si un string es una subsecuencia de otro, o más bien si aparece como una secuencia de los carácteres de otro pero de manera ordenada, es decir, si <em>word</em> estaría dentro de <em>hello world</em> en orden (no es word pero el orden es primero w y ultimo d)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">isInString</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">string1<span class=\"token punctuation\">,</span> string2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Establecemos los puntos de inicio (multiple pointers u know)</span>\n  <span class=\"token keyword\">let</span> s1 <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n  <span class=\"token keyword\">let</span> s2 <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>s2 <span class=\"token operator\">&#x3C;</span> string2<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// para no pasarnos</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>string1<span class=\"token punctuation\">[</span>s1<span class=\"token punctuation\">]</span> <span class=\"token operator\">===</span> string2<span class=\"token punctuation\">[</span>s2<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> s1<span class=\"token operator\">++</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>s1 <span class=\"token operator\">===</span> string1<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span>\n    s2<span class=\"token operator\">++</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">isInString</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ninja'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'new in jail'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// true si quitamos lo que sobra n__ in ja__</span>\n</code></pre></div>\n<p>En este caso tenemos dos strings que debemos recorrer y queremos comprobar si el primero <em>string1</em> es una subsecuencia del segundo <em>string2</em>. En este caso nuestros puntos los situamos al inicio de cada string y vamos recorriendo, si encontramos una coincidencia de la primera posición del string1 en la primera posición del string2, movemos la posición del string1 si no, movemos la posición del string2 y así sucesivamente una vez que hayamos recorrido todo el string1 quiere decir que ya tenemos coincidencia y devolvemos <em>true</em>, en el caso de que la posición de string2 sea mayor que el tamaño del string2 quiere decir que no tenemos coincidencias por lo que devolvemos <em>false</em>.</p>\n<p>Este patrón como vemos es muy util para comparar de alguna forma ya sea un elemento o varios y no tener que recorrerlos todos <strong>n</strong> veces convirtiendo la complejidad temporal en <strong>O(n^x)</strong> siendo x la cantidad de veces (o la cantidad de elementos) que tenemos que recorrer un elemento (o varios) al completo. En este caso por ejemplo tenemos una complejidad de:</p>\n<ul>\n<li>Temporal <strong>O(n + m)</strong>. Dos strings que en el peor de los casos recorreremos enteros pero solo una vez cada uno.</li>\n<li>Espacial <strong>O(1)</strong></li>\n</ul>\n<p>Hasta aquí lo referente a este patrón de resolución de problemas, nos vemos en el siguienteeee un abraazoooo</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Continuemos con nuestra serie sobre algoritmos y estructuras de datos, en este caso vamos a ver el patrón "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Multiple pointers"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"multiplepointerspattern"},"children":[{"type":"text","value":"Multiple pointers pattern"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este patrón, pensando en arrays, se basa en crear puntos o valores que corresponden a una posición y moverse al principio, el medio o al final según ciertos condiciones. Este patrón es muy eficiente para reducir al mínimo posible la complejidad espacial."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pensemos lo primero en un ejemplo donde poder usarlo, vamos a crear un método que dentro de un array ordenado nos devuelva la primera pareja que sume 0."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En un primer momento lo que nos vendría a la cabeza sería hacer 2 loops recorriendo dos veces todo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sumZero"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"arr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" i "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" i"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"++"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"for"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" j "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" j "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":";"}]},{"type":"text","value":" j"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"++"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"j"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"==="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"i"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"j"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" \n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sumZero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// [-2, 2]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este algoritmo tiene una complejidad:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Temporal "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(n^2)"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Espacial  "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(1)"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Que aunque en complejidad espacial no esta mal en temporal se nos puede ir de las manos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos una solución algo mejor usando este patrón, pero antes de continuar quiero recalcar que esto es posible porque "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"el array esta ordenado"}]},{"type":"text","value":", en general muchos de los algoritmos cuentan con esto para poder resolverse (más adelante veremos varios de los mejores patrones de ordenación). Vamos con la solución:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sumZero"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"arr"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// Establecemos los puntos de inicio (multiple pointers u know)"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" left "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" right "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"left "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" right"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// para no pasarnos"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" sum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"left"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"right"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"==="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n      "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"left"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" arr"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"right"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"sum "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n      right"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"--"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"else"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n      left"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"++"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sumZero"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"4"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// [-2, 2]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En esta solución lo que hacemos es ir moviendo nuestros puntos y comprobando si cumple la condición de ser igual a 0. Como es un array ordenado si la suma es mayor de 0 quiere decir que el valor es superior por la derecha del 0  (nuestra variable right) y si el valor es negativo quiere decir que el valor es superior por la izquierda (varible left). Según cual sea de los dos lo que hacemos es ir moviendo nuestros puntos hasta que en algun momento de 0 o hayamos recorrido todos los valores por entre ambos puntos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta solución tiene una complejidad de:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Temporal "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(n)"}]},{"type":"text","value":", solo recorremos una vez los valores."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Espacial "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(1)"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un ejemplo algo más dificil, en este caso queremos comprobar si un string es una subsecuencia de otro, o más bien si aparece como una secuencia de los carácteres de otro pero de manera ordenada, es decir, si "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"word"}]},{"type":"text","value":" estaría dentro de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"hello world"}]},{"type":"text","value":" en orden (no es word pero el orden es primero w y ultimo d)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"isInString"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"string1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" string2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// Establecemos los puntos de inicio (multiple pointers u know)"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"let"}]},{"type":"text","value":" s2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"while"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s2 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"<"}]},{"type":"text","value":" string2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// para no pasarnos"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"string1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"==="}]},{"type":"text","value":" string2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"s2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" s1"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"++"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"if"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"s1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"==="}]},{"type":"text","value":" string1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":"\n    s2"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"++"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"isInString"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'new in jail'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// true si quitamos lo que sobra n__ in ja__"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este caso tenemos dos strings que debemos recorrer y queremos comprobar si el primero "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"string1"}]},{"type":"text","value":" es una subsecuencia del segundo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"string2"}]},{"type":"text","value":". En este caso nuestros puntos los situamos al inicio de cada string y vamos recorriendo, si encontramos una coincidencia de la primera posición del string1 en la primera posición del string2, movemos la posición del string1 si no, movemos la posición del string2 y así sucesivamente una vez que hayamos recorrido todo el string1 quiere decir que ya tenemos coincidencia y devolvemos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"true"}]},{"type":"text","value":", en el caso de que la posición de string2 sea mayor que el tamaño del string2 quiere decir que no tenemos coincidencias por lo que devolvemos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"false"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este patrón como vemos es muy util para comparar de alguna forma ya sea un elemento o varios y no tener que recorrerlos todos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" veces convirtiendo la complejidad temporal en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(n^x)"}]},{"type":"text","value":" siendo x la cantidad de veces (o la cantidad de elementos) que tenemos que recorrer un elemento (o varios) al completo. En este caso por ejemplo tenemos una complejidad de:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Temporal "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(n + m)"}]},{"type":"text","value":". Dos strings que en el peor de los casos recorreremos enteros pero solo una vez cada uno."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Espacial "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"O(1)"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta aquí lo referente a este patrón de resolución de problemas, nos vemos en el siguienteeee un abraazoooo"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"multiplepointerspattern","heading":"Multiple pointers pattern"}]},"featureImageSharp":{"base":"unordered-3192273_640.png","publicURL":"/static/e92df4805fb46ec1f6bec181d2305365/unordered-3192273_640.png","imageMeta":{"width":640,"height":512},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFG0lEQVQ4ywEQBe/6APG/tx3SpZ5Y2+PkQNzf3UjCw89E2M6jZubUibvJxK5Yk5/RHmd0qxNMWpUXsLO/LLe5xT+corsvv7++MmxsaxaZmYUXj4+WHsrKyjrNzc1HANSJfnXTZVT/1X5wp7K+vUSttMg40cSUb+zYh97by4ie0smidOHVpIbbzpWb7Nybsuvbmrbd0ZKAnp/khImK5tyWltuK4uHGPOXl6E3NyMdIAJFqZDnPkIiCwW5inMx1abl/j3YbtLb/AOjCOwXl1IRn2MmFntzNk5Tw46uQ493CYMS+olvt2X+avrSnpo6R6KCEhNulmZrkhs3SsikAABILAMfLzkae0MIY/6TMANl3X5vGi5ajeYjzhYiH66WJi+eaq7TzQuTZqG3v3I+008OFfpKk8ie0pm0n792VubCzwjPOzcE9hofluLOt43/Ue2F8ANfWxzZsXLEeh5X/UKZvjFq/eo3ml6HgedPLukaUk+KxjIvdlPnhcoXu2pwW6tWCl8/Iq1Lp15Cv5NacgElUgxje2r4yvcLqYZeH0tfZdGPhALu70USCg+mpgobwgoyG49zFeobjqqbhhYCO6YmDh+SynZ3VX+bUg4Dq1oeN7NiHxOjXj8jk0XNXfoaCFL29wE7Lx8dK0eznLZB8yaHSgH3MAJuc5qKGhuCF3tmJGo2S6rLIdnrJpYq+sLCIr8LKrbdquMG3RJuZo0vHu4eC6NeQy9HPwUuJjNporKzXYbuzoTe1uLtHuLe0P9BrY8C/fYF/AI+Q58Kur9NhvLfDQ3+K8pXFeW9m3nJZ2d1mRoLUb1ydv8HBKcPc+Cu1qoeG8+med5KY8HOYl+bKjo3nvwBn/w6J0MgV1nhjuayBsuFPctxCAIqK7qybm8txAAAAAXyG8Im3kraj2nBY0M9vZazlcWFlAAAADkseE59cLiD4TiMHc3570auip+BMkJnslKZ3q5PXYkie0GhZ4bR9ntm4na5oAIeJ4GGOj+7S1dDJTqe951G3e5nrx2pZTs2/pT+ZjH9IUSohtkYkGP9XJBf/WCIR/1gwNfV2ds+lv3SH1M97csHfiWiGynJ1za10ncfifGW3AOvajLKkn8qdgYLtx7LA8WbegnGkmn2+vJKn/39iRVHMXjcn/z87N/l/ZFP7OSol/0MsHrvEbG2usHef4ouY+aGJnvF1rn+ozdF3ccLMeGqWAOzZjN7444OryLyvuH2K+8C8iZ/U1IJ2oG+u/zB5ZHl8iHBd/6eWifvKqI3/npGF/ZR5bf/EbW3an7DGK6Sl5YuLiuf/jZb2obahhjO1vMJGAPLflS795oUW9+N/ld/QjMXYyJr43I1t9MdNJzUAOAADpodx58Gfh/+2pJbpw6GH+qSGc9rPblisqpfDcKWj1N7m2KHVo57Myri4vFCtpqwTAP///wA4Qu8NgYTuetbLs6rk1pb/ybOjt9VvZ6nCe3R8vZ6Dvph6YsCjhXPzi3FcsbWUgL/SalawjoTgrpufzW7YypGa3c+i5uvbk3jw34+GANDPuTesrNtxi4zo4oqN87bDubTD5NiUt9zOonzEh23DnoF+8JF8gsfRpHz/jndr07mIdvXMfGaGn6TvrJiW2L23sMDh18qbg8urAAXq2pGqANDQ0EM2NjUTeHidH5qZlSEABVkJ/+eDL9fJh43Hpn/zn4ym/6Ca0f+tnbD+nYaO/7eXhvmxroxy7N6gf8u/p57XzJ513+DcQ7e3uzE9PDMO7sYRFrnPY/gAAAAASUVORK5CYII=","aspectRatio":1.25,"src":"/static/e92df4805fb46ec1f6bec181d2305365/8bef3/unordered-3192273_640.png","srcSet":"/static/e92df4805fb46ec1f6bec181d2305365/847ef/unordered-3192273_640.png 175w,\n/static/e92df4805fb46ec1f6bec181d2305365/91cba/unordered-3192273_640.png 350w,\n/static/e92df4805fb46ec1f6bec181d2305365/8bef3/unordered-3192273_640.png 640w","srcWebp":"/static/e92df4805fb46ec1f6bec181d2305365/1ea2e/unordered-3192273_640.webp","srcSetWebp":"/static/e92df4805fb46ec1f6bec181d2305365/9fca7/unordered-3192273_640.webp 175w,\n/static/e92df4805fb46ec1f6bec181d2305365/37a4e/unordered-3192273_640.webp 350w,\n/static/e92df4805fb46ec1f6bec181d2305365/1ea2e/unordered-3192273_640.webp 640w","sizes":"(max-width: 640px) 100vw, 640px"}}}},"next":{"id":"Ghost__Post__5e19a48ee3717304bd77a170","title":"MongoDB  Index Ninja 2.0","slug":"mongodb-ninja-iv-index-ninja-2-0","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/MongoBanner.png","excerpt":"Antes de nada tenemos un repo con un script para insertar los documentos que\nusamos de ejemplo:\n\nMongo_index_explain [https://github.com/jlgarciaap/mongo_index_explain]\n\nEn general sabemos que es un índice de mongo pero hablemos un poco más en\nprofundidad. Si no índicamos un índice cuando creamos una colección mongo, por\ndefecto, nos creará un índice con el campo _id de tipo único (no se puede\nrepetir el campo).\n\nCuando creamos un índice mongo crea otra especie de mini colección solo con los\ndat","custom_excerpt":null,"visibility":"public","created_at_pretty":"11 Jan 2020","published_at_pretty":"12 Jan 2020","updated_at_pretty":"19 Jan 2021","created_at":"2020-01-11T11:33:50.000+01:00","published_at":"2020-01-12T19:27:09.000+01:00","updated_at":"2021-01-19T21:03:42.000+01:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"mongodb","url":"https://jlgarcia.fulldev.ninja/tag/mongodb/","name":"mongodb","visibility":"public","feature_image":null,"description":"Convirtamonos en Ninjas de la mejor base de datos NoSql, MongoDB","meta_title":"MongoDD Ninja","meta_description":"Convirtamonos en Ninjas de la mejor base de datos NoSql, MongoDB, viendo desde lo básica hasta métodos de indexación avanzada.","featureImageSharp":null},"tags":[{"slug":"mongodb","url":"https://jlgarcia.fulldev.ninja/tag/mongodb/","name":"mongodb","visibility":"public","feature_image":null,"description":"Convirtamonos en Ninjas de la mejor base de datos NoSql, MongoDB","meta_title":"MongoDD Ninja","meta_description":"Convirtamonos en Ninjas de la mejor base de datos NoSql, MongoDB, viendo desde lo básica hasta métodos de indexación avanzada.","featureImageSharp":null}],"plaintext":"Antes de nada tenemos un repo con un script para insertar los documentos que\nusamos de ejemplo:\n\nMongo_index_explain [https://github.com/jlgarciaap/mongo_index_explain]\n\nEn general sabemos que es un índice de mongo pero hablemos un poco más en\nprofundidad. Si no índicamos un índice cuando creamos una colección mongo, por\ndefecto, nos creará un índice con el campo _id de tipo único (no se puede\nrepetir el campo).\n\nCuando creamos un índice mongo crea otra especie de mini colección solo con los\ndatos que le indicamos en el índice, ordenados de la manera que le indiquemos y\napuntando al documento al que hacen referencia. Cada índice tiene una especie de\nfirma, es decir, se le asigna un nombre para identificarlo usando los campos del\níndice y mongo recorre su lista de indices hasta que encuentra una coincidencia,\nes decir, si buscamos por dos campos intentará encontrar uno donde coincida la\nfirma de esos campos y si no busca separando los campos hasta que encuentra una\ncoincidencia, si no la encuentra continuará con una búsqueda sin índice.\nPero antes de ver esto vayamos paso a paso.\nMongo sigue la misma teoría que el resto de bases de datos con sus índices, usa\nlo que se conoce como Binary Tree Sort, es un tipo de algoritmo de búsqueda\nbastante eficiente para estas cosas Más info [/mongodb-ninja-iv-index-ninja/]\n\nSintaxis básica de creación de índices\nAntes de ver los tipos de índices la sintaxis básica de creación de índices es\nla siguiente\n\ndb.getCollection('index').createIndex({lastName: -1})\n\n\nSiendo lastName el campo del que queremos el índice y -1 es la ordenación si lo\nqueremos ascendente pondremos un 1, si lo queremos descendente -1\n\nMás adelante veremos las opciones de creación de los índices.\n\nTipos de índices\nSingle field (un solo campo)\nComo dice el nombre tenemos un tipo de índice donde lo creamos solo con un\ncampo, es decir:\n\ndb.getCollection('index').createIndex({lastName: 1})\n\n\nVeamos un ejemplo con la diferencia de tener un índice a no tenerlo. En la\ncolección de prueba que tenemos vamos a realizar un búsqueda por lastName y\nveamos lo que tarda. Busquemos con el siguiente comando primero en la colección\nsin índice:\n\ndb.getCollection('noindex').find({ lastName: 'Master'}).explain(\"executionStats\")\n\n\nEsto nos da que nos ha traido 10 elemento en un tiempo de 4190 ms\n\n\n\nAhora vamos a crear un índice en la colección para ello con este comando:\n\ndb.getCollection('index').createIndex({ lastName: 1 })\n\n\n(más adelante veremos como ver los índices que tenemos y cosas así)\n\nAhora ejecutemos la misma búsqueda pero dentro de la colección con índice que\nacabamos de crear:\n\ndb.getCollection('index').find({ lastName: 'Master'}).explain(\"executionStats\")\n\n\nEsto nos da que nos ha traido 10 elementos en un brutal tiempo de 10ms la\nprimera vez y las siguientes a 0ms\n\n\n\nAhora se puede ver un poco la potencia que nos proveen los índices.\n\nVeamos otro ejemplo que no va también, vamos a crear primero un índice de un\ncampo con esto:\n\ndb.getCollection('index').createIndex({ city: -1 })\n\n\nTenemos una colección donde la gran mayoría de los 2000000 de elementos tienen\nla misma ciudad, por lo que ahora pasa una cosa curiosa, veamos la búsqueda con\nindice\n\ndb.getCollection('index').find({ city: 'Madrid'}).explain(\"executionStats\")\n\n\nTarda unos 8873ms, ahora veamos la búsqueda normal\n\n\n\ndb.getCollection('noindex').find({ city: 'Madrid'}).explain(\"executionStats\")\n\n\nSorprendentemente tarda 3963ms mucho menos\n\n\n\nPero porqué?? Bueno el algoritmo de búsqueda binaria que tienen los índices no\nes eficiente para este tipo de colecciones donde la mayoria de elementos son\niguales, para que este algoritmo haga su magia necesitamos que los elementos a\nbuscar sean la mayoría diferentes, por eso en este caso es más eficiente la\nbúsqueda habitual donde recorre todos y descarta los que no necesita.\n\nSi tenemos esta casuística donde un montón de campos son iguales lo más probable\nes que filtremos por algún campo más, es decir que creemos un índice de tipo \ncompound (los veremos a continuación), pero si quisieramos realizar una busqueda\nsin índice, en mongo se conoce como búsqueda natural y aunque no se suele\ncomentar esto mucho por los mares digitales, tenemos la posibilidad de forzarlo,\nsolo tenemos que sugerirlo de esta manera:\n\ndb.getCollection('index').find({ city: 'Madrid'}).hint({ $natural : 1 }).explain(\"executionStats\")\n\n\nhint es uno de los extras que podemos indicar en las busquedas para sugerir un\níndice u otro según el nombre, podemos ponerlo de la misma manera que pusimos al\ncrear el índice:\n\ndb.getCollection('index').find({ city: 'Madrid'}).hint({ city: -1 }).explain(\"executionStats\")\n\n\nO con el nombre de índice que se crea:\n\ndb.getCollection('index').find({ city: 'Madrid'}).hint(\"city_-1\").explain(\"executionStats\")\n\n\nLos podemos ver por ejemplo desde robo3t\n\n\n\nVisto este caso especial pasemos a los índices compuestos donde podemos ver\nbúsquedas eficientes por varios campos\n\nCompound fields (compuesto....o básicamente varios campos)\nLos siguientes índices son los que involucran a varios campos dentro de nuestras\ncolecciones, estos siguen un orden según como los escribamos, la sintaxis básica\nsería:\n\ndb.getCollection('index').createIndex({ field1: 1 , field2: -1})\n\n\nLo que hace este índice es crear un índice partiendo principalmente del field1 \ncon un orden ascendente y dentro de los field1 que coincidan los ordena según el \nfield2 de manera descendente.\n\nEn nuestro caso crearemos un índice por ciudad e email, recordemos que en ciudad\ntenemos 1999000 veces la misma ciudad y antes ha tardado mogollón\n\ndb.getCollection('index').createIndex({ city: -1, email: 1 })\n\n\nAhora veamos la búsqueda sín indice:\n\ndb.getCollection('noindex').find({ city: 'Madrid', email: 'NinjaMaster@email.com'}).explain(\"executionStats\")\n\n\nHa tardado 5112ms que no está nada mal pensando en la búsqueda anterior, pero\nahora veamos la búsqueda con el índice\n\n\n\ndb.getCollection('index').find({ city: 'Madrid', email: 'NinjaMaster@email.com'}).explain(\"executionStats\")\n\n\nSorprendetemente ha tardado solo 12ms\n\n\n\nCosas que tenemos que tener en cuenta de los índices compuestos:\n\n * Tienen un límite de 32 campos\n * En un principio el orden en que definamos el índice no influye demasiado\n   (menos en los $fullText que usaría como filtro inicial para hacer el de\n   texto) a la hora de buscar pero si a la hora de ordenar nosotros añadiendo un\n   sort a continuación del find. Partiendo del índice que hemos definido\n   anteriormente no seria lo mismo hacer esto:\n\ndb.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ city: -1, email: 1  }).explain('executionStats')\n\n\nQue hacer esto:\n\ndb.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ email: 1, city: -1  }).explain('executionStats')\n\n\nO esto:\n\ndb.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ city: 1, email: 1  }).explain('executionStats')\n\n\nLa primera usa el índice directamente y no tiene que hacer nada más:\n\n\n\nLas otras dos pasan del índice para hacer la ordenación, la segunda porque\ndirectamente ordenamo primero por email y la segunda porque no es ninguna de las\nopciones factibles en cuanto a dirección un índice usa solo dos tipos de\nordenaciones: la misma con la que se ha definido y la que es directamente\nopuesta, es decir, si definimos un índice con 1,-1,1, usaría el índice para\nordenar bajo esa definición o con -1,1-1\n\n\n\nMultikey Index (Indice con arrays en resumen)\nEste tipo de índice lo crea automáticamente mongo al detectar un campo de tipo\narray, en un principio podemos pensar que no tiene mucho de especial, pero\nrealmente tenemos que tener en cuenta que el índice creará una entrada por cada\nelemento del array. Supongamos que además de ciudades tenemos un array de\npoblaciones donde por ejemplo puede trabajar ese usuario, si alguien de Madrid\ntiene de poblaciones disponibles Coslada, Vicalvaro, Mordor.... nos creara:\n\nMadrid + Coslada\nMadrid + Vicalcaro\nMadrid + Mordor\n...\n\nEsto es importante a la hora de controlar el tamaño del índice, los índices\nocupan espacio.....por si no lo habías pensado y también consumen al rehacerse,\ncada vez que se escribe se vuelve a indexar\n\nA tener en cuenta:\n\n * Solo podemos tener índices con uno de los valores de tipo array, si\n   intentamos tener dos nos dirá que nos dediquemos a la pintura\n * Si tenemos un índice con array e intentamos insertar en otro de los campos\n   del índice un array nos dirá otra vez que lo nuestro es el arte\n * Podemos crear índices con campos con arrays de documentos, que funcionarían\n   igual que los arrays normales si le indicamos uno de los campos del documento\n\ndb.getCollection('index').createIndex({ 'tags.front': -1 })\ndb.getCollection('index').find({ 'tags.front': 'Vuejs' }).explain('executionStats')\n\n\n\n\nSi no le indicamos un campo en concreto nos creará un índice pero solo\nfuncionara con documentos completos, no con campos específicos. Borramos el\níndice anterior y creamos este:\n\ndb.getCollection('index').createIndex({ 'tags': -1 })\n\n\nAhora realizamos la misma búsqueda anterior:\n\ndb.getCollection('index').find({ 'tags.front': 'Vuejs' }).explain('executionStats')\n\n\n\n\nLo notamos con el tiempo que tarda pero podemos vemos como hace la búsqueda\nbásica con COLLSCAN.\nSin embargo si búscamos un documento al completo:\n\ndb.getCollection('index').find({ 'tags': {\n\t\t\t\t\tfront: 'Vuejs',\n\t\t\t\t\tback: 'Node'\n\t\t\t\t} }).explain('executionStats')\n\n\nVemos como tarda bastante menos y además nos indica que ha usado un índice\n\n\n\nIndice Full text(o campos con un montón de texto)\nEl índice de texto es un tipo de indice especial que nos mejora la búsqueda con\nun conjunto de palabras sobre un número n de campos, es decir, nos busca en\ntodos los campos que tenga el índice. Este índice se puede aplicar en cualquier\ncampo de tipo string o de array con valores de tipo string, donde podemos\nindicarlo el idioma en cuestión para que ignore palabras comunes como 'y, o, de'\nen español.\nPor defecto se crea con idioma inglés por lo que en nuestro caso lo añadiremos a\nla hora de la creación del índice.\n\nPara hacernos una idea de que tiene de especial, los índices habituales lo que\nhacen es crearlo basandose en esto que buscas está en estos documentos, sin\nembargo este tipo de índice lo que hace es darle la vuelta este documento tiene\nestas palabras\n\nEn este caso los ejemplos son un poco más complicados, las búsquedas especiales\npor un texto solo funcionan si tenemos un índice, por lo que , por ejemplo, en\nla colección noindex no podremos hacer esta búsqueda, lo más parecido sería una\nexpresión regular con un find sobre los campos que quisieramos realizar la\nbúsqueda y evidentemente tardará un poco más, veamos un ejemplo. Para la pruebas\ntener en cuenta que no seria lo mismo que un entorno de producción esto es solo\npara entender los conceptos, en un entorno real puede tardar más o menos la\nbúsqueda sin índice:\n\ndb.getCollection('noindex').find({ firstName: /Juanchu/,\n\t\t\t\talias: /Juanchu/,\n\t\t\t\tbio: /Juanchu/ }).explain(\"executionStats\")\n\n\nEsto nos da un tiempo de 4429ms que no está nada mal.\nCreemos ahora un índice con los campos en formato texto:\n\ndb.getCollection('index').createIndex({ bio: 'text', firstName: 'text', alias: 'text' },  { default_language: \"spanish\" })\n\n\nEsto tardará un montón, es un índice que tiene que comprobar todas las palabras\nque tienen nuestros campos de texto, y si no le ponemos el idioma bien....pues\nmás todavía porque almacenará palabras innecesarias.\n\nAhora que ya tenemos el índice busquemos el mismo concepto:\n\ndb.getCollection('index').find({ $text: { $search: \"Juanchu\" } }).explain(\"executionStats\")\n\n\nAhora vuelve a tardar 1ms, bastante mejor ¿no?. En un entorno con más campos se\nnotaría más la diferencia\n\n\n\nPara que veamos lo que nos ha encontrado\n\n\n\nCon esto tenemos un ejemplo, veamos ahora que epecialidades tenemos con este\ntipo de índice:\n\n * SOLO ES POSIBLE TENER UN ÍNDICE DE TIPO TEXT, es decir, si queremos añadir\n   campos de texto, tenemos que eliminar el que tuvieramos y hacerlo de nuevo.\n * Es CASE-INSENSITIVE\n * Se le pueden indicar pesos de importancia a cada campo, esto sumará las veces\n   que aparece la palabra que buscamos en cada campo y documento y nos los\n   devolverá según ese orden si se lo indicamos en la busqueda.\n   Creación:\n\ndb.getCollection('index').createIndex(\n   {\n     alias: \"text\",\n     bio: \"text\",\n     firstName: \"text\"\n   },\n   {\n     weights: {\n       firstName: 10,\n       alias: 5\n     }\n    },\n    { default_language: \"spanish\" }\n )\n\n\nEsto crearía un índice con los pesos:\n* firstName 10\n* alias 5\n* bio 1 (by default)\n\ndb.getCollection('index').find(\n   { $text: { $search: \"Juanchu\" } },\n   { score: { $meta: \"textScore\" } }\n).sort( { score: { $meta: \"textScore\" } } )\n\n\n\n\n * Los Wildcard indices o índices creados según un patrón de posibles campos,\n   aquí solo podemos ponerlo una vez y lo que haría sería un índice con todos\n   los campos de tipo string (más adelante veremos esto de los wildcard)\n * Sí no queremos hacer que ignore las palabras tipo y, o, de que las usa como\n   delimitadores para conjuntos, podemos índicarle language: \"none\"\n * No se puede indicar hint para sugerir un índice a la hora de realizar\n   búsquedas tipo text\n * En los índices compuestos podemos tener varios campos de tipo text pero solo\n   podemos tener el resto de campos tipo single, es decir, no podemos tener \n   multikeys o geospatial\n * Crear este tipo de índice es muy costoso a nivel de recursos, tanto en ram\n   como en espacio y puede hacer más lenta la inserción de nuevos campos que\n   esten bajo ese índice.\n\nÍndice de texto multiidioma\nEsta parte require su propio título ya que tiene un poco de miga. Podemos tener\ncolecciones en multiples idiomas y para mejorar la búsqueda bajo estos campos\npodemos modificar un poco los campos del documento para que mongo haga su magia\ncon las búsquedas, añadiendo solo la traducción pertinente según el idioma que\nle indiquemos en el índice.\nPara esto tenemos que tener un campo language donde indiquemos el lenguaje en\ncuestión del documento o campo, así a la hora de hacer el índice mongo sabra\nmejor que tiene que hacer con ese campo. Un ejemplo de documento podría ser\neste:\n\n{\n   _id: 1,\n   language: \"portuguese\",\n   original: \"A sorte protege os audazes.\",\n   translation:\n     [\n        {\n           language: \"english\",\n           quote: \"Fortune favors the bold.\"\n        },\n        {\n           language: \"spanish\",\n           quote: \"La suerte protege a los audaces.\"\n        }\n    ]\n}\n\n\nSi quisieramos tener otro campo como indicador de lenguaje lo podemos indicar a\nla hora de crear el indice:\n\ndb.quotes.createIndex( { quote : \"text\" },\n                       { language_override: \"idioma\" } )\n\n\nWildcard Index (indices sin saber los campos...)\nEsto no es muy dificil de entender, queremos crear índices donde el nombre de\nlos campos puede ser dinámico, es decir, puede ir cambiando como puede ser un\ncampo con metadatos que pueden ir variando, en este caso por ejemplo creariamos\nun índice así:\n\ndb.getCollection('index').createIndex( { \"user_metadata.$**\" : 1 } )\n\n\nEsto nos crearía un indice teniendo en cuenta que dentro de user_metadata \npodemos tener de todo tipo de campos:\n\n{\n    user_metadata: {\n        \"clicks\": 200,\n        \"views\": 1000\n    }\n},\n{\n    user_metadata: {\n        \"images\": 500,\n        \"favorite_tags\": [\"games\", \"dogs\"]\n    }\n}\n\n\nSi queremos crear un índice por todos los posibles campos, simplemente\n\ndb.getCollection('index').createIndex( { \"$**\" : 1 } )\n\n\nUn índice de tipo wildcard recorrera todos los nested documents que se encuentre\n\nTambién es posible indicar este tipo de índice en campos específicos\n\ndb.collection.createIndex(\n  { \"$**\" : 1 },\n  { \"wildcardProjection\" :\n    { \"user_metadata\" : 1, \"games.rewards_info\" : 1 }\n  }\n)\n\n\nPara hacerlo usamos wildcardProjection como indicador de lo que queremos hacer.\nEsto por ejemplo nos haría un índice con todo lo que estuviera dentro de esos\ndos campos.\n\nTambién podemos excluir campos:\n\ndb.collection.createIndex(\n  { \"$**\" : 1 },\n  { \"wildcardProjection\" :\n    { \"user_metadata\" : 0, \"games.rewards_info\" : 0 }\n  }\n)\n\n\n * Por defecto este tipo de índice omite el campo _id, si queremos añadirlo solo\n   tenemos que indicarlo dentro de wildcardProjection\n * No es posible crear indices compuestos usando wildcard\n * No pueden ser indices únicos ni tener TTL\n * No pueden ser Geoespaciales o Hashed\n * Si queremos ordenar con este tipo de índice solo podemos hacerlo usando el\n   campo mediante el que busquemos, es decir, si usamos user_metadata.images \n   para buscar solo podremos hacer un sort en mongo usando ese campo.\n * No indexan campos vacios, es decir los ignoran y los guardan en el indice\n   (son lo que se conoce como SPARSE)\n * No podemos hacer búsquedas haciendo coincidir un array al completo, solo\n   campos sueltos\n * No podemos hacer búsquedas con un not equal null porque no tiene esos\n   elementos y no comprende que hacemos.\n\nHASHED INDEX\nEn estos índices lo que hace Mongo es convertir el valor del campo en un hash\núnico y lo almacena. Este formato puede ser útil, en general para ahorrar\nespacio o para temas de sharding (comprime los documentos hijos en un hash), ya\nque en lugar de almacenar el campo almacena un hash. Luego Mongo por si mismo\nhace su magia y cada vez que busques va convirtiendo el directamente el valor de\nlos campos, es decir, nosotros no tenemos que hacer nada.\n\ndb.getCollection('index').createIndex({ alias: 'hashed' })\n\n\nImportante:\n\n * No admiten búsquedas por rango solo exactas\n * No admiten coumpound index\n\nOTROS INDICES\n * 2D: Indices basados en coordenadas de planos 2d\n * 2Dsphere: Indices en formato Tierra, es decir, pone un plano en formato\n   esfera para gestionar las coordenadas\n * geoHaystack: Indices especializados en planos 2d de tamaño pequeño\n\nPROPIEDADES DE LOS INDICES\n * TTL: Propiedad de single field index donde indicamos un tiempo de vida al\n   índice para que elimine los documentos de la colección, util para colecciones\n   de logs y cosas así. El valor que indiquemos no se puede cambiar, para\n   cambiarlo tenemos que borrar el indice y crearlo de nuevo\n\ndb.eventlog.createIndex( { \"lastModifiedDate\": 1 }, { expireAfterSeconds: 3600 } )\n\n\nTambién es posible indicar una hora de expiración si el propio campo es de\ntiempo\n\ndb.log_events.createIndex( { \"expireAt\": 1 }, { expireAfterSeconds: 0 } )\n\n\nEsto haría que este documento:\n\ndb.log_events.insert( {\n   \"expireAt\": new Date('July 22, 2013 14:00:00'),\n   \"logEvent\": 2,\n   \"logMessage\": \"Success!\"\n} )\n\n\nDesapareciera a esa hora.\n\n * Unique: Campos o combinaciones de campos que no se pueden repetir\n\ndb.members.createIndex( { \"user_id\": 1 }, { unique: true } )\n\ndb.members.createIndex( { groupNumber: 1, lastname: 1, firstname: 1 }, { unique: true } )\n\n\nEste índice si no existe un campo lo guardará como null y no se podrá repetir\n\n * Partial Index: Podemos crear indices que solo esten referidos cuando se haga\n   un tipo de filtro, es decir, que solo se indexará algo si el documento cumple\n   con el filtro que se le indica, es decir, si creamos este índice:\n\ndb.restaurants.createIndex(\n   { cuisine: 1, name: 1 },\n   { partialFilterExpression: { rating: { $gt: 5 } } }\n)\n\n\nSolo indexará cuando rating sea mayor que 5 (pero solo mayor que 5, no vale\nluego buscar por un mayor de 8), esto hace que consuma menos recursos el indice.\n\n * Case Insensitive: Podemos crear indices con case insensitive, indicando el \n   locale y el strength que queremos que use para la parte insensitive\n\ndb.fruit.createIndex( { type: 1},\n                      { collation: { locale: 'en', strength: 2 } } )\n\n\nPara ver la diferencia en la comparación Pulsa aquí\n[https://docs.mongodb.com/manual/reference/collation/#collation-document]\n\n * SPARSE INDEX: Con la opción sparse le indicamos que no guarde en el índice\n   los documentos que no contengan el campo que le indicamos.\n\ndb.addresses.createIndex( { \"xmpp_id\": 1 }, { sparse: true } )\n\n\nTenemos que tener cuidado porque este tipo de indice puede no devolver todos los\nresultados, si usamos un filtro que contenga xmpp_id nos ignorará los que no lo\ntengan y si buscamos también por otro campo no nos aparecerá\n\n * Index intersection: Intersección de índices, resumiendo esta funcionalidad,\n   si mongo cree que funciona puede hacer uso de dos indices para hacer una\n   búsqueda. Por poner un ejemplo, si tenemos dos single index uno con ciudad y\n   otro con población, si buscamos por ambos puede mezclar los indices para\n   mejorar la búsqueda, pero solo la búsqueda no lo usaria por ejemplo si\n   buscamos por ciudad y luego queremos hacer un sort por población.\n   \n   \n * background: Propiedad recomendada para que la colección no se bloquee\n   mientras se rehacen los indices (aún así ojo con los campos que se tenga\n   prevista un nivel alto de escritura)\n   \n   \n\ndb.addresses.createIndex( { \"xmpp_id\": 1 }, { background: true } )\n\n\nTrabajando con indices\nVer indices de una colección\ndb.getCollection('index').getIndexes()\n\n\nEsto nos muestra algo similar a esto:\n\n[\n    {\n        \"v\" : 2,\n        \"key\" : {\n            \"_id\" : 1\n        },\n        \"name\" : \"_id_\",\n        \"ns\" : \"indexninja.index\"\n    },\n    {\n        \"v\" : 2,\n        \"key\" : {\n            \"_fts\" : \"text\",\n            \"_ftsx\" : 1\n        },\n        \"name\" : \"TextIndex\",\n        \"ns\" : \"indexninja.index\",\n        \"weights\" : {\n            \"alias\" : 5,\n            \"bio\" : 1,\n            \"firstName\" : 10\n        },\n        \"default_language\" : \"english\",\n        \"language_override\" : \"language\",\n        \"textIndexVersion\" : 3\n    },\n    {\n        \"v\" : 2,\n        \"key\" : {\n            \"lastName\" : -1.0\n        },\n        \"name\" : \"lastName_-1\",\n        \"ns\" : \"indexninja.index\"\n    },\n\n\nCon la type_version del indice, la key por la que se ha realizado, el name que\ntiene el indice y el ns, es decir, la colección a la que pertenece\n\nEliminar un índice\ndb.getCollection('index').dropIndex(\"lastName_-1\")\ndb.getCollection('index').dropIndex( { lastName: -1 } )\n\n\nEsto nos devolvería algo similar a esto:\n\n/* 1 */\n{\n    \"nIndexesWas\" : 5,\n    \"ok\" : 1.0\n}\n\n\nDonde nos índica el número de indices que coincidian con esa condición y el\nresultado\n\nEliminar todos(o varios indices)\nPara eliminar todos los indices:\n\ndb.getCollection('index').dropIndexes()\n\n\nY a partir de la versión 4.2 de mongo podemos indicarle un array con los nombres\nde los indices que queremos eliminar\n\ndb.getCollection('index').dropIndexes([\"TextIndex\", \"lastName_-1\"])\n\n\nVer el uso actual de los indices\ndb.getCollection('index').aggregate( [ { $indexStats: { } } ] )\n\n\nCon esto podemos ver si se usan mucho o poco los indices actuales. Esto nos\ndevuelve algo similar a esto:\n\n/* 1 */\n{\n    \"name\" : \"TextIndex\",\n    \"key\" : {\n        \"_fts\" : \"text\",\n        \"_ftsx\" : 1\n    },\n    \"host\" : \"83165c61f9de:27017\",\n    \"accesses\" : {\n        \"ops\" : NumberLong(2),\n        \"since\" : ISODate(\"2020-01-12T11:18:17.642Z\")\n    }\n}\n\n/* 2 */\n{\n    \"name\" : \"_id_\",\n    \"key\" : {\n        \"_id\" : 1\n    },\n    \"host\" : \"83165c61f9de:27017\",\n    \"accesses\" : {\n        \"ops\" : NumberLong(0),\n        \"since\" : ISODate(\"2020-01-12T10:22:38.796Z\")\n    }\n}\n\n\nTambién podemos ver que se ha usado en cada query que realizamos con el comando\nque estamos usando continuamente (además de mogollón de información relativa a\nla query)\n\ndb.getCollection('index').find({ city: 'Madrid', email:'NinjaMaster@email.com' }).explain(\"executionStats\")\n\n\nY si por ejemplo queremos ver info extra cuando tenemos una busqueda con\nmultiples condiciones, como un poco el orden de filtro que ha seguido con:\n\ndb.getCollection('index').find({ city: 'Madrid', email:'NinjaMaster@email.com' }).explain(\"allPlansExecution\")\n\n\nEsta query ademas de lo anterior nos devuelve:\n\n\"allPlansExecution\" : [ \n            {\n                \"nReturned\" : 5,\n                \"executionTimeMillisEstimate\" : 0,\n                \"totalKeysExamined\" : 5,\n                \"totalDocsExamined\" : 5,\n                \"executionStages\" : {\n                    \"stage\" : \"FETCH\",\n                    \"nReturned\" : 5,\n                    \"executionTimeMillisEstimate\" : 0,\n                    \"works\" : 6,\n                    \"advanced\" : 5,\n                    \"needTime\" : 0,\n                    \"needYield\" : 0,\n                    \"saveState\" : 0,\n                    \"restoreState\" : 0,\n                    \"isEOF\" : 1,\n                    \"docsExamined\" : 5,\n                    \"alreadyHasObj\" : 0,\n                    \"inputStage\" : {\n                        \"stage\" : \"IXSCAN\",\n                        \"nReturned\" : 5,\n                        \"executionTimeMillisEstimate\" : 0,\n                        \"works\" : 6,\n                        \"advanced\" : 5,\n                        \"needTime\" : 0,\n                        \"needYield\" : 0,\n                        \"saveState\" : 0,\n                        \"restoreState\" : 0,\n                        \"isEOF\" : 1,\n                        \"keyPattern\" : {\n                            \"city\" : -1.0,\n                            \"email\" : 1.0\n                        },\n                        \"indexName\" : \"city_-1_email_1\",\n                        \"isMultiKey\" : false,\n                        \"multiKeyPaths\" : {\n                            \"city\" : [],\n                            \"email\" : []\n                        },\n                        \"isUnique\" : false,\n                        \"isSparse\" : false,\n                        \"isPartial\" : false,\n                        \"indexVersion\" : 2,\n                        \"direction\" : \"forward\",\n                        \"indexBounds\" : {\n                            \"city\" : [ \n                                \"[\\\"Madrid\\\", \\\"Madrid\\\"]\"\n                            ],\n                            \"email\" : [ \n                                \"[\\\"NinjaMaster@email.com\\\", \\\"NinjaMaster@email.com\\\"]\"\n                            ]\n                        },\n                        \"keysExamined\" : 5,\n                        \"seeks\" : 1,\n                        \"dupsTested\" : 0,\n                        \"dupsDropped\" : 0\n                    }\n                }\n            }, \n            {\n                \"nReturned\" : 0,\n                \"executionTimeMillisEstimate\" : 0,\n                \"totalKeysExamined\" : 6,\n                \"totalDocsExamined\" : 6,\n                \"executionStages\" : {\n                    \"stage\" : \"FETCH\",\n                    \"filter\" : {\n                        \"email\" : {\n                            \"$eq\" : \"NinjaMaster@email.com\"\n                        }\n                    },\n                    \"nReturned\" : 0,\n                    \"executionTimeMillisEstimate\" : 0,\n                    \"works\" : 6,\n                    \"advanced\" : 0,\n                    \"needTime\" : 6,\n                    \"needYield\" : 0,\n                    \"saveState\" : 0,\n                    \"restoreState\" : 0,\n                    \"isEOF\" : 0,\n                    \"docsExamined\" : 6,\n                    \"alreadyHasObj\" : 0,\n                    \"inputStage\" : {\n                        \"stage\" : \"IXSCAN\",\n                        \"nReturned\" : 6,\n                        \"executionTimeMillisEstimate\" : 0,\n                        \"works\" : 6,\n                        \"advanced\" : 6,\n                        \"needTime\" : 0,\n                        \"needYield\" : 0,\n                        \"saveState\" : 0,\n                        \"restoreState\" : 0,\n                        \"isEOF\" : 0,\n                        \"keyPattern\" : {\n                            \"city\" : -1.0\n                        },\n                        \"indexName\" : \"city_-1\",\n                        \"isMultiKey\" : false,\n                        \"multiKeyPaths\" : {\n                            \"city\" : []\n                        },\n                        \"isUnique\" : false,\n                        \"isSparse\" : false,\n                        \"isPartial\" : false,\n                        \"indexVersion\" : 2,\n                        \"direction\" : \"forward\",\n                        \"indexBounds\" : {\n                            \"city\" : [ \n                                \"[\\\"Madrid\\\", \\\"Madrid\\\"]\"\n                            ]\n                        },\n                        \"keysExamined\" : 6,\n                        \"seeks\" : 1,\n                        \"dupsTested\" : 0,\n                        \"dupsDropped\" : 0\n                    }\n                }\n            }\n        ]\n\n\nRecomendable que los índices entren en la RAM, asi nos evitamos tener que tirar\nde disco para consultarlos\nPara ver lo que ocupan los indices solo tenemos que lanzar el comando\n\ndb.getCollection('index').totalIndexSize()\n\n\nEl resultado está en bytes\n\nVer toda la info posible de una colección\ndb.getCollection('index').stats()","html":"<!--kg-card-begin: markdown--><p>Antes de nada tenemos un repo con un script para insertar los documentos que usamos de ejemplo:</p>\n<p><a href=\"https://github.com/jlgarciaap/mongo_index_explain\">Mongo_index_explain</a></p>\n<p>En general sabemos que es un índice de mongo pero hablemos un poco más en profundidad. Si no índicamos un índice cuando creamos una colección mongo, por defecto, nos creará un índice con el campo <strong>_id</strong> de tipo <strong>único</strong> (no se puede repetir el campo).</p>\n<p>Cuando creamos un índice mongo crea otra especie de mini colección solo con los datos que le indicamos en el índice, ordenados de la manera que le indiquemos y apuntando al documento al que hacen referencia. Cada índice tiene una especie de firma, es decir, se le asigna un nombre para identificarlo usando los campos del índice y mongo recorre su lista de indices hasta que encuentra una coincidencia, es decir, si buscamos por dos campos intentará encontrar uno donde coincida la firma de esos campos y si no busca separando los campos hasta que encuentra una coincidencia, si no la encuentra continuará con una búsqueda sin índice.<br>\nPero antes de ver esto vayamos paso a paso.<br>\nMongo sigue la misma teoría que el resto de bases de datos con sus índices, usa lo que se conoce como <strong>Binary Tree Sort</strong>, es un tipo de algoritmo de búsqueda bastante eficiente para estas cosas <a href=\"https://jlgarcia.fulldev.ninja/mongodb-ninja-iv-index-ninja/\">Más info</a></p>\n<h3 id=\"sintaxisbsicadecreacindendices\">Sintaxis básica de creación de índices</h3>\n<p>Antes de ver los tipos de índices la sintaxis básica de creación de índices es la siguiente</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({lastName: -1})\n</code></pre>\n<p>Siendo <strong>lastName</strong> el campo del que queremos el índice y <strong>-1</strong> es la ordenación si lo queremos ascendente pondremos un <strong>1</strong>, si lo queremos descendente <strong>-1</strong></p>\n<p>Más adelante veremos las opciones de creación de los índices.</p>\n<h3 id=\"tiposdendices\">Tipos de índices</h3>\n<h4 id=\"singlefieldunsolocampo\">Single field (un solo campo)</h4>\n<p>Como dice el nombre tenemos un tipo de índice donde lo creamos solo con un campo, es decir:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({lastName: 1})\n</code></pre>\n<p>Veamos un ejemplo con la diferencia de tener un índice a no tenerlo. En la colección de prueba que tenemos vamos a realizar un búsqueda por lastName y veamos lo que tarda. Busquemos con el siguiente comando primero en la colección sin índice:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('noindex').find({ lastName: 'Master'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Esto nos da que nos ha traido 10 elemento en un tiempo de <strong>4190 ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.50.57.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-18.50.57\"></p>\n<p>Ahora vamos a crear un índice en la colección para ello con este comando:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ lastName: 1 })\n</code></pre>\n<p>(más adelante veremos como ver los índices que tenemos y cosas así)</p>\n<p>Ahora ejecutemos la misma búsqueda pero dentro de la colección con índice que acabamos de crear:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ lastName: 'Master'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Esto nos da que nos ha traido 10 elementos en un brutal tiempo de <strong>10ms</strong> la primera vez y las siguientes a <strong>0ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.58.16.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-18.58.16\"></p>\n<p>Ahora se puede ver un poco la potencia que nos proveen los índices.</p>\n<p>Veamos otro ejemplo que no va también, vamos a crear primero un índice de un campo con esto:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ city: -1 })\n</code></pre>\n<p>Tenemos una colección donde la gran mayoría de los 2000000 de elementos tienen la misma ciudad, por lo que ahora pasa una cosa curiosa, veamos la búsqueda con indice</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Tarda unos <strong>8873ms</strong>, ahora veamos la búsqueda normal</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.31.58.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.31.58\"></p>\n<pre><code class=\"language-mongodb\">db.getCollection('noindex').find({ city: 'Madrid'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Sorprendentemente tarda <strong>3963ms</strong> mucho menos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.33.46.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.33.46\"></p>\n<p>Pero porqué?? Bueno el algoritmo de búsqueda binaria que tienen los índices no es eficiente para este tipo de colecciones donde la mayoria de elementos son iguales, para que este algoritmo haga su magia necesitamos que los elementos a buscar sean la mayoría diferentes, por eso en este caso es más eficiente la búsqueda habitual donde recorre todos y descarta los que no necesita.</p>\n<p>Si tenemos esta casuística donde un montón de campos son iguales lo más probable es que filtremos por algún campo más, es decir que creemos un índice de tipo <strong>compound</strong> (los veremos a continuación), pero si quisieramos realizar una busqueda sin índice, en mongo se conoce como búsqueda <strong>natural</strong> y aunque no se suele comentar esto mucho por los mares digitales, tenemos la posibilidad de forzarlo, solo tenemos que sugerirlo de esta manera:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid'}).hint({ $natural : 1 }).explain(&quot;executionStats&quot;)\n</code></pre>\n<p><strong>hint</strong> es uno de los extras que podemos indicar en las busquedas para sugerir un índice u otro según el nombre, podemos ponerlo de la misma manera que pusimos al crear el índice:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid'}).hint({ city: -1 }).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>O con el nombre de índice que se crea:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid'}).hint(&quot;city_-1&quot;).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Los podemos ver por ejemplo desde robo3t</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.49.54.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.49.54\"></p>\n<p>Visto este caso especial pasemos a los índices compuestos donde podemos ver búsquedas eficientes por varios campos</p>\n<h4 id=\"compoundfieldscompuestoobsicamentevarioscampos\">Compound fields (compuesto....o básicamente varios campos)</h4>\n<p>Los siguientes índices son los que involucran a varios campos dentro de nuestras colecciones, estos siguen un orden según como los escribamos, la sintaxis básica sería:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ field1: 1 , field2: -1})\n</code></pre>\n<p>Lo que hace este índice es crear un índice partiendo principalmente del <code>field1</code> con un orden ascendente y dentro de los field1 que coincidan los ordena según el <code>field2</code> de manera descendente.</p>\n<p>En nuestro caso crearemos un índice por ciudad e email, recordemos que en ciudad tenemos 1999000 veces la misma ciudad y antes ha tardado mogollón</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ city: -1, email: 1 })\n</code></pre>\n<p>Ahora veamos la búsqueda sín indice:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('noindex').find({ city: 'Madrid', email: 'NinjaMaster@email.com'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Ha tardado <strong>5112ms</strong> que no está nada mal pensando en la búsqueda anterior, pero ahora veamos la búsqueda con el índice</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.58.25.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.58.25\"></p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', email: 'NinjaMaster@email.com'}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Sorprendetemente ha tardado solo <strong>12ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.54.52.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.54.52\"></p>\n<p>Cosas que tenemos que tener en cuenta de los índices compuestos:</p>\n<ul>\n<li>Tienen un límite de 32 campos</li>\n<li>En un principio el orden en que definamos el índice no influye demasiado (menos en los $fullText que usaría como filtro inicial para hacer el de texto) a la hora de buscar pero si a la hora de ordenar nosotros añadiendo un sort a continuación del find. Partiendo del índice que hemos definido anteriormente no seria lo mismo hacer esto:</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ city: -1, email: 1  }).explain('executionStats')\n</code></pre>\n<p>Que hacer esto:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ email: 1, city: -1  }).explain('executionStats')\n</code></pre>\n<p>O esto:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', lastName: 'Master', email: 'NinjaMaster@email.com'}).sort({ city: 1, email: 1  }).explain('executionStats')\n</code></pre>\n<p>La primera usa el índice directamente y no tiene que hacer nada más:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.16.08.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.16.08\"></p>\n<p>Las otras dos pasan del índice para hacer la ordenación, la segunda porque directamente ordenamo primero por email y la segunda porque no es ninguna de las opciones factibles en cuanto a dirección <strong>un índice usa solo dos tipos de ordenaciones: la misma con la que se ha definido y la que es directamente opuesta, es decir, si definimos un índice con <code>1,-1,1</code>, usaría el índice para ordenar bajo esa definición o con <code>-1,1-1</code></strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.17.13.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.17.13\"></p>\n<h3 id=\"multikeyindexindiceconarraysenresumen\">Multikey Index (Indice con arrays en resumen)</h3>\n<p>Este tipo de índice lo crea automáticamente mongo al detectar un campo de tipo array, en un principio podemos pensar que no tiene mucho de especial, pero realmente tenemos que tener en cuenta que el índice creará una entrada por cada elemento del array. Supongamos que además de ciudades tenemos un array de poblaciones donde por ejemplo puede trabajar ese usuario, si alguien de Madrid tiene de poblaciones disponibles Coslada, Vicalvaro, Mordor.... nos creara:</p>\n<p>Madrid + Coslada<br>\nMadrid + Vicalcaro<br>\nMadrid + Mordor<br>\n...</p>\n<p><strong>Esto es importante a la hora de controlar el tamaño del índice, los índices ocupan espacio.....por si no lo habías pensado y también consumen al rehacerse, cada vez que se escribe se vuelve a indexar</strong></p>\n<p>A tener en cuenta:</p>\n<ul>\n<li>Solo podemos tener índices con uno de los valores de tipo array, si intentamos tener dos nos dirá que nos dediquemos a la pintura</li>\n<li>Si tenemos un índice con array e intentamos insertar en otro de los campos del índice un array nos dirá otra vez que lo nuestro es el arte</li>\n<li>Podemos crear índices con campos con arrays de documentos, que funcionarían igual que los arrays normales si le indicamos uno de los campos del documento</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ 'tags.front': -1 })\ndb.getCollection('index').find({ 'tags.front': 'Vuejs' }).explain('executionStats')\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.29.08.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.29.08\"></p>\n<p>Si no le indicamos un campo en concreto nos creará un índice pero solo funcionara con documentos completos, no con campos específicos. Borramos el índice anterior y creamos este:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ 'tags': -1 })\n</code></pre>\n<p>Ahora realizamos la misma búsqueda anterior:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ 'tags.front': 'Vuejs' }).explain('executionStats')\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.36.34.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.36.34\"></p>\n<p>Lo notamos con el tiempo que tarda pero podemos vemos como hace la búsqueda básica con <strong>COLLSCAN</strong>.<br>\nSin embargo si búscamos un documento al completo:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ 'tags': {\n\t\t\t\t\tfront: 'Vuejs',\n\t\t\t\t\tback: 'Node'\n\t\t\t\t} }).explain('executionStats')\n</code></pre>\n<p>Vemos como tarda bastante menos y además nos indica que ha usado un índice</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.38.52.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.38.52\"></p>\n<h3 id=\"indicefulltextocamposconunmontndetexto\">Indice Full text(o campos con un montón de texto)</h3>\n<p>El índice de texto es un tipo de indice especial que nos mejora la búsqueda con un conjunto de palabras sobre un número <strong>n</strong> de campos, es decir, nos busca en todos los campos que tenga el índice. Este índice se puede aplicar en cualquier campo de tipo string o de array con valores de tipo string, donde podemos indicarlo el idioma en cuestión para que ignore palabras comunes como 'y, o, de' en español.<br>\nPor defecto se crea con idioma inglés por lo que en nuestro caso lo añadiremos a la hora de la creación del índice.</p>\n<p>Para hacernos una idea de que tiene de especial, los índices habituales lo que hacen es crearlo basandose en <code>esto que buscas está en estos documentos</code>, sin embargo este tipo de índice lo que hace es darle la vuelta <code>este documento tiene estas palabras</code></p>\n<p>En este caso los ejemplos son un poco más complicados, las búsquedas especiales por un texto solo funcionan si tenemos un índice, por lo que , por ejemplo, en la colección <code>noindex</code> no podremos hacer esta búsqueda, lo más parecido sería una expresión regular con un find sobre los campos que quisieramos realizar la búsqueda y evidentemente tardará un poco más, veamos un ejemplo. Para la pruebas tener en cuenta que no seria lo mismo que un entorno de producción esto es solo para entender los conceptos, en un entorno real puede tardar más o menos la búsqueda sin índice:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('noindex').find({ firstName: /Juanchu/,\n\t\t\t\talias: /Juanchu/,\n\t\t\t\tbio: /Juanchu/ }).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Esto nos da un tiempo de <strong>4429ms</strong> que no está nada mal.<br>\nCreemos ahora un índice con los campos en formato texto:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ bio: 'text', firstName: 'text', alias: 'text' },  { default_language: &quot;spanish&quot; })\n</code></pre>\n<p>Esto tardará un montón, es un índice que tiene que comprobar todas las palabras que tienen nuestros campos de texto, y si no le ponemos el idioma bien....pues más todavía porque almacenará palabras innecesarias.</p>\n<p>Ahora que ya tenemos el índice busquemos el mismo concepto:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ $text: { $search: &quot;Juanchu&quot; } }).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Ahora vuelve a tardar <strong>1ms</strong>, bastante mejor ¿no?. En un entorno con más campos se notaría más la diferencia</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.46.42.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-11.46.42\"></p>\n<p>Para que veamos lo que nos ha encontrado</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.48.47.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-11.48.47\"></p>\n<p>Con esto tenemos un ejemplo, veamos ahora que epecialidades tenemos con este tipo de índice:</p>\n<ul>\n<li><strong>SOLO ES POSIBLE TENER UN ÍNDICE DE TIPO TEXT</strong>, es decir, si queremos añadir campos de texto, tenemos que eliminar el que tuvieramos y hacerlo de nuevo.</li>\n<li>Es CASE-INSENSITIVE</li>\n<li>Se le pueden indicar pesos de importancia a cada campo, esto sumará las veces que aparece la palabra que buscamos en cada campo y documento y nos los devolverá según ese orden si se lo indicamos en la busqueda.<br>\nCreación:</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex(\n   {\n     alias: &quot;text&quot;,\n     bio: &quot;text&quot;,\n     firstName: &quot;text&quot;\n   },\n   {\n     weights: {\n       firstName: 10,\n       alias: 5\n     }\n    },\n    { default_language: &quot;spanish&quot; }\n )\n</code></pre>\n<p>Esto crearía un índice con los pesos:<br>\n* firstName 10<br>\n* alias 5<br>\n* bio 1 (by default)</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find(\n   { $text: { $search: &quot;Juanchu&quot; } },\n   { score: { $meta: &quot;textScore&quot; } }\n).sort( { score: { $meta: &quot;textScore&quot; } } )\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-18.45.46.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-18.45.46\"></p>\n<ul>\n<li>Los <strong>Wildcard indices</strong> o índices creados según un patrón de posibles campos, aquí solo podemos ponerlo una vez y lo que haría sería un índice con todos los campos de tipo string (más adelante veremos esto de los wildcard)</li>\n<li>Sí no queremos hacer que ignore las palabras tipo <code>y, o, de</code> que las usa como delimitadores para conjuntos, podemos índicarle <code>language: &quot;none&quot;</code></li>\n<li>No se puede indicar <code>hint</code> para sugerir un índice a la hora de realizar búsquedas tipo text</li>\n<li>En los índices compuestos podemos tener varios campos de tipo text pero solo podemos tener el resto de campos tipo single, es decir, no podemos tener <code>multikeys o geospatial</code></li>\n<li>Crear este tipo de índice es muy costoso a nivel de recursos, tanto en ram como en espacio y puede hacer más lenta la inserción de nuevos campos que esten bajo ese índice.</li>\n</ul>\n<h4 id=\"ndicedetextomultiidioma\">Índice de texto multiidioma</h4>\n<p>Esta parte require su propio título ya que tiene un poco de miga. Podemos tener colecciones en multiples idiomas y para mejorar la búsqueda bajo estos campos podemos modificar un poco los campos del documento para que mongo haga su magia con las búsquedas, añadiendo solo la traducción pertinente según el idioma que le indiquemos en el índice.<br>\nPara esto tenemos que tener un campo <code>language</code> donde indiquemos el lenguaje en cuestión del documento o campo, así a la hora de hacer el índice mongo sabra mejor que tiene que hacer con ese campo. Un ejemplo de documento podría ser este:</p>\n<pre><code class=\"language-mongodb\">{\n   _id: 1,\n   language: &quot;portuguese&quot;,\n   original: &quot;A sorte protege os audazes.&quot;,\n   translation:\n     [\n        {\n           language: &quot;english&quot;,\n           quote: &quot;Fortune favors the bold.&quot;\n        },\n        {\n           language: &quot;spanish&quot;,\n           quote: &quot;La suerte protege a los audaces.&quot;\n        }\n    ]\n}\n</code></pre>\n<p>Si quisieramos tener otro campo como indicador de lenguaje lo podemos indicar a la hora de crear el indice:</p>\n<pre><code class=\"language-mongodb\">db.quotes.createIndex( { quote : &quot;text&quot; },\n                       { language_override: &quot;idioma&quot; } )\n</code></pre>\n<h4 id=\"wildcardindexindicessinsaberloscampos\">Wildcard Index (indices sin saber los campos...)</h4>\n<p>Esto no es muy dificil de entender, queremos crear índices donde el nombre de los campos puede ser dinámico, es decir, puede ir cambiando como puede ser un campo con metadatos que pueden ir variando, en este caso por ejemplo creariamos un índice así:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex( { &quot;user_metadata.$**&quot; : 1 } )\n</code></pre>\n<p>Esto nos crearía un indice teniendo en cuenta que dentro de <code>user_metadata</code> podemos tener de todo tipo de campos:</p>\n<pre><code class=\"language-mongodb\">{\n    user_metadata: {\n        &quot;clicks&quot;: 200,\n        &quot;views&quot;: 1000\n    }\n},\n{\n    user_metadata: {\n        &quot;images&quot;: 500,\n        &quot;favorite_tags&quot;: [&quot;games&quot;, &quot;dogs&quot;]\n    }\n}\n</code></pre>\n<p>Si queremos crear un índice por todos los posibles campos, simplemente</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex( { &quot;$**&quot; : 1 } )\n</code></pre>\n<p><strong>Un índice de tipo wildcard recorrera todos los nested documents que se encuentre</strong></p>\n<p>También es posible indicar este tipo de índice en campos específicos</p>\n<pre><code class=\"language-mongodb\">db.collection.createIndex(\n  { &quot;$**&quot; : 1 },\n  { &quot;wildcardProjection&quot; :\n    { &quot;user_metadata&quot; : 1, &quot;games.rewards_info&quot; : 1 }\n  }\n)\n</code></pre>\n<p>Para hacerlo usamos <code>wildcardProjection</code> como indicador de lo que queremos hacer. Esto por ejemplo nos haría un índice con todo lo que estuviera dentro de esos dos campos.</p>\n<p>También podemos excluir campos:</p>\n<pre><code class=\"language-mongodb\">db.collection.createIndex(\n  { &quot;$**&quot; : 1 },\n  { &quot;wildcardProjection&quot; :\n    { &quot;user_metadata&quot; : 0, &quot;games.rewards_info&quot; : 0 }\n  }\n)\n</code></pre>\n<ul>\n<li><strong>Por defecto</strong> este tipo de índice omite el campo <code>_id</code>, si queremos añadirlo solo tenemos que indicarlo dentro de <code>wildcardProjection</code></li>\n<li>No es posible crear indices compuestos usando wildcard</li>\n<li>No pueden ser indices únicos ni tener TTL</li>\n<li>No pueden ser Geoespaciales o Hashed</li>\n<li>Si queremos ordenar con este tipo de índice solo podemos hacerlo usando el campo mediante el que busquemos, es decir, si usamos <code>user_metadata.images</code> para buscar solo podremos hacer un sort en mongo usando ese campo.</li>\n<li>No indexan campos vacios, es decir los ignoran y los guardan en el indice (son lo que se conoce como SPARSE)</li>\n<li>No podemos hacer búsquedas haciendo coincidir un array al completo, solo campos sueltos</li>\n<li>No podemos hacer búsquedas con un <code>not equal null</code> porque no tiene esos elementos y no comprende que hacemos.</li>\n</ul>\n<h4 id=\"hashedindex\">HASHED INDEX</h4>\n<p>En estos índices lo que hace Mongo es convertir el valor del campo en un hash único y lo almacena. Este formato puede ser útil, en general para ahorrar espacio o para temas de <code>sharding</code> (comprime los documentos hijos en un hash), ya que en lugar de almacenar el campo almacena un hash. Luego Mongo por si mismo hace su magia y cada vez que busques va convirtiendo el directamente el valor de los campos, es decir, nosotros no tenemos que hacer nada.</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').createIndex({ alias: 'hashed' })\n</code></pre>\n<p>Importante:</p>\n<ul>\n<li><strong>No admiten búsquedas por rango solo exactas</strong></li>\n<li><strong>No admiten coumpound index</strong></li>\n</ul>\n<h4 id=\"otrosindices\">OTROS INDICES</h4>\n<ul>\n<li><strong>2D</strong>: Indices basados en coordenadas de planos 2d</li>\n<li><strong>2Dsphere</strong>: Indices en formato Tierra, es decir, pone un plano en formato esfera para gestionar las coordenadas</li>\n<li><strong>geoHaystack</strong>: Indices especializados en planos 2d de tamaño pequeño</li>\n</ul>\n<h3 id=\"propiedadesdelosindices\">PROPIEDADES DE LOS INDICES</h3>\n<ul>\n<li><strong>TTL</strong>: Propiedad de single field index donde indicamos un tiempo de vida al índice para que elimine los documentos de la colección, util para colecciones de logs y cosas así. El valor que indiquemos no se puede cambiar, para cambiarlo tenemos que borrar el indice y crearlo de nuevo</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.eventlog.createIndex( { &quot;lastModifiedDate&quot;: 1 }, { expireAfterSeconds: 3600 } )\n</code></pre>\n<p>También es posible indicar una hora de expiración si el propio campo es de tiempo</p>\n<pre><code class=\"language-mongodb\">db.log_events.createIndex( { &quot;expireAt&quot;: 1 }, { expireAfterSeconds: 0 } )\n</code></pre>\n<p>Esto haría que este documento:</p>\n<pre><code class=\"language-mongodb\">db.log_events.insert( {\n   &quot;expireAt&quot;: new Date('July 22, 2013 14:00:00'),\n   &quot;logEvent&quot;: 2,\n   &quot;logMessage&quot;: &quot;Success!&quot;\n} )\n</code></pre>\n<p>Desapareciera a esa hora.</p>\n<ul>\n<li><strong>Unique</strong>: Campos o combinaciones de campos que no se pueden repetir</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.members.createIndex( { &quot;user_id&quot;: 1 }, { unique: true } )\n\ndb.members.createIndex( { groupNumber: 1, lastname: 1, firstname: 1 }, { unique: true } )\n</code></pre>\n<p>Este índice si no existe un campo lo guardará como null y no se podrá repetir</p>\n<ul>\n<li><strong>Partial Index</strong>: Podemos crear indices que solo esten referidos cuando se haga un tipo de filtro, es decir, que solo se indexará algo si el documento cumple con el filtro que se le indica, es decir, si creamos este índice:</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.restaurants.createIndex(\n   { cuisine: 1, name: 1 },\n   { partialFilterExpression: { rating: { $gt: 5 } } }\n)\n</code></pre>\n<p>Solo indexará cuando <code>rating</code> sea mayor que 5 (pero solo mayor que 5, no vale luego buscar por un mayor de 8), esto hace que consuma menos recursos el indice.</p>\n<ul>\n<li><strong>Case Insensitive</strong>: Podemos crear indices con case insensitive, indicando el <code>locale</code> y el <code>strength</code> que queremos que use para la parte insensitive</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.fruit.createIndex( { type: 1},\n                      { collation: { locale: 'en', strength: 2 } } )\n</code></pre>\n<p>Para ver la diferencia en la comparación <a href=\"https://docs.mongodb.com/manual/reference/collation/#collation-document\">Pulsa aquí</a></p>\n<ul>\n<li><strong>SPARSE INDEX</strong>: Con la opción sparse le indicamos que no guarde en el índice los documentos que no contengan el campo que le indicamos.</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.addresses.createIndex( { &quot;xmpp_id&quot;: 1 }, { sparse: true } )\n</code></pre>\n<p>Tenemos que tener cuidado porque este tipo de indice puede no devolver todos los resultados, si usamos un filtro que contenga <code>xmpp_id</code> nos ignorará los que no lo tengan y si buscamos también por otro campo no nos aparecerá</p>\n<ul>\n<li>\n<p><strong>Index intersection</strong>: Intersección de índices, resumiendo esta funcionalidad, si mongo cree que funciona puede hacer uso de dos indices para hacer una búsqueda. Por poner un ejemplo, si tenemos dos single index uno con ciudad y otro con población, si buscamos por ambos puede mezclar los indices para mejorar la búsqueda, pero solo la búsqueda no lo usaria por ejemplo si buscamos por ciudad y luego queremos hacer un sort por población.</p>\n</li>\n<li>\n<p><strong>background</strong>: Propiedad recomendada para que la colección no se bloquee mientras se rehacen los indices (aún así ojo con los campos que se tenga prevista un nivel alto de escritura)</p>\n</li>\n</ul>\n<pre><code class=\"language-mongodb\">db.addresses.createIndex( { &quot;xmpp_id&quot;: 1 }, { background: true } )\n</code></pre>\n<h3 id=\"trabajandoconindices\">Trabajando con indices</h3>\n<h4 id=\"verindicesdeunacoleccin\">Ver indices de una colección</h4>\n<pre><code class=\"language-mongodb\">db.getCollection('index').getIndexes()\n</code></pre>\n<p>Esto nos muestra algo similar a esto:</p>\n<pre><code class=\"language-mongodb\">[\n    {\n        &quot;v&quot; : 2,\n        &quot;key&quot; : {\n            &quot;_id&quot; : 1\n        },\n        &quot;name&quot; : &quot;_id_&quot;,\n        &quot;ns&quot; : &quot;indexninja.index&quot;\n    },\n    {\n        &quot;v&quot; : 2,\n        &quot;key&quot; : {\n            &quot;_fts&quot; : &quot;text&quot;,\n            &quot;_ftsx&quot; : 1\n        },\n        &quot;name&quot; : &quot;TextIndex&quot;,\n        &quot;ns&quot; : &quot;indexninja.index&quot;,\n        &quot;weights&quot; : {\n            &quot;alias&quot; : 5,\n            &quot;bio&quot; : 1,\n            &quot;firstName&quot; : 10\n        },\n        &quot;default_language&quot; : &quot;english&quot;,\n        &quot;language_override&quot; : &quot;language&quot;,\n        &quot;textIndexVersion&quot; : 3\n    },\n    {\n        &quot;v&quot; : 2,\n        &quot;key&quot; : {\n            &quot;lastName&quot; : -1.0\n        },\n        &quot;name&quot; : &quot;lastName_-1&quot;,\n        &quot;ns&quot; : &quot;indexninja.index&quot;\n    },\n</code></pre>\n<p>Con la <code>type_version</code> del indice, la <code>key</code> por la que se ha realizado, el <code>name</code> que tiene el indice y el <code>ns</code>, es decir, la colección a la que pertenece</p>\n<h4 id=\"eliminarunndice\">Eliminar un índice</h4>\n<pre><code class=\"language-mongodb\">db.getCollection('index').dropIndex(&quot;lastName_-1&quot;)\ndb.getCollection('index').dropIndex( { lastName: -1 } )\n</code></pre>\n<p>Esto nos devolvería algo similar a esto:</p>\n<pre><code class=\"language-mongodb\">/* 1 */\n{\n    &quot;nIndexesWas&quot; : 5,\n    &quot;ok&quot; : 1.0\n}\n</code></pre>\n<p>Donde nos índica el número de indices que coincidian con esa condición y el resultado</p>\n<h4 id=\"eliminartodosovariosindices\">Eliminar todos(o varios indices)</h4>\n<p>Para eliminar todos los indices:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').dropIndexes()\n</code></pre>\n<p>Y a partir de la versión <strong>4.2</strong> de mongo podemos indicarle un array con los nombres de los indices que queremos eliminar</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').dropIndexes([&quot;TextIndex&quot;, &quot;lastName_-1&quot;])\n</code></pre>\n<h4 id=\"verelusoactualdelosindices\">Ver el uso actual de los indices</h4>\n<pre><code class=\"language-mongodb\">db.getCollection('index').aggregate( [ { $indexStats: { } } ] )\n</code></pre>\n<p>Con esto podemos ver si se usan mucho o poco los indices actuales. Esto nos devuelve algo similar a esto:</p>\n<pre><code class=\"language-mongodb\">/* 1 */\n{\n    &quot;name&quot; : &quot;TextIndex&quot;,\n    &quot;key&quot; : {\n        &quot;_fts&quot; : &quot;text&quot;,\n        &quot;_ftsx&quot; : 1\n    },\n    &quot;host&quot; : &quot;83165c61f9de:27017&quot;,\n    &quot;accesses&quot; : {\n        &quot;ops&quot; : NumberLong(2),\n        &quot;since&quot; : ISODate(&quot;2020-01-12T11:18:17.642Z&quot;)\n    }\n}\n\n/* 2 */\n{\n    &quot;name&quot; : &quot;_id_&quot;,\n    &quot;key&quot; : {\n        &quot;_id&quot; : 1\n    },\n    &quot;host&quot; : &quot;83165c61f9de:27017&quot;,\n    &quot;accesses&quot; : {\n        &quot;ops&quot; : NumberLong(0),\n        &quot;since&quot; : ISODate(&quot;2020-01-12T10:22:38.796Z&quot;)\n    }\n}\n</code></pre>\n<p>También podemos ver que se ha usado en cada query que realizamos con el comando que estamos usando continuamente (además de mogollón de información relativa a la query)</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', email:'NinjaMaster@email.com' }).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Y si por ejemplo queremos ver info extra cuando tenemos una busqueda con multiples condiciones, como un poco el orden de filtro que ha seguido con:</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').find({ city: 'Madrid', email:'NinjaMaster@email.com' }).explain(&quot;allPlansExecution&quot;)\n</code></pre>\n<p>Esta query ademas de lo anterior nos devuelve:</p>\n<pre><code class=\"language-json\">&quot;allPlansExecution&quot; : [ \n            {\n                &quot;nReturned&quot; : 5,\n                &quot;executionTimeMillisEstimate&quot; : 0,\n                &quot;totalKeysExamined&quot; : 5,\n                &quot;totalDocsExamined&quot; : 5,\n                &quot;executionStages&quot; : {\n                    &quot;stage&quot; : &quot;FETCH&quot;,\n                    &quot;nReturned&quot; : 5,\n                    &quot;executionTimeMillisEstimate&quot; : 0,\n                    &quot;works&quot; : 6,\n                    &quot;advanced&quot; : 5,\n                    &quot;needTime&quot; : 0,\n                    &quot;needYield&quot; : 0,\n                    &quot;saveState&quot; : 0,\n                    &quot;restoreState&quot; : 0,\n                    &quot;isEOF&quot; : 1,\n                    &quot;docsExamined&quot; : 5,\n                    &quot;alreadyHasObj&quot; : 0,\n                    &quot;inputStage&quot; : {\n                        &quot;stage&quot; : &quot;IXSCAN&quot;,\n                        &quot;nReturned&quot; : 5,\n                        &quot;executionTimeMillisEstimate&quot; : 0,\n                        &quot;works&quot; : 6,\n                        &quot;advanced&quot; : 5,\n                        &quot;needTime&quot; : 0,\n                        &quot;needYield&quot; : 0,\n                        &quot;saveState&quot; : 0,\n                        &quot;restoreState&quot; : 0,\n                        &quot;isEOF&quot; : 1,\n                        &quot;keyPattern&quot; : {\n                            &quot;city&quot; : -1.0,\n                            &quot;email&quot; : 1.0\n                        },\n                        &quot;indexName&quot; : &quot;city_-1_email_1&quot;,\n                        &quot;isMultiKey&quot; : false,\n                        &quot;multiKeyPaths&quot; : {\n                            &quot;city&quot; : [],\n                            &quot;email&quot; : []\n                        },\n                        &quot;isUnique&quot; : false,\n                        &quot;isSparse&quot; : false,\n                        &quot;isPartial&quot; : false,\n                        &quot;indexVersion&quot; : 2,\n                        &quot;direction&quot; : &quot;forward&quot;,\n                        &quot;indexBounds&quot; : {\n                            &quot;city&quot; : [ \n                                &quot;[\\&quot;Madrid\\&quot;, \\&quot;Madrid\\&quot;]&quot;\n                            ],\n                            &quot;email&quot; : [ \n                                &quot;[\\&quot;NinjaMaster@email.com\\&quot;, \\&quot;NinjaMaster@email.com\\&quot;]&quot;\n                            ]\n                        },\n                        &quot;keysExamined&quot; : 5,\n                        &quot;seeks&quot; : 1,\n                        &quot;dupsTested&quot; : 0,\n                        &quot;dupsDropped&quot; : 0\n                    }\n                }\n            }, \n            {\n                &quot;nReturned&quot; : 0,\n                &quot;executionTimeMillisEstimate&quot; : 0,\n                &quot;totalKeysExamined&quot; : 6,\n                &quot;totalDocsExamined&quot; : 6,\n                &quot;executionStages&quot; : {\n                    &quot;stage&quot; : &quot;FETCH&quot;,\n                    &quot;filter&quot; : {\n                        &quot;email&quot; : {\n                            &quot;$eq&quot; : &quot;NinjaMaster@email.com&quot;\n                        }\n                    },\n                    &quot;nReturned&quot; : 0,\n                    &quot;executionTimeMillisEstimate&quot; : 0,\n                    &quot;works&quot; : 6,\n                    &quot;advanced&quot; : 0,\n                    &quot;needTime&quot; : 6,\n                    &quot;needYield&quot; : 0,\n                    &quot;saveState&quot; : 0,\n                    &quot;restoreState&quot; : 0,\n                    &quot;isEOF&quot; : 0,\n                    &quot;docsExamined&quot; : 6,\n                    &quot;alreadyHasObj&quot; : 0,\n                    &quot;inputStage&quot; : {\n                        &quot;stage&quot; : &quot;IXSCAN&quot;,\n                        &quot;nReturned&quot; : 6,\n                        &quot;executionTimeMillisEstimate&quot; : 0,\n                        &quot;works&quot; : 6,\n                        &quot;advanced&quot; : 6,\n                        &quot;needTime&quot; : 0,\n                        &quot;needYield&quot; : 0,\n                        &quot;saveState&quot; : 0,\n                        &quot;restoreState&quot; : 0,\n                        &quot;isEOF&quot; : 0,\n                        &quot;keyPattern&quot; : {\n                            &quot;city&quot; : -1.0\n                        },\n                        &quot;indexName&quot; : &quot;city_-1&quot;,\n                        &quot;isMultiKey&quot; : false,\n                        &quot;multiKeyPaths&quot; : {\n                            &quot;city&quot; : []\n                        },\n                        &quot;isUnique&quot; : false,\n                        &quot;isSparse&quot; : false,\n                        &quot;isPartial&quot; : false,\n                        &quot;indexVersion&quot; : 2,\n                        &quot;direction&quot; : &quot;forward&quot;,\n                        &quot;indexBounds&quot; : {\n                            &quot;city&quot; : [ \n                                &quot;[\\&quot;Madrid\\&quot;, \\&quot;Madrid\\&quot;]&quot;\n                            ]\n                        },\n                        &quot;keysExamined&quot; : 6,\n                        &quot;seeks&quot; : 1,\n                        &quot;dupsTested&quot; : 0,\n                        &quot;dupsDropped&quot; : 0\n                    }\n                }\n            }\n        ]\n</code></pre>\n<h4 id=\"recomendablequelosndicesentrenenlaramasinosevitamostenerquetirardediscoparaconsultarlos\">Recomendable que los índices entren en la RAM, asi nos evitamos tener que tirar de disco para consultarlos</h4>\n<p>Para ver lo que ocupan los indices solo tenemos que lanzar el comando</p>\n<pre><code class=\"language-mongodb\">db.getCollection('index').totalIndexSize()\n</code></pre>\n<p>El resultado está en <strong>bytes</strong></p>\n<h4 id=\"vertodalainfoposibledeunacoleccin\">Ver toda la info posible de una colección</h4>\n<pre><code class=\"language-mongodb\">db.getCollection('index').stats()\n</code></pre>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-iv-index-ninja-2-0/","canonical_url":null,"uuid":"ac8c7693-215b-4d91-ba46-428863c67fc3","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5e19a48ee3717304bd77a170","reading_time":17,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Antes de nada tenemos un repo con un script para insertar los documentos que usamos de ejemplo:</p>\n<p><a href=\"https://github.com/jlgarciaap/mongo_index_explain\">Mongo_index_explain</a></p>\n<p>En general sabemos que es un índice de mongo pero hablemos un poco más en profundidad. Si no índicamos un índice cuando creamos una colección mongo, por defecto, nos creará un índice con el campo <strong>_id</strong> de tipo <strong>único</strong> (no se puede repetir el campo).</p>\n<p>Cuando creamos un índice mongo crea otra especie de mini colección solo con los datos que le indicamos en el índice, ordenados de la manera que le indiquemos y apuntando al documento al que hacen referencia. Cada índice tiene una especie de firma, es decir, se le asigna un nombre para identificarlo usando los campos del índice y mongo recorre su lista de indices hasta que encuentra una coincidencia, es decir, si buscamos por dos campos intentará encontrar uno donde coincida la firma de esos campos y si no busca separando los campos hasta que encuentra una coincidencia, si no la encuentra continuará con una búsqueda sin índice.<br>\nPero antes de ver esto vayamos paso a paso.<br>\nMongo sigue la misma teoría que el resto de bases de datos con sus índices, usa lo que se conoce como <strong>Binary Tree Sort</strong>, es un tipo de algoritmo de búsqueda bastante eficiente para estas cosas <a href=\"/mongodb-ninja-iv-index-ninja/\">Más info</a></p>\n<h3 id=\"sintaxisbsicadecreacindendices\">Sintaxis básica de creación de índices</h3>\n<p>Antes de ver los tipos de índices la sintaxis básica de creación de índices es la siguiente</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Siendo <strong>lastName</strong> el campo del que queremos el índice y <strong>-1</strong> es la ordenación si lo queremos ascendente pondremos un <strong>1</strong>, si lo queremos descendente <strong>-1</strong></p>\n<p>Más adelante veremos las opciones de creación de los índices.</p>\n<h3 id=\"tiposdendices\">Tipos de índices</h3>\n<h4 id=\"singlefieldunsolocampo\">Single field (un solo campo)</h4>\n<p>Como dice el nombre tenemos un tipo de índice donde lo creamos solo con un campo, es decir:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Veamos un ejemplo con la diferencia de tener un índice a no tenerlo. En la colección de prueba que tenemos vamos a realizar un búsqueda por lastName y veamos lo que tarda. Busquemos con el siguiente comando primero en la colección sin índice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'noindex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Master'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos da que nos ha traido 10 elemento en un tiempo de <strong>4190 ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.50.57.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-18.50.57\"></p>\n<p>Ahora vamos a crear un índice en la colección para ello con este comando:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>(más adelante veremos como ver los índices que tenemos y cosas así)</p>\n<p>Ahora ejecutemos la misma búsqueda pero dentro de la colección con índice que acabamos de crear:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Master'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos da que nos ha traido 10 elementos en un brutal tiempo de <strong>10ms</strong> la primera vez y las siguientes a <strong>0ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.58.16.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-18.58.16\"></p>\n<p>Ahora se puede ver un poco la potencia que nos proveen los índices.</p>\n<p>Veamos otro ejemplo que no va también, vamos a crear primero un índice de un campo con esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Tenemos una colección donde la gran mayoría de los 2000000 de elementos tienen la misma ciudad, por lo que ahora pasa una cosa curiosa, veamos la búsqueda con indice</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Tarda unos <strong>8873ms</strong>, ahora veamos la búsqueda normal</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.31.58.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.31.58\"></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'noindex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Sorprendentemente tarda <strong>3963ms</strong> mucho menos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.33.46.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.33.46\"></p>\n<p>Pero porqué?? Bueno el algoritmo de búsqueda binaria que tienen los índices no es eficiente para este tipo de colecciones donde la mayoria de elementos son iguales, para que este algoritmo haga su magia necesitamos que los elementos a buscar sean la mayoría diferentes, por eso en este caso es más eficiente la búsqueda habitual donde recorre todos y descarta los que no necesita.</p>\n<p>Si tenemos esta casuística donde un montón de campos son iguales lo más probable es que filtremos por algún campo más, es decir que creemos un índice de tipo <strong>compound</strong> (los veremos a continuación), pero si quisieramos realizar una busqueda sin índice, en mongo se conoce como búsqueda <strong>natural</strong> y aunque no se suele comentar esto mucho por los mares digitales, tenemos la posibilidad de forzarlo, solo tenemos que sugerirlo de esta manera:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">hint</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$natural</span></span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><strong>hint</strong> es uno de los extras que podemos indicar en las busquedas para sugerir un índice u otro según el nombre, podemos ponerlo de la misma manera que pusimos al crear el índice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">hint</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>O con el nombre de índice que se crea:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">hint</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"city_-1\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Los podemos ver por ejemplo desde robo3t</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.49.54.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.49.54\"></p>\n<p>Visto este caso especial pasemos a los índices compuestos donde podemos ver búsquedas eficientes por varios campos</p>\n<h4 id=\"compoundfieldscompuestoobsicamentevarioscampos\">Compound fields (compuesto....o básicamente varios campos)</h4>\n<p>Los siguientes índices son los que involucran a varios campos dentro de nuestras colecciones, estos siguen un orden según como los escribamos, la sintaxis básica sería:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">field1</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">,</span> <span class=\"token property\">field2</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Lo que hace este índice es crear un índice partiendo principalmente del <code class=\"language-text\">field1</code> con un orden ascendente y dentro de los field1 que coincidan los ordena según el <code class=\"language-text\">field2</code> de manera descendente.</p>\n<p>En nuestro caso crearemos un índice por ciudad e email, recordemos que en ciudad tenemos 1999000 veces la misma ciudad y antes ha tardado mogollón</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Ahora veamos la búsqueda sín indice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'noindex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'NinjaMaster@email.com'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Ha tardado <strong>5112ms</strong> que no está nada mal pensando en la búsqueda anterior, pero ahora veamos la búsqueda con el índice</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.58.25.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.58.25\"></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'NinjaMaster@email.com'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Sorprendetemente ha tardado solo <strong>12ms</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.54.52.png\" alt=\"Captura-de-pantalla-2020-01-11-a-las-19.54.52\"></p>\n<p>Cosas que tenemos que tener en cuenta de los índices compuestos:</p>\n<ul>\n<li>Tienen un límite de 32 campos</li>\n<li>En un principio el orden en que definamos el índice no influye demasiado (menos en los $fullText que usaría como filtro inicial para hacer el de texto) a la hora de buscar pero si a la hora de ordenar nosotros añadiendo un sort a continuación del find. Partiendo del índice que hemos definido anteriormente no seria lo mismo hacer esto:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Master'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'NinjaMaster@email.com'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Que hacer esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Master'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'NinjaMaster@email.com'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>O esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token string\">'Master'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token string\">'NinjaMaster@email.com'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span>  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>La primera usa el índice directamente y no tiene que hacer nada más:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.16.08.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.16.08\"></p>\n<p>Las otras dos pasan del índice para hacer la ordenación, la segunda porque directamente ordenamo primero por email y la segunda porque no es ninguna de las opciones factibles en cuanto a dirección <strong>un índice usa solo dos tipos de ordenaciones: la misma con la que se ha definido y la que es directamente opuesta, es decir, si definimos un índice con <code class=\"language-text\">1,-1,1</code>, usaría el índice para ordenar bajo esa definición o con <code class=\"language-text\">-1,1-1</code></strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.17.13.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.17.13\"></p>\n<h3 id=\"multikeyindexindiceconarraysenresumen\">Multikey Index (Indice con arrays en resumen)</h3>\n<p>Este tipo de índice lo crea automáticamente mongo al detectar un campo de tipo array, en un principio podemos pensar que no tiene mucho de especial, pero realmente tenemos que tener en cuenta que el índice creará una entrada por cada elemento del array. Supongamos que además de ciudades tenemos un array de poblaciones donde por ejemplo puede trabajar ese usuario, si alguien de Madrid tiene de poblaciones disponibles Coslada, Vicalvaro, Mordor.... nos creara:</p>\n<p>Madrid + Coslada<br>\nMadrid + Vicalcaro<br>\nMadrid + Mordor<br>\n...</p>\n<p><strong>Esto es importante a la hora de controlar el tamaño del índice, los índices ocupan espacio.....por si no lo habías pensado y también consumen al rehacerse, cada vez que se escribe se vuelve a indexar</strong></p>\n<p>A tener en cuenta:</p>\n<ul>\n<li>Solo podemos tener índices con uno de los valores de tipo array, si intentamos tener dos nos dirá que nos dediquemos a la pintura</li>\n<li>Si tenemos un índice con array e intentamos insertar en otro de los campos del índice un array nos dirá otra vez que lo nuestro es el arte</li>\n<li>Podemos crear índices con campos con arrays de documentos, que funcionarían igual que los arrays normales si le indicamos uno de los campos del documento</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">'tags.front'</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\ndb<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">'tags.front'</span><span class=\"token operator\">:</span> <span class=\"token string\">'Vuejs'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.29.08.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.29.08\"></p>\n<p>Si no le indicamos un campo en concreto nos creará un índice pero solo funcionara con documentos completos, no con campos específicos. Borramos el índice anterior y creamos este:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">'tags'</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Ahora realizamos la misma búsqueda anterior:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">'tags.front'</span><span class=\"token operator\">:</span> <span class=\"token string\">'Vuejs'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.36.34.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.36.34\"></p>\n<p>Lo notamos con el tiempo que tarda pero podemos vemos como hace la búsqueda básica con <strong>COLLSCAN</strong>.<br>\nSin embargo si búscamos un documento al completo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">'tags'</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t\t<span class=\"token property\">front</span><span class=\"token operator\">:</span> <span class=\"token string\">'Vuejs'</span><span class=\"token punctuation\">,</span>\n\t\t\t\t\t<span class=\"token property\">back</span><span class=\"token operator\">:</span> <span class=\"token string\">'Node'</span>\n\t\t\t\t<span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">'executionStats'</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Vemos como tarda bastante menos y además nos indica que ha usado un índice</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.38.52.png\" alt=\"Captura-de-pantalla-2020-01-13-a-las-20.38.52\"></p>\n<h3 id=\"indicefulltextocamposconunmontndetexto\">Indice Full text(o campos con un montón de texto)</h3>\n<p>El índice de texto es un tipo de indice especial que nos mejora la búsqueda con un conjunto de palabras sobre un número <strong>n</strong> de campos, es decir, nos busca en todos los campos que tenga el índice. Este índice se puede aplicar en cualquier campo de tipo string o de array con valores de tipo string, donde podemos indicarlo el idioma en cuestión para que ignore palabras comunes como 'y, o, de' en español.<br>\nPor defecto se crea con idioma inglés por lo que en nuestro caso lo añadiremos a la hora de la creación del índice.</p>\n<p>Para hacernos una idea de que tiene de especial, los índices habituales lo que hacen es crearlo basandose en <code class=\"language-text\">esto que buscas está en estos documentos</code>, sin embargo este tipo de índice lo que hace es darle la vuelta <code class=\"language-text\">este documento tiene estas palabras</code></p>\n<p>En este caso los ejemplos son un poco más complicados, las búsquedas especiales por un texto solo funcionan si tenemos un índice, por lo que , por ejemplo, en la colección <code class=\"language-text\">noindex</code> no podremos hacer esta búsqueda, lo más parecido sería una expresión regular con un find sobre los campos que quisieramos realizar la búsqueda y evidentemente tardará un poco más, veamos un ejemplo. Para la pruebas tener en cuenta que no seria lo mismo que un entorno de producción esto es solo para entender los conceptos, en un entorno real puede tardar más o menos la búsqueda sin índice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'noindex'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">firstName</span><span class=\"token operator\">:</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">Juanchu</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">alias</span><span class=\"token operator\">:</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">Juanchu</span><span class=\"token regex-delimiter\">/</span></span><span class=\"token punctuation\">,</span>\n\t\t\t\t<span class=\"token property\">bio</span><span class=\"token operator\">:</span> <span class=\"token regex\"><span class=\"token regex-delimiter\">/</span><span class=\"token regex-source language-regex\">Juanchu</span><span class=\"token regex-delimiter\">/</span></span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos da un tiempo de <strong>4429ms</strong> que no está nada mal.<br>\nCreemos ahora un índice con los campos en formato texto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">bio</span><span class=\"token operator\">:</span> <span class=\"token string\">'text'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">firstName</span><span class=\"token operator\">:</span> <span class=\"token string\">'text'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">alias</span><span class=\"token operator\">:</span> <span class=\"token string\">'text'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>  <span class=\"token punctuation\">{</span> <span class=\"token property\">default_language</span><span class=\"token operator\">:</span> <span class=\"token string\">\"spanish\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto tardará un montón, es un índice que tiene que comprobar todas las palabras que tienen nuestros campos de texto, y si no le ponemos el idioma bien....pues más todavía porque almacenará palabras innecesarias.</p>\n<p>Ahora que ya tenemos el índice busquemos el mismo concepto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$text</span></span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">$search</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Juanchu\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Ahora vuelve a tardar <strong>1ms</strong>, bastante mejor ¿no?. En un entorno con más campos se notaría más la diferencia</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.46.42.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-11.46.42\"></p>\n<p>Para que veamos lo que nos ha encontrado</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.48.47.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-11.48.47\"></p>\n<p>Con esto tenemos un ejemplo, veamos ahora que epecialidades tenemos con este tipo de índice:</p>\n<ul>\n<li><strong>SOLO ES POSIBLE TENER UN ÍNDICE DE TIPO TEXT</strong>, es decir, si queremos añadir campos de texto, tenemos que eliminar el que tuvieramos y hacerlo de nuevo.</li>\n<li>Es CASE-INSENSITIVE</li>\n<li>Se le pueden indicar pesos de importancia a cada campo, esto sumará las veces que aparece la palabra que buscamos en cada campo y documento y nos los devolverá según ese orden si se lo indicamos en la busqueda.<br>\nCreación:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span>\n   <span class=\"token punctuation\">{</span>\n     <span class=\"token property\">alias</span><span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">bio</span><span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">,</span>\n     <span class=\"token property\">firstName</span><span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span>\n   <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n   <span class=\"token punctuation\">{</span>\n     <span class=\"token property\">weights</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n       <span class=\"token property\">firstName</span><span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n       <span class=\"token property\">alias</span><span class=\"token operator\">:</span> <span class=\"token number\">5</span>\n     <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token property\">default_language</span><span class=\"token operator\">:</span> <span class=\"token string\">\"spanish\"</span> <span class=\"token punctuation\">}</span>\n <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto crearía un índice con los pesos:<br>\n* firstName 10<br>\n* alias 5<br>\n* bio 1 (by default)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span>\n   <span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$text</span></span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">$search</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Juanchu\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n   <span class=\"token punctuation\">{</span> <span class=\"token property\">score</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$meta</span></span><span class=\"token operator\">:</span> <span class=\"token string\">\"textScore\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">sort</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">score</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$meta</span></span><span class=\"token operator\">:</span> <span class=\"token string\">\"textScore\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-18.45.46.png\" alt=\"Captura-de-pantalla-2020-01-12-a-las-18.45.46\"></p>\n<ul>\n<li>Los <strong>Wildcard indices</strong> o índices creados según un patrón de posibles campos, aquí solo podemos ponerlo una vez y lo que haría sería un índice con todos los campos de tipo string (más adelante veremos esto de los wildcard)</li>\n<li>Sí no queremos hacer que ignore las palabras tipo <code class=\"language-text\">y, o, de</code> que las usa como delimitadores para conjuntos, podemos índicarle <code class=\"language-text\">language: \"none\"</code></li>\n<li>No se puede indicar <code class=\"language-text\">hint</code> para sugerir un índice a la hora de realizar búsquedas tipo text</li>\n<li>En los índices compuestos podemos tener varios campos de tipo text pero solo podemos tener el resto de campos tipo single, es decir, no podemos tener <code class=\"language-text\">multikeys o geospatial</code></li>\n<li>Crear este tipo de índice es muy costoso a nivel de recursos, tanto en ram como en espacio y puede hacer más lenta la inserción de nuevos campos que esten bajo ese índice.</li>\n</ul>\n<h4 id=\"ndicedetextomultiidioma\">Índice de texto multiidioma</h4>\n<p>Esta parte require su propio título ya que tiene un poco de miga. Podemos tener colecciones en multiples idiomas y para mejorar la búsqueda bajo estos campos podemos modificar un poco los campos del documento para que mongo haga su magia con las búsquedas, añadiendo solo la traducción pertinente según el idioma que le indiquemos en el índice.<br>\nPara esto tenemos que tener un campo <code class=\"language-text\">language</code> donde indiquemos el lenguaje en cuestión del documento o campo, así a la hora de hacer el índice mongo sabra mejor que tiene que hacer con ese campo. Un ejemplo de documento podría ser este:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\"><span class=\"token punctuation\">{</span>\n   <span class=\"token property\">_id</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">language</span><span class=\"token operator\">:</span> <span class=\"token string\">\"portuguese\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">original</span><span class=\"token operator\">:</span> <span class=\"token string\">\"A sorte protege os audazes.\"</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">translation</span><span class=\"token operator\">:</span>\n     <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">{</span>\n           <span class=\"token property\">language</span><span class=\"token operator\">:</span> <span class=\"token string\">\"english\"</span><span class=\"token punctuation\">,</span>\n           <span class=\"token property\">quote</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Fortune favors the bold.\"</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">{</span>\n           <span class=\"token property\">language</span><span class=\"token operator\">:</span> <span class=\"token string\">\"spanish\"</span><span class=\"token punctuation\">,</span>\n           <span class=\"token property\">quote</span><span class=\"token operator\">:</span> <span class=\"token string\">\"La suerte protege a los audaces.\"</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Si quisieramos tener otro campo como indicador de lenguaje lo podemos indicar a la hora de crear el indice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>quotes<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">quote</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                       <span class=\"token punctuation\">{</span> <span class=\"token property\">language_override</span><span class=\"token operator\">:</span> <span class=\"token string\">\"idioma\"</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<h4 id=\"wildcardindexindicessinsaberloscampos\">Wildcard Index (indices sin saber los campos...)</h4>\n<p>Esto no es muy dificil de entender, queremos crear índices donde el nombre de los campos puede ser dinámico, es decir, puede ir cambiando como puede ser un campo con metadatos que pueden ir variando, en este caso por ejemplo creariamos un índice así:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"user_metadata.$**\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos crearía un indice teniendo en cuenta que dentro de <code class=\"language-text\">user_metadata</code> podemos tener de todo tipo de campos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\"><span class=\"token punctuation\">{</span>\n    <span class=\"token property\">user_metadata</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"clicks\"</span><span class=\"token operator\">:</span> <span class=\"token number\">200</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"views\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1000</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token property\">user_metadata</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"images\"</span><span class=\"token operator\">:</span> <span class=\"token number\">500</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"favorite_tags\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"games\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"dogs\"</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Si queremos crear un índice por todos los posibles campos, simplemente</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"$**\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><strong>Un índice de tipo wildcard recorrera todos los nested documents que se encuentre</strong></p>\n<p>También es posible indicar este tipo de índice en campos específicos</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>collection<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"$**\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"wildcardProjection\"</span> <span class=\"token operator\">:</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token property\">\"user_metadata\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"games.rewards_info\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Para hacerlo usamos <code class=\"language-text\">wildcardProjection</code> como indicador de lo que queremos hacer. Esto por ejemplo nos haría un índice con todo lo que estuviera dentro de esos dos campos.</p>\n<p>También podemos excluir campos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>collection<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"$**\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">{</span> <span class=\"token property\">\"wildcardProjection\"</span> <span class=\"token operator\">:</span>\n    <span class=\"token punctuation\">{</span> <span class=\"token property\">\"user_metadata\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"games.rewards_info\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<ul>\n<li><strong>Por defecto</strong> este tipo de índice omite el campo <code class=\"language-text\">_id</code>, si queremos añadirlo solo tenemos que indicarlo dentro de <code class=\"language-text\">wildcardProjection</code></li>\n<li>No es posible crear indices compuestos usando wildcard</li>\n<li>No pueden ser indices únicos ni tener TTL</li>\n<li>No pueden ser Geoespaciales o Hashed</li>\n<li>Si queremos ordenar con este tipo de índice solo podemos hacerlo usando el campo mediante el que busquemos, es decir, si usamos <code class=\"language-text\">user_metadata.images</code> para buscar solo podremos hacer un sort en mongo usando ese campo.</li>\n<li>No indexan campos vacios, es decir los ignoran y los guardan en el indice (son lo que se conoce como SPARSE)</li>\n<li>No podemos hacer búsquedas haciendo coincidir un array al completo, solo campos sueltos</li>\n<li>No podemos hacer búsquedas con un <code class=\"language-text\">not equal null</code> porque no tiene esos elementos y no comprende que hacemos.</li>\n</ul>\n<h4 id=\"hashedindex\">HASHED INDEX</h4>\n<p>En estos índices lo que hace Mongo es convertir el valor del campo en un hash único y lo almacena. Este formato puede ser útil, en general para ahorrar espacio o para temas de <code class=\"language-text\">sharding</code> (comprime los documentos hijos en un hash), ya que en lugar de almacenar el campo almacena un hash. Luego Mongo por si mismo hace su magia y cada vez que busques va convirtiendo el directamente el valor de los campos, es decir, nosotros no tenemos que hacer nada.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">alias</span><span class=\"token operator\">:</span> <span class=\"token string\">'hashed'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Importante:</p>\n<ul>\n<li><strong>No admiten búsquedas por rango solo exactas</strong></li>\n<li><strong>No admiten coumpound index</strong></li>\n</ul>\n<h4 id=\"otrosindices\">OTROS INDICES</h4>\n<ul>\n<li><strong>2D</strong>: Indices basados en coordenadas de planos 2d</li>\n<li><strong>2Dsphere</strong>: Indices en formato Tierra, es decir, pone un plano en formato esfera para gestionar las coordenadas</li>\n<li><strong>geoHaystack</strong>: Indices especializados en planos 2d de tamaño pequeño</li>\n</ul>\n<h3 id=\"propiedadesdelosindices\">PROPIEDADES DE LOS INDICES</h3>\n<ul>\n<li><strong>TTL</strong>: Propiedad de single field index donde indicamos un tiempo de vida al índice para que elimine los documentos de la colección, util para colecciones de logs y cosas así. El valor que indiquemos no se puede cambiar, para cambiarlo tenemos que borrar el indice y crearlo de nuevo</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>eventlog<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"lastModifiedDate\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">expireAfterSeconds</span><span class=\"token operator\">:</span> <span class=\"token number\">3600</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>También es posible indicar una hora de expiración si el propio campo es de tiempo</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>log_events<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"expireAt\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">expireAfterSeconds</span><span class=\"token operator\">:</span> <span class=\"token number\">0</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto haría que este documento:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>log_events<span class=\"token punctuation\">.</span><span class=\"token function\">insert</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span>\n   <span class=\"token property\">\"expireAt\"</span><span class=\"token operator\">:</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Date</span><span class=\"token punctuation\">(</span><span class=\"token string\">'July 22, 2013 14:00:00'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">\"logEvent\"</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n   <span class=\"token property\">\"logMessage\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Success!\"</span>\n<span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Desapareciera a esa hora.</p>\n<ul>\n<li><strong>Unique</strong>: Campos o combinaciones de campos que no se pueden repetir</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>members<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"user_id\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">unique</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n\ndb<span class=\"token punctuation\">.</span>members<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">groupNumber</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">lastname</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">firstname</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">unique</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Este índice si no existe un campo lo guardará como null y no se podrá repetir</p>\n<ul>\n<li><strong>Partial Index</strong>: Podemos crear indices que solo esten referidos cuando se haga un tipo de filtro, es decir, que solo se indexará algo si el documento cumple con el filtro que se le indica, es decir, si creamos este índice:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>restaurants<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span>\n   <span class=\"token punctuation\">{</span> <span class=\"token property\">cuisine</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token property\">name</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n   <span class=\"token punctuation\">{</span> <span class=\"token property\">partialFilterExpression</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">rating</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$gt</span></span><span class=\"token operator\">:</span> <span class=\"token number\">5</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Solo indexará cuando <code class=\"language-text\">rating</code> sea mayor que 5 (pero solo mayor que 5, no vale luego buscar por un mayor de 8), esto hace que consuma menos recursos el indice.</p>\n<ul>\n<li><strong>Case Insensitive</strong>: Podemos crear indices con case insensitive, indicando el <code class=\"language-text\">locale</code> y el <code class=\"language-text\">strength</code> que queremos que use para la parte insensitive</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>fruit<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">type</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                      <span class=\"token punctuation\">{</span> <span class=\"token property\">collation</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">locale</span><span class=\"token operator\">:</span> <span class=\"token string\">'en'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">strength</span><span class=\"token operator\">:</span> <span class=\"token number\">2</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Para ver la diferencia en la comparación <a href=\"https://docs.mongodb.com/manual/reference/collation/#collation-document\">Pulsa aquí</a></p>\n<ul>\n<li><strong>SPARSE INDEX</strong>: Con la opción sparse le indicamos que no guarde en el índice los documentos que no contengan el campo que le indicamos.</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>addresses<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"xmpp_id\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">sparse</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Tenemos que tener cuidado porque este tipo de indice puede no devolver todos los resultados, si usamos un filtro que contenga <code class=\"language-text\">xmpp_id</code> nos ignorará los que no lo tengan y si buscamos también por otro campo no nos aparecerá</p>\n<ul>\n<li>\n<p><strong>Index intersection</strong>: Intersección de índices, resumiendo esta funcionalidad, si mongo cree que funciona puede hacer uso de dos indices para hacer una búsqueda. Por poner un ejemplo, si tenemos dos single index uno con ciudad y otro con población, si buscamos por ambos puede mezclar los indices para mejorar la búsqueda, pero solo la búsqueda no lo usaria por ejemplo si buscamos por ciudad y luego queremos hacer un sort por población.</p>\n</li>\n<li>\n<p><strong>background</strong>: Propiedad recomendada para que la colección no se bloquee mientras se rehacen los indices (aún así ojo con los campos que se tenga prevista un nivel alto de escritura)</p>\n</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span>addresses<span class=\"token punctuation\">.</span><span class=\"token function\">createIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">\"xmpp_id\"</span><span class=\"token operator\">:</span> <span class=\"token number\">1</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">background</span><span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<h3 id=\"trabajandoconindices\">Trabajando con indices</h3>\n<h4 id=\"verindicesdeunacoleccin\">Ver indices de una colección</h4>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getIndexes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos muestra algo similar a esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\"><span class=\"token punctuation\">[</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"v\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"key\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"_id\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"_id_\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"ns\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"indexninja.index\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"v\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"key\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"_fts\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"_ftsx\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"TextIndex\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"ns\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"indexninja.index\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"weights\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"alias\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"bio\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n            <span class=\"token property\">\"firstName\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">10</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"default_language\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"english\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"language_override\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"language\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"textIndexVersion\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">3</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"v\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"key\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token property\">\"lastName\"</span> <span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1.0</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"lastName_-1\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"ns\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"indexninja.index\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n</code></pre></div>\n<p>Con la <code class=\"language-text\">type_version</code> del indice, la <code class=\"language-text\">key</code> por la que se ha realizado, el <code class=\"language-text\">name</code> que tiene el indice y el <code class=\"language-text\">ns</code>, es decir, la colección a la que pertenece</p>\n<h4 id=\"eliminarunndice\">Eliminar un índice</h4>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">dropIndex</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lastName_-1\"</span><span class=\"token punctuation\">)</span>\ndb<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">dropIndex</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">{</span> <span class=\"token property\">lastName</span><span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esto nos devolvería algo similar a esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\"><span class=\"token comment\">/* 1 */</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"nIndexesWas\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"ok\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1.0</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Donde nos índica el número de indices que coincidian con esa condición y el resultado</p>\n<h4 id=\"eliminartodosovariosindices\">Eliminar todos(o varios indices)</h4>\n<p>Para eliminar todos los indices:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">dropIndexes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Y a partir de la versión <strong>4.2</strong> de mongo podemos indicarle un array con los nombres de los indices que queremos eliminar</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">dropIndexes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"TextIndex\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"lastName_-1\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<h4 id=\"verelusoactualdelosindices\">Ver el uso actual de los indices</h4>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">aggregate</span><span class=\"token punctuation\">(</span> <span class=\"token punctuation\">[</span> <span class=\"token punctuation\">{</span> <span class=\"token property\"><span class=\"token keyword\">$indexStats</span></span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">]</span> <span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Con esto podemos ver si se usan mucho o poco los indices actuales. Esto nos devuelve algo similar a esto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\"><span class=\"token comment\">/* 1 */</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"TextIndex\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"key\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"_fts\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"_ftsx\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"host\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"83165c61f9de:27017\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"accesses\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"ops\"</span> <span class=\"token operator\">:</span> <span class=\"token builtin keyword\">NumberLong</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"since\"</span> <span class=\"token operator\">:</span> <span class=\"token builtin keyword\">ISODate</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2020-01-12T11:18:17.642Z\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">/* 2 */</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"name\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"_id_\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"key\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"_id\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"host\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"83165c61f9de:27017\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token property\">\"accesses\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token property\">\"ops\"</span> <span class=\"token operator\">:</span> <span class=\"token builtin keyword\">NumberLong</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        <span class=\"token property\">\"since\"</span> <span class=\"token operator\">:</span> <span class=\"token builtin keyword\">ISODate</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2020-01-12T10:22:38.796Z\"</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>También podemos ver que se ha usado en cada query que realizamos con el comando que estamos usando continuamente (además de mogollón de información relativa a la query)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span><span class=\"token string\">'NinjaMaster@email.com'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"executionStats\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Y si por ejemplo queremos ver info extra cuando tenemos una busqueda con multiples condiciones, como un poco el orden de filtro que ha seguido con:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">find</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> <span class=\"token property\">city</span><span class=\"token operator\">:</span> <span class=\"token string\">'Madrid'</span><span class=\"token punctuation\">,</span> <span class=\"token property\">email</span><span class=\"token operator\">:</span><span class=\"token string\">'NinjaMaster@email.com'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">explain</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"allPlansExecution\"</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Esta query ademas de lo anterior nos devuelve:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token property\">\"allPlansExecution\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n            <span class=\"token punctuation\">{</span>\n                <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"totalKeysExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"totalDocsExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"executionStages\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token property\">\"stage\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"FETCH\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"works\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"advanced\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"needTime\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"needYield\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"saveState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"restoreState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"isEOF\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"docsExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"alreadyHasObj\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"inputStage\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token property\">\"stage\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"IXSCAN\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"works\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"advanced\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"needTime\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"needYield\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"saveState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"restoreState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isEOF\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"keyPattern\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">-1.0</span><span class=\"token punctuation\">,</span>\n                            <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1.0</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexName\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"city_-1_email_1\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isMultiKey\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"multiKeyPaths\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                            <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isUnique\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isSparse\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isPartial\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexVersion\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"direction\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"forward\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexBounds\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n                                <span class=\"token string\">\"[\\\"Madrid\\\", \\\"Madrid\\\"]\"</span>\n                            <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n                            <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n                                <span class=\"token string\">\"[\\\"NinjaMaster@email.com\\\", \\\"NinjaMaster@email.com\\\"]\"</span>\n                            <span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"keysExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">5</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"seeks\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"dupsTested\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"dupsDropped\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span>\n                    <span class=\"token punctuation\">}</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> \n            <span class=\"token punctuation\">{</span>\n                <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"totalKeysExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"totalDocsExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                <span class=\"token property\">\"executionStages\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                    <span class=\"token property\">\"stage\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"FETCH\"</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"filter\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token property\">\"email\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"$eq\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"NinjaMaster@email.com\"</span>\n                        <span class=\"token punctuation\">}</span>\n                    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"works\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"advanced\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"needTime\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"needYield\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"saveState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"restoreState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"isEOF\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"docsExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"alreadyHasObj\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                    <span class=\"token property\">\"inputStage\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                        <span class=\"token property\">\"stage\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"IXSCAN\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"nReturned\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"executionTimeMillisEstimate\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"works\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"advanced\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"needTime\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"needYield\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"saveState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"restoreState\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isEOF\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"keyPattern\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">-1.0</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexName\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"city_-1\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isMultiKey\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"multiKeyPaths\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isUnique\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isSparse\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"isPartial\"</span> <span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexVersion\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"direction\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"forward\"</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"indexBounds\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                            <span class=\"token property\">\"city\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> \n                                <span class=\"token string\">\"[\\\"Madrid\\\", \\\"Madrid\\\"]\"</span>\n                            <span class=\"token punctuation\">]</span>\n                        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"keysExamined\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">6</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"seeks\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"dupsTested\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                        <span class=\"token property\">\"dupsDropped\"</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span>\n                    <span class=\"token punctuation\">}</span>\n                <span class=\"token punctuation\">}</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">]</span>\n</code></pre></div>\n<h4 id=\"recomendablequelosndicesentrenenlaramasinosevitamostenerquetirardediscoparaconsultarlos\">Recomendable que los índices entren en la RAM, asi nos evitamos tener que tirar de disco para consultarlos</h4>\n<p>Para ver lo que ocupan los indices solo tenemos que lanzar el comando</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">totalIndexSize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>El resultado está en <strong>bytes</strong></p>\n<h4 id=\"vertodalainfoposibledeunacoleccin\">Ver toda la info posible de una colección</h4>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"mongodb\"><pre class=\"language-mongodb\"><code class=\"language-mongodb\">db<span class=\"token punctuation\">.</span><span class=\"token function\">getCollection</span><span class=\"token punctuation\">(</span><span class=\"token string\">'index'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">stats</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de nada tenemos un repo con un script para insertar los documentos que usamos de ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"https://github.com/jlgarciaap/mongo_index_explain"},"children":[{"type":"text","value":"Mongo_index_explain"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En general sabemos que es un índice de mongo pero hablemos un poco más en profundidad. Si no índicamos un índice cuando creamos una colección mongo, por defecto, nos creará un índice con el campo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":" de tipo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"único"}]},{"type":"text","value":" (no se puede repetir el campo)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Cuando creamos un índice mongo crea otra especie de mini colección solo con los datos que le indicamos en el índice, ordenados de la manera que le indiquemos y apuntando al documento al que hacen referencia. Cada índice tiene una especie de firma, es decir, se le asigna un nombre para identificarlo usando los campos del índice y mongo recorre su lista de indices hasta que encuentra una coincidencia, es decir, si buscamos por dos campos intentará encontrar uno donde coincida la firma de esos campos y si no busca separando los campos hasta que encuentra una coincidencia, si no la encuentra continuará con una búsqueda sin índice."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPero antes de ver esto vayamos paso a paso."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nMongo sigue la misma teoría que el resto de bases de datos con sus índices, usa lo que se conoce como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Binary Tree Sort"}]},{"type":"text","value":", es un tipo de algoritmo de búsqueda bastante eficiente para estas cosas "},{"type":"element","tagName":"a","properties":{"href":"/mongodb-ninja-iv-index-ninja/"},"children":[{"type":"text","value":"Más info"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"sintaxisbsicadecreacindendices"},"children":[{"type":"text","value":"Sintaxis básica de creación de índices"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de ver los tipos de índices la sintaxis básica de creación de índices es la siguiente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siendo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"lastName"}]},{"type":"text","value":" el campo del que queremos el índice y "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]},{"type":"text","value":" es la ordenación si lo queremos ascendente pondremos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":", si lo queremos descendente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-1"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más adelante veremos las opciones de creación de los índices."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"tiposdendices"},"children":[{"type":"text","value":"Tipos de índices"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"singlefieldunsolocampo"},"children":[{"type":"text","value":"Single field (un solo campo)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como dice el nombre tenemos un tipo de índice donde lo creamos solo con un campo, es decir:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un ejemplo con la diferencia de tener un índice a no tenerlo. En la colección de prueba que tenemos vamos a realizar un búsqueda por lastName y veamos lo que tarda. Busquemos con el siguiente comando primero en la colección sin índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'noindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Master'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos da que nos ha traido 10 elemento en un tiempo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4190 ms"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.50.57.png","alt":"Captura-de-pantalla-2020-01-11-a-las-18.50.57"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora vamos a crear un índice en la colección para ello con este comando:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(más adelante veremos como ver los índices que tenemos y cosas así)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora ejecutemos la misma búsqueda pero dentro de la colección con índice que acabamos de crear:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Master'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos da que nos ha traido 10 elementos en un brutal tiempo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"10ms"}]},{"type":"text","value":" la primera vez y las siguientes a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0ms"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-18.58.16.png","alt":"Captura-de-pantalla-2020-01-11-a-las-18.58.16"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora se puede ver un poco la potencia que nos proveen los índices."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos otro ejemplo que no va también, vamos a crear primero un índice de un campo con esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos una colección donde la gran mayoría de los 2000000 de elementos tienen la misma ciudad, por lo que ahora pasa una cosa curiosa, veamos la búsqueda con indice"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tarda unos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"8873ms"}]},{"type":"text","value":", ahora veamos la búsqueda normal"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.31.58.png","alt":"Captura-de-pantalla-2020-01-11-a-las-19.31.58"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'noindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sorprendentemente tarda "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"3963ms"}]},{"type":"text","value":" mucho menos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.33.46.png","alt":"Captura-de-pantalla-2020-01-11-a-las-19.33.46"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pero porqué?? Bueno el algoritmo de búsqueda binaria que tienen los índices no es eficiente para este tipo de colecciones donde la mayoria de elementos son iguales, para que este algoritmo haga su magia necesitamos que los elementos a buscar sean la mayoría diferentes, por eso en este caso es más eficiente la búsqueda habitual donde recorre todos y descarta los que no necesita."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si tenemos esta casuística donde un montón de campos son iguales lo más probable es que filtremos por algún campo más, es decir que creemos un índice de tipo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"compound"}]},{"type":"text","value":" (los veremos a continuación), pero si quisieramos realizar una busqueda sin índice, en mongo se conoce como búsqueda "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"natural"}]},{"type":"text","value":" y aunque no se suele comentar esto mucho por los mares digitales, tenemos la posibilidad de forzarlo, solo tenemos que sugerirlo de esta manera:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hint"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$natural"}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"hint"}]},{"type":"text","value":" es uno de los extras que podemos indicar en las busquedas para sugerir un índice u otro según el nombre, podemos ponerlo de la misma manera que pusimos al crear el índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hint"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"O con el nombre de índice que se crea:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"hint"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"city_-1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Los podemos ver por ejemplo desde robo3t"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.49.54.png","alt":"Captura-de-pantalla-2020-01-11-a-las-19.49.54"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visto este caso especial pasemos a los índices compuestos donde podemos ver búsquedas eficientes por varios campos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"compoundfieldscompuestoobsicamentevarioscampos"},"children":[{"type":"text","value":"Compound fields (compuesto....o básicamente varios campos)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Los siguientes índices son los que involucran a varios campos dentro de nuestras colecciones, estos siguen un orden según como los escribamos, la sintaxis básica sería:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"field1"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"field2"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo que hace este índice es crear un índice partiendo principalmente del "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"field1"}]},{"type":"text","value":" con un orden ascendente y dentro de los field1 que coincidan los ordena según el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"field2"}]},{"type":"text","value":" de manera descendente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En nuestro caso crearemos un índice por ciudad e email, recordemos que en ciudad tenemos 1999000 veces la misma ciudad y antes ha tardado mogollón"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora veamos la búsqueda sín indice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'noindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ha tardado "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"5112ms"}]},{"type":"text","value":" que no está nada mal pensando en la búsqueda anterior, pero ahora veamos la búsqueda con el índice"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.58.25.png","alt":"Captura-de-pantalla-2020-01-11-a-las-19.58.25"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sorprendetemente ha tardado solo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"12ms"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-11-a-las-19.54.52.png","alt":"Captura-de-pantalla-2020-01-11-a-las-19.54.52"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Cosas que tenemos que tener en cuenta de los índices compuestos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tienen un límite de 32 campos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"En un principio el orden en que definamos el índice no influye demasiado (menos en los $fullText que usaría como filtro inicial para hacer el de texto) a la hora de buscar pero si a la hora de ordenar nosotros añadiendo un sort a continuación del find. Partiendo del índice que hemos definido anteriormente no seria lo mismo hacer esto:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Master'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sort"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Que hacer esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Master'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sort"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"O esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Master'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sort"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"La primera usa el índice directamente y no tiene que hacer nada más:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.16.08.png","alt":"Captura-de-pantalla-2020-01-13-a-las-20.16.08"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Las otras dos pasan del índice para hacer la ordenación, la segunda porque directamente ordenamo primero por email y la segunda porque no es ninguna de las opciones factibles en cuanto a dirección "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"un índice usa solo dos tipos de ordenaciones: la misma con la que se ha definido y la que es directamente opuesta, es decir, si definimos un índice con "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"1,-1,1"}]},{"type":"text","value":", usaría el índice para ordenar bajo esa definición o con "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"-1,1-1"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.17.13.png","alt":"Captura-de-pantalla-2020-01-13-a-las-20.17.13"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"multikeyindexindiceconarraysenresumen"},"children":[{"type":"text","value":"Multikey Index (Indice con arrays en resumen)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este tipo de índice lo crea automáticamente mongo al detectar un campo de tipo array, en un principio podemos pensar que no tiene mucho de especial, pero realmente tenemos que tener en cuenta que el índice creará una entrada por cada elemento del array. Supongamos que además de ciudades tenemos un array de poblaciones donde por ejemplo puede trabajar ese usuario, si alguien de Madrid tiene de poblaciones disponibles Coslada, Vicalvaro, Mordor.... nos creara:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Madrid + Coslada"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nMadrid + Vicalcaro"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nMadrid + Mordor"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Esto es importante a la hora de controlar el tamaño del índice, los índices ocupan espacio.....por si no lo habías pensado y también consumen al rehacerse, cada vez que se escribe se vuelve a indexar"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A tener en cuenta:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Solo podemos tener índices con uno de los valores de tipo array, si intentamos tener dos nos dirá que nos dediquemos a la pintura"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si tenemos un índice con array e intentamos insertar en otro de los campos del índice un array nos dirá otra vez que lo nuestro es el arte"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Podemos crear índices con campos con arrays de documentos, que funcionarían igual que los arrays normales si le indicamos uno de los campos del documento"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"'tags.front'"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndb"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"'tags.front'"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Vuejs'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.29.08.png","alt":"Captura-de-pantalla-2020-01-13-a-las-20.29.08"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si no le indicamos un campo en concreto nos creará un índice pero solo funcionara con documentos completos, no con campos específicos. Borramos el índice anterior y creamos este:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora realizamos la misma búsqueda anterior:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"'tags.front'"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Vuejs'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.36.34.png","alt":"Captura-de-pantalla-2020-01-13-a-las-20.36.34"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo notamos con el tiempo que tarda pero podemos vemos como hace la búsqueda básica con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"COLLSCAN"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSin embargo si búscamos un documento al completo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"'tags'"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n\t\t\t\t\t"},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"front"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Vuejs'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n\t\t\t\t\t"},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"back"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Node'"}]},{"type":"text","value":"\n\t\t\t\t"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'executionStats'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos como tarda bastante menos y además nos indica que ha usado un índice"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-13-a-las-20.38.52.png","alt":"Captura-de-pantalla-2020-01-13-a-las-20.38.52"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"indicefulltextocamposconunmontndetexto"},"children":[{"type":"text","value":"Indice Full text(o campos con un montón de texto)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"El índice de texto es un tipo de indice especial que nos mejora la búsqueda con un conjunto de palabras sobre un número "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" de campos, es decir, nos busca en todos los campos que tenga el índice. Este índice se puede aplicar en cualquier campo de tipo string o de array con valores de tipo string, donde podemos indicarlo el idioma en cuestión para que ignore palabras comunes como 'y, o, de' en español."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPor defecto se crea con idioma inglés por lo que en nuestro caso lo añadiremos a la hora de la creación del índice."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para hacernos una idea de que tiene de especial, los índices habituales lo que hacen es crearlo basandose en "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"esto que buscas está en estos documentos"}]},{"type":"text","value":", sin embargo este tipo de índice lo que hace es darle la vuelta "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"este documento tiene estas palabras"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este caso los ejemplos son un poco más complicados, las búsquedas especiales por un texto solo funcionan si tenemos un índice, por lo que , por ejemplo, en la colección "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"noindex"}]},{"type":"text","value":" no podremos hacer esta búsqueda, lo más parecido sería una expresión regular con un find sobre los campos que quisieramos realizar la búsqueda y evidentemente tardará un poco más, veamos un ejemplo. Para la pruebas tener en cuenta que no seria lo mismo que un entorno de producción esto es solo para entender los conceptos, en un entorno real puede tardar más o menos la búsqueda sin índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'noindex'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"firstName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","regex"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-source","language-regex"]},"children":[{"type":"text","value":"Juanchu"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n\t\t\t\t"},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"alias"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","regex"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-source","language-regex"]},"children":[{"type":"text","value":"Juanchu"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n\t\t\t\t"},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"bio"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","regex"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-source","language-regex"]},"children":[{"type":"text","value":"Juanchu"}]},{"type":"element","tagName":"span","properties":{"className":["token","regex-delimiter"]},"children":[{"type":"text","value":"/"}]}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos da un tiempo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4429ms"}]},{"type":"text","value":" que no está nada mal."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCreemos ahora un índice con los campos en formato texto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"bio"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'text'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"firstName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'text'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"alias"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'text'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"default_language"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"spanish\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto tardará un montón, es un índice que tiene que comprobar todas las palabras que tienen nuestros campos de texto, y si no le ponemos el idioma bien....pues más todavía porque almacenará palabras innecesarias."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora que ya tenemos el índice busquemos el mismo concepto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$text"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"$search"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juanchu\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora vuelve a tardar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1ms"}]},{"type":"text","value":", bastante mejor ¿no?. En un entorno con más campos se notaría más la diferencia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.46.42.png","alt":"Captura-de-pantalla-2020-01-12-a-las-11.46.42"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para que veamos lo que nos ha encontrado"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-11.48.47.png","alt":"Captura-de-pantalla-2020-01-12-a-las-11.48.47"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto tenemos un ejemplo, veamos ahora que epecialidades tenemos con este tipo de índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SOLO ES POSIBLE TENER UN ÍNDICE DE TIPO TEXT"}]},{"type":"text","value":", es decir, si queremos añadir campos de texto, tenemos que eliminar el que tuvieramos y hacerlo de nuevo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Es CASE-INSENSITIVE"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Se le pueden indicar pesos de importancia a cada campo, esto sumará las veces que aparece la palabra que buscamos en cada campo y documento y nos los devolverá según ese orden si se lo indicamos en la busqueda."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCreación:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"alias"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"bio"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"firstName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"weights"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n       "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"firstName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n       "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"alias"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"default_language"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"spanish\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto crearía un índice con los pesos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n* firstName 10"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n* alias 5"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n* bio 1 (by default)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$text"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"$search"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Juanchu\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"score"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$meta"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"textScore\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"sort"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"score"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$meta"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"textScore\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/01/Captura-de-pantalla-2020-01-12-a-las-18.45.46.png","alt":"Captura-de-pantalla-2020-01-12-a-las-18.45.46"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Wildcard indices"}]},{"type":"text","value":" o índices creados según un patrón de posibles campos, aquí solo podemos ponerlo una vez y lo que haría sería un índice con todos los campos de tipo string (más adelante veremos esto de los wildcard)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Sí no queremos hacer que ignore las palabras tipo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"y, o, de"}]},{"type":"text","value":" que las usa como delimitadores para conjuntos, podemos índicarle "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"language: \"none\""}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No se puede indicar "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"hint"}]},{"type":"text","value":" para sugerir un índice a la hora de realizar búsquedas tipo text"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"En los índices compuestos podemos tener varios campos de tipo text pero solo podemos tener el resto de campos tipo single, es decir, no podemos tener "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"multikeys o geospatial"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Crear este tipo de índice es muy costoso a nivel de recursos, tanto en ram como en espacio y puede hacer más lenta la inserción de nuevos campos que esten bajo ese índice."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"ndicedetextomultiidioma"},"children":[{"type":"text","value":"Índice de texto multiidioma"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta parte require su propio título ya que tiene un poco de miga. Podemos tener colecciones en multiples idiomas y para mejorar la búsqueda bajo estos campos podemos modificar un poco los campos del documento para que mongo haga su magia con las búsquedas, añadiendo solo la traducción pertinente según el idioma que le indiquemos en el índice."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPara esto tenemos que tener un campo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"language"}]},{"type":"text","value":" donde indiquemos el lenguaje en cuestión del documento o campo, así a la hora de hacer el índice mongo sabra mejor que tiene que hacer con ese campo. Un ejemplo de documento podría ser este:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"_id"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"language"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"portuguese\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"original"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"A sorte protege os audazes.\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"translation"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n     "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n           "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"language"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"english\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n           "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"quote"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Fortune favors the bold.\""}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n           "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"language"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"spanish\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n           "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"quote"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"La suerte protege a los audaces.\""}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si quisieramos tener otro campo como indicador de lenguaje lo podemos indicar a la hora de crear el indice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"quotes"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"quote"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                       "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"language_override"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"idioma\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"wildcardindexindicessinsaberloscampos"},"children":[{"type":"text","value":"Wildcard Index (indices sin saber los campos...)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto no es muy dificil de entender, queremos crear índices donde el nombre de los campos puede ser dinámico, es decir, puede ir cambiando como puede ser un campo con metadatos que pueden ir variando, en este caso por ejemplo creariamos un índice así:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"user_metadata.$**\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos crearía un indice teniendo en cuenta que dentro de "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"user_metadata"}]},{"type":"text","value":" podemos tener de todo tipo de campos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"user_metadata"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"clicks\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"200"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"views\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"user_metadata"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"images\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"500"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"favorite_tags\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"games\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"dogs\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si queremos crear un índice por todos los posibles campos, simplemente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"$**\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Un índice de tipo wildcard recorrera todos los nested documents que se encuentre"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También es posible indicar este tipo de índice en campos específicos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"collection"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"$**\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"wildcardProjection\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"user_metadata\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"games.rewards_info\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para hacerlo usamos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"wildcardProjection"}]},{"type":"text","value":" como indicador de lo que queremos hacer. Esto por ejemplo nos haría un índice con todo lo que estuviera dentro de esos dos campos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También podemos excluir campos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"collection"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"$**\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"wildcardProjection\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"user_metadata\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"games.rewards_info\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Por defecto"}]},{"type":"text","value":" este tipo de índice omite el campo "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":", si queremos añadirlo solo tenemos que indicarlo dentro de "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"wildcardProjection"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No es posible crear indices compuestos usando wildcard"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No pueden ser indices únicos ni tener TTL"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No pueden ser Geoespaciales o Hashed"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si queremos ordenar con este tipo de índice solo podemos hacerlo usando el campo mediante el que busquemos, es decir, si usamos "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"user_metadata.images"}]},{"type":"text","value":" para buscar solo podremos hacer un sort en mongo usando ese campo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No indexan campos vacios, es decir los ignoran y los guardan en el indice (son lo que se conoce como SPARSE)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No podemos hacer búsquedas haciendo coincidir un array al completo, solo campos sueltos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No podemos hacer búsquedas con un "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"not equal null"}]},{"type":"text","value":" porque no tiene esos elementos y no comprende que hacemos."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"hashedindex"},"children":[{"type":"text","value":"HASHED INDEX"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En estos índices lo que hace Mongo es convertir el valor del campo en un hash único y lo almacena. Este formato puede ser útil, en general para ahorrar espacio o para temas de "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"sharding"}]},{"type":"text","value":" (comprime los documentos hijos en un hash), ya que en lugar de almacenar el campo almacena un hash. Luego Mongo por si mismo hace su magia y cada vez que busques va convirtiendo el directamente el valor de los campos, es decir, nosotros no tenemos que hacer nada."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"alias"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'hashed'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Importante:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No admiten búsquedas por rango solo exactas"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"No admiten coumpound index"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"otrosindices"},"children":[{"type":"text","value":"OTROS INDICES"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2D"}]},{"type":"text","value":": Indices basados en coordenadas de planos 2d"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2Dsphere"}]},{"type":"text","value":": Indices en formato Tierra, es decir, pone un plano en formato esfera para gestionar las coordenadas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geoHaystack"}]},{"type":"text","value":": Indices especializados en planos 2d de tamaño pequeño"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"propiedadesdelosindices"},"children":[{"type":"text","value":"PROPIEDADES DE LOS INDICES"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"TTL"}]},{"type":"text","value":": Propiedad de single field index donde indicamos un tiempo de vida al índice para que elimine los documentos de la colección, util para colecciones de logs y cosas así. El valor que indiquemos no se puede cambiar, para cambiarlo tenemos que borrar el indice y crearlo de nuevo"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"eventlog"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"lastModifiedDate\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"expireAfterSeconds"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3600"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También es posible indicar una hora de expiración si el propio campo es de tiempo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"log_events"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"expireAt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"expireAfterSeconds"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto haría que este documento:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"log_events"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"insert"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"expireAt\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"new"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","class-name"]},"children":[{"type":"text","value":"Date"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'July 22, 2013 14:00:00'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"logEvent\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"logMessage\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"Success!\""}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Desapareciera a esa hora."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Unique"}]},{"type":"text","value":": Campos o combinaciones de campos que no se pueden repetir"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"members"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"user_id\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"unique"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\ndb"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"members"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"groupNumber"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastname"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"firstname"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"unique"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este índice si no existe un campo lo guardará como null y no se podrá repetir"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Partial Index"}]},{"type":"text","value":": Podemos crear indices que solo esten referidos cuando se haga un tipo de filtro, es decir, que solo se indexará algo si el documento cumple con el filtro que se le indica, es decir, si creamos este índice:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"restaurants"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"cuisine"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"name"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n   "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"partialFilterExpression"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"rating"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$gt"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Solo indexará cuando "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"rating"}]},{"type":"text","value":" sea mayor que 5 (pero solo mayor que 5, no vale luego buscar por un mayor de 8), esto hace que consuma menos recursos el indice."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Case Insensitive"}]},{"type":"text","value":": Podemos crear indices con case insensitive, indicando el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"locale"}]},{"type":"text","value":" y el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"strength"}]},{"type":"text","value":" que queremos que use para la parte insensitive"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"fruit"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"type"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                      "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"collation"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"locale"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'en'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"strength"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para ver la diferencia en la comparación "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/collation/#collation-document"},"children":[{"type":"text","value":"Pulsa aquí"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SPARSE INDEX"}]},{"type":"text","value":": Con la opción sparse le indicamos que no guarde en el índice los documentos que no contengan el campo que le indicamos."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"addresses"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"xmpp_id\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"sparse"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos que tener cuidado porque este tipo de indice puede no devolver todos los resultados, si usamos un filtro que contenga "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"xmpp_id"}]},{"type":"text","value":" nos ignorará los que no lo tengan y si buscamos también por otro campo no nos aparecerá"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Index intersection"}]},{"type":"text","value":": Intersección de índices, resumiendo esta funcionalidad, si mongo cree que funciona puede hacer uso de dos indices para hacer una búsqueda. Por poner un ejemplo, si tenemos dos single index uno con ciudad y otro con población, si buscamos por ambos puede mezclar los indices para mejorar la búsqueda, pero solo la búsqueda no lo usaria por ejemplo si buscamos por ciudad y luego queremos hacer un sort por población."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"background"}]},{"type":"text","value":": Propiedad recomendada para que la colección no se bloquee mientras se rehacen los indices (aún así ojo con los campos que se tenga prevista un nivel alto de escritura)"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"addresses"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"xmpp_id\""}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"background"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"true"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"trabajandoconindices"},"children":[{"type":"text","value":"Trabajando con indices"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"verindicesdeunacoleccin"},"children":[{"type":"text","value":"Ver indices de una colección"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getIndexes"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos muestra algo similar a esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"v\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"key\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_id\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"_id_\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ns\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"indexninja.index\""}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"v\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"key\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_fts\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_ftsx\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TextIndex\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ns\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"indexninja.index\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"weights\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"alias\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"bio\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"firstName\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"10"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"default_language\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"english\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"language_override\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"language\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"textIndexVersion\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"v\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"key\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"lastName\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.0"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lastName_-1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ns\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"indexninja.index\""}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con la "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"type_version"}]},{"type":"text","value":" del indice, la "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"key"}]},{"type":"text","value":" por la que se ha realizado, el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" que tiene el indice y el "},{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ns"}]},{"type":"text","value":", es decir, la colección a la que pertenece"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"eliminarunndice"},"children":[{"type":"text","value":"Eliminar un índice"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"dropIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lastName_-1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\ndb"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"dropIndex"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"lastName"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos devolvería algo similar a esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"/* 1 */"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nIndexesWas\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ok\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.0"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Donde nos índica el número de indices que coincidian con esa condición y el resultado"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"eliminartodosovariosindices"},"children":[{"type":"text","value":"Eliminar todos(o varios indices)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para eliminar todos los indices:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"dropIndexes"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y a partir de la versión "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"4.2"}]},{"type":"text","value":" de mongo podemos indicarle un array con los nombres de los indices que queremos eliminar"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"dropIndexes"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TextIndex\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"lastName_-1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"verelusoactualdelosindices"},"children":[{"type":"text","value":"Ver el uso actual de los indices"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"aggregate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"$indexStats"}]}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto podemos ver si se usan mucho o poco los indices actuales. Esto nos devuelve algo similar a esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"/* 1 */"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"TextIndex\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"key\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_fts\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"text\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_ftsx\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"host\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"83165c61f9de:27017\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"accesses\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ops\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","keyword"]},"children":[{"type":"text","value":"NumberLong"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"since\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","keyword"]},"children":[{"type":"text","value":"ISODate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2020-01-12T11:18:17.642Z\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"/* 2 */"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"name\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"_id_\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"key\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"_id\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"host\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"83165c61f9de:27017\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"accesses\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"ops\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","keyword"]},"children":[{"type":"text","value":"NumberLong"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"since\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","builtin","keyword"]},"children":[{"type":"text","value":"ISODate"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"2020-01-12T10:22:38.796Z\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También podemos ver que se ha usado en cada query que realizamos con el comando que estamos usando continuamente (además de mogollón de información relativa a la query)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"executionStats\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y si por ejemplo queremos ver info extra cuando tenemos una busqueda con multiples condiciones, como un poco el orden de filtro que ha seguido con:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"find"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"city"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Madrid'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"email"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'NinjaMaster@email.com'"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"explain"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"allPlansExecution\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta query ademas de lo anterior nos devuelve:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"json"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-json"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"allPlansExecution\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" \n            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"totalKeysExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"totalDocsExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionStages\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"stage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"FETCH\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"works\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"advanced\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needTime\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needYield\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"saveState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"restoreState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isEOF\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"docsExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"alreadyHasObj\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"inputStage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"stage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IXSCAN\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"works\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"advanced\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needTime\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needYield\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"saveState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"restoreState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isEOF\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"keyPattern\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"-1.0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"email\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1.0"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexName\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"city_-1_email_1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isMultiKey\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"multiKeyPaths\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"email\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isUnique\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isSparse\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isPartial\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexVersion\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"direction\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"forward\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexBounds\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" \n                                "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"[\\\"Madrid\\\", \\\"Madrid\\\"]\""}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"email\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" \n                                "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"[\\\"NinjaMaster@email.com\\\", \\\"NinjaMaster@email.com\\\"]\""}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"keysExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"5"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"seeks\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"dupsTested\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"dupsDropped\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" \n            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"totalKeysExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"totalDocsExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionStages\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"stage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"FETCH\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"filter\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"email\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"$eq\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"NinjaMaster@email.com\""}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"works\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"advanced\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needTime\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needYield\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"saveState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"restoreState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isEOF\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"docsExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"alreadyHasObj\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"inputStage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"stage\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"IXSCAN\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"nReturned\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"executionTimeMillisEstimate\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"works\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"advanced\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needTime\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"needYield\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"saveState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"restoreState\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isEOF\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"keyPattern\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"-1.0"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexName\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"city_-1\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isMultiKey\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"multiKeyPaths\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isUnique\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isSparse\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"isPartial\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","boolean"]},"children":[{"type":"text","value":"false"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexVersion\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"direction\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"forward\""}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"indexBounds\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"city\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":" \n                                "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"\"[\\\"Madrid\\\", \\\"Madrid\\\"]\""}]},{"type":"text","value":"\n                            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"keysExamined\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"6"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"seeks\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"dupsTested\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n                        "},{"type":"element","tagName":"span","properties":{"className":["token","property"]},"children":[{"type":"text","value":"\"dupsDropped\""}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"0"}]},{"type":"text","value":"\n                    "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n                "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n            "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n        "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"recomendablequelosndicesentrenenlaramasinosevitamostenerquetirardediscoparaconsultarlos"},"children":[{"type":"text","value":"Recomendable que los índices entren en la RAM, asi nos evitamos tener que tirar de disco para consultarlos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para ver lo que ocupan los indices solo tenemos que lanzar el comando"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"totalIndexSize"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"El resultado está en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bytes"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h4","properties":{"id":"vertodalainfoposibledeunacoleccin"},"children":[{"type":"text","value":"Ver toda la info posible de una colección"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"mongodb"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-mongodb"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-mongodb"]},"children":[{"type":"text","value":"db"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"getCollection"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'index'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"stats"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"sintaxisbsicadecreacindendices","heading":"Sintaxis básica de creación de índices"},{"id":"tiposdendices","heading":"Tipos de índices","items":[{"id":"singlefieldunsolocampo","heading":"Single field (un solo campo)"},{"id":"compoundfieldscompuestoobsicamentevarioscampos","heading":"Compound fields (compuesto....o básicamente varios campos)"}]},{"id":"multikeyindexindiceconarraysenresumen","heading":"Multikey Index (Indice con arrays en resumen)"},{"id":"indicefulltextocamposconunmontndetexto","heading":"Indice Full text(o campos con un montón de texto)","items":[{"id":"ndicedetextomultiidioma","heading":"Índice de texto multiidioma"},{"id":"wildcardindexindicessinsaberloscampos","heading":"Wildcard Index (indices sin saber los campos...)"},{"id":"hashedindex","heading":"HASHED INDEX"},{"id":"otrosindices","heading":"OTROS INDICES"}]},{"id":"propiedadesdelosindices","heading":"PROPIEDADES DE LOS INDICES"},{"id":"trabajandoconindices","heading":"Trabajando con indices","items":[{"id":"verindicesdeunacoleccin","heading":"Ver indices de una colección"},{"id":"eliminarunndice","heading":"Eliminar un índice"},{"id":"eliminartodosovariosindices","heading":"Eliminar todos(o varios indices)"},{"id":"verelusoactualdelosindices","heading":"Ver el uso actual de los indices"},{"id":"recomendablequelosndicesentrenenlaramasinosevitamostenerquetirardediscoparaconsultarlos","heading":"Recomendable que los índices entren en la RAM, asi nos evitamos tener que tirar de disco para consultarlos"},{"id":"vertodalainfoposibledeunacoleccin","heading":"Ver toda la info posible de una colección"}]}]},"featureImageSharp":{"base":"MongoBanner.png","publicURL":"/static/e2d851a4e8d17762251ac236e48b5140/MongoBanner.png","imageMeta":{"width":510,"height":261},"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACEElEQVQoz11STW8SURSdn+SiBoRhGOaTYSiCtR98t0hbhaIFagrWSimVFqqpFbdN9C+4Nd2Ybk3/iEk3GONi3vHdV1DSxcl9c+e9c8+590pWNDQyDBmmKTN+ngKzMCfRnoHI2zKbwR+OJ5LJyRIlDc6KwgRxVJ5eFpiS6lYQqh74hztFvUn8KRlc2fKFzZyDIMwIr8QJdTMgyAxOQtD4dyqpYTXvopCNoZhzoRkPCEwz/IzOtqN49EYiq+5Igb7vY83nVZx9OMGrvSZ6vdcYDA7R7bbRO+rg+HAbrRdL+NjfxPuDNWSySTx6HMfCYhyJpM38gXskxJPIZiwdZs5iGNnMAjY2Cyiv51BcXUalWsL5+RDb9WfI5xIoZKLIpR1kV2w8TFm4vPyG8XiMm5sb7LYbLBSe4wqjsmdZ3L8VYhHDL3oS0f3CcjQWFhA5bks3ZW4/CCXi48pcXF19x1ZtHf3jLru+/oF4wvgtWXbIo77ZMYUp6hxa7TpOuNX9zi63P8CbTgv1RkWcSbmq+UQBx42gsVPD5y8XGH06Y08rJd7TwC+JK6EJMd5UUsbWSmkM373FKUe9WeGxj+HpEbq9Pey8rAn1t3dpKAGUN/IsX1yi/GQo/1eDdolXVoXNZMrmUYU7r6G6VRbTduf1mZW6jYp6n1QLQfSPCL9Ods6bkhKmq0MgVXSZSO/sJxGxmXf9v1BbiUoJyKuGAAAAAElFTkSuQmCC","aspectRatio":1.9444444444444444,"src":"/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner.png","srcSet":"/static/e2d851a4e8d17762251ac236e48b5140/847ef/MongoBanner.png 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/91cba/MongoBanner.png 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner.png 510w","srcWebp":"/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner.webp","srcSetWebp":"/static/e2d851a4e8d17762251ac236e48b5140/9fca7/MongoBanner.webp 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/37a4e/MongoBanner.webp 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"}}}},"allGhostPost":{"edges":[{"node":{"id":"Ghost__Post__5fa7e206a6c0f5058bff43c9","title":"Javascript Funcional III: Composición de funciones","slug":"javascript-funcional-iii-composicion-de-funciones","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Capture-5-1-1.jpeg","excerpt":"Bien vamos con la última de las características que tiene la programación\nfuncional antes de adentrarnos puramente en propiedades funcionales. En este\ncaso vamos a ver en detalle que es eso de Composición de funciones.\n\nEsto realmente no tiene mucha ciencia, el propio nombre nos indica de que va, se\ntrata de aplicar funciones en cadena para lógicas más complejas. Esto se suele\nver en ciertas librerias como composition, pipe, flow..., primero veremos como\naplicar esto de forma nativa y ya veremos","custom_excerpt":null,"visibility":"public","created_at_pretty":"8 Nov 2020","published_at_pretty":"20 Nov 2020","updated_at_pretty":"19 Jan 2021","created_at":"2020-11-08T13:18:14.000+01:00","published_at":"2020-11-20T11:37:00.000+01:00","updated_at":"2021-01-19T21:08:03.000+01:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},"tags":[{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"javascript","url":"https://jlgarcia.fulldev.ninja/tag/javascript/","name":"javascript","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"ramda","url":"https://jlgarcia.fulldev.ninja/tag/ramda/","name":"ramda","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null}],"plaintext":"Bien vamos con la última de las características que tiene la programación\nfuncional antes de adentrarnos puramente en propiedades funcionales. En este\ncaso vamos a ver en detalle que es eso de Composición de funciones.\n\nEsto realmente no tiene mucha ciencia, el propio nombre nos indica de que va, se\ntrata de aplicar funciones en cadena para lógicas más complejas. Esto se suele\nver en ciertas librerias como composition, pipe, flow..., primero veremos como\naplicar esto de forma nativa y ya veremos algún atajo con alguna libreria.\n\nContinuemos con la teoria de uno de los ejemplos anteriores que es la de crear\nun player inicial para un juego:\n\nconst setName = (name) => (player) => {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) => {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) => {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\n\nconsole.log(newPlayer)\n\n\nSi nos fijamos en el contenido de newPlayer, es donde tenemos nuestra\ncomposición de funciones, lo que se suele ver como:\n\nf(g(x))\n\n\nEn este caso puede que sea facil de entender lo que estamos haciendo en este\ncaso, pero si tuvieramos esta forma en soluciones más complejas puede que no nos\nenteremos de nada, por lo que veamos como ir mejorando nuestra teoria de la\ncomposición.\n\nLo primero que haremos será crear nuestro propio método compose:\n\nconst compose = (...fns) => x => {\n  return fns.reduce((previous, current) => {\n    return current(previous)\n  }, x)\n}\n\n\nEste método compose lo que hace es recibir una cantidad n de funciones que debe\naplicar sobre un valor inicial x. En este caso lo hace de izquierda a derecha,\nmuchas veces se usa reduceRight para hacerlo de derecha a izquierda, depende de\ncuales sean los métodos a usar para la composición nos interesa más una\ndirección u otra (por defecto derecha a izquierda aunque a mí me gusta más\nizquierda a derecha).\n\nAhora con esta función compose solo tenemos que usarla:\n\nconst compose = (...fns) => x => {\n  return fns.reduce((previous, current) => {\n    return current(previous)\n  }, x)\n}\n\nconst setName = (name) => (player) => {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) => {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) => {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\nconst otherPlayer = compose(setName('Ninja'), setPowers, setWeapon)({})\n\nconsole.log(newPlayer)\nconsole.log(otherPlayer)\n\n\n\n\nComo podemos ver ambas funcionan correctamente y es un poco más sencillo de\nentender lo que estamos haciendo. Recuerdo que este ejemplo es un poco forzado\nes solo orientativo para ver la funcionalidad compose.\n\nVeamos el ejemplo con Ramda\n\nconst R = require('ramda')\n\nconst setName = (name) => (player) => {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) => {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) => {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\n// Aquí en lugar de compose usamos el método en cuestión de R que es pipe\nconst otherPlayer = R.pipe(setName('Ninja'), setPowers, setWeapon)({})\n\nconsole.log(newPlayer)\nconsole.log(otherPlayer)\n\n\nSolo tenemos que usar pipe para hacerlo de izquierda a derecha o compose para\nhacerlo de derecha a izquierda\n\nUn detalle importante a tener en cuenta y que hacemos uso en el ejemplo, es lo\nque se conoce como programación tacita o point free, este concepto se refiere a\nla omisión de los parámetros de los métodos cuando lo usamos por ejemplo en una\ncomposición como esta que hemos visto, debido a que los valores de retorno de\nunos métodos son los de entrada de otros por lo que como el proceso se realiza\nautomáticamente lo podemos omitir. En este caso que hemos visto siempre se\nretorna el mismo objeto, pero pudiera ser cualquier otro caso mientras que se\ncumpla este concepto:\n\nfuncA :: A -> B\nfuncB :: B -> C\n\n// Esto lo podemos encadenar porque funcB espera como valor de entrada B que es lo que devuelve funcA\nfuncC:: funcA + funcB :: A -> B -> C\n\n\nCreo que con esto se entiende más o menos lo básico sobre la composición, en los\npróximos capítulos veremos elementos más puramente funcionales como pueden ser\nlos Funtores, una abrazooooo","html":"<!--kg-card-begin: markdown--><p>Bien vamos con la última de las características que tiene la programación funcional antes de adentrarnos puramente en propiedades funcionales. En este caso vamos a ver en detalle que es eso de <em>Composición de funciones</em>.</p>\n<p>Esto realmente no tiene mucha ciencia, el propio nombre nos indica de que va, se trata de aplicar funciones en cadena para lógicas más complejas. Esto se suele ver en ciertas librerias como <em>composition, pipe, flow...</em>, primero veremos como aplicar esto de forma nativa y ya veremos algún atajo con alguna libreria.</p>\n<p>Continuemos con la teoria de uno de los ejemplos anteriores que es la de crear un <em>player</em> inicial para un juego:</p>\n<pre><code class=\"language-javascript\">const setName = (name) =&gt; (player) =&gt; {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) =&gt; {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) =&gt; {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\n\nconsole.log(newPlayer)\n</code></pre>\n<p>Si nos fijamos en el contenido de <em>newPlayer</em>, es donde tenemos nuestra composición de funciones, lo que se suele ver como:</p>\n<pre><code class=\"language-javascript\">f(g(x))\n</code></pre>\n<p>En este caso puede que sea facil de entender lo que estamos haciendo en este caso, pero si tuvieramos esta forma en soluciones más complejas puede que no nos enteremos de nada, por lo que veamos como ir mejorando nuestra teoria de la composición.</p>\n<p>Lo primero que haremos será crear nuestro propio método <em>compose</em>:</p>\n<pre><code class=\"language-javascript\">const compose = (...fns) =&gt; x =&gt; {\n  return fns.reduce((previous, current) =&gt; {\n    return current(previous)\n  }, x)\n}\n</code></pre>\n<p>Este método compose lo que hace es recibir una cantidad <strong>n</strong> de funciones que debe aplicar sobre un valor inicial <strong>x</strong>. En este caso lo hace de <strong>izquierda a derecha</strong>, muchas veces se usa <strong>reduceRight</strong> para hacerlo de <strong>derecha a izquierda</strong>, depende de cuales sean los métodos a usar para la composición nos interesa más una dirección u otra (por defecto derecha a izquierda aunque a mí me gusta más izquierda a derecha).</p>\n<p>Ahora con esta función compose solo tenemos que usarla:</p>\n<pre><code class=\"language-javascript\">const compose = (...fns) =&gt; x =&gt; {\n  return fns.reduce((previous, current) =&gt; {\n    return current(previous)\n  }, x)\n}\n\nconst setName = (name) =&gt; (player) =&gt; {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) =&gt; {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) =&gt; {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\nconst otherPlayer = compose(setName('Ninja'), setPowers, setWeapon)({})\n\nconsole.log(newPlayer)\nconsole.log(otherPlayer)\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Captura-de-pantalla-2020-11-08-a-las-14.50.00.png\" alt=\"Captura-de-pantalla-2020-11-08-a-las-14.50.00\"></p>\n<p>Como podemos ver ambas funcionan correctamente y es un poco más sencillo de entender lo que estamos haciendo. Recuerdo que este ejemplo es un poco forzado es solo orientativo para ver la funcionalidad <em>compose</em>.</p>\n<p>Veamos el ejemplo con <strong>Ramda</strong></p>\n<pre><code class=\"language-javascript\">const R = require('ramda')\n\nconst setName = (name) =&gt; (player) =&gt; {\n  player.name = name\n  return player\n}\n\nconst setPowers = (player) =&gt; {\n  const availablePowers = ['fly', 'invisibility', 'bulletproof', 'superstrength']\n  player.powers = availablePowers[Math.floor(Math.random() * availablePowers.length)]\n  return player\n}\n\nconst setWeapon = (player) =&gt; {\n  const availableWeapons = ['gun', 'katana', 'ninja star', 'grenade']\n  player.weapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n  return player \n}\n\nconst newPlayer = setWeapon(setPowers(setName('Ninja')({})))\n// Aquí en lugar de compose usamos el método en cuestión de R que es pipe\nconst otherPlayer = R.pipe(setName('Ninja'), setPowers, setWeapon)({})\n\nconsole.log(newPlayer)\nconsole.log(otherPlayer)\n</code></pre>\n<p>Solo tenemos que usar <strong>pipe</strong> para hacerlo de izquierda a derecha o <strong>compose</strong> para hacerlo de derecha a izquierda</p>\n<p>Un detalle importante a tener en cuenta y que hacemos uso en el ejemplo, es lo que se conoce como <em>programación tacita o point free</em>, este concepto se refiere a la omisión de los parámetros de los métodos cuando lo usamos por ejemplo en una composición como esta que hemos visto, debido a que los valores de retorno de unos métodos son los de entrada de otros por lo que como el proceso se realiza automáticamente lo podemos omitir. En este caso que hemos visto siempre se retorna el mismo objeto, pero pudiera ser cualquier otro caso mientras que se cumpla este concepto:</p>\n<pre><code class=\"language-javascript\">funcA :: A -&gt; B\nfuncB :: B -&gt; C\n\n// Esto lo podemos encadenar porque funcB espera como valor de entrada B que es lo que devuelve funcA\nfuncC:: funcA + funcB :: A -&gt; B -&gt; C\n</code></pre>\n<p>Creo que con esto se entiende más o menos lo básico sobre la composición, en los próximos capítulos veremos elementos más puramente funcionales como pueden ser los <strong>Funtores</strong>, una abrazooooo</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/javascript-funcional-iii-composicion-de-funciones/","canonical_url":null,"uuid":"9e2f2b98-0abd-4a8d-923b-38c0cf1f4c48","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5fa7e206a6c0f5058bff43c9","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Bien vamos con la última de las características que tiene la programación funcional antes de adentrarnos puramente en propiedades funcionales. En este caso vamos a ver en detalle que es eso de <em>Composición de funciones</em>.</p>\n<p>Esto realmente no tiene mucha ciencia, el propio nombre nos indica de que va, se trata de aplicar funciones en cadena para lógicas más complejas. Esto se suele ver en ciertas librerias como <em>composition, pipe, flow...</em>, primero veremos como aplicar esto de forma nativa y ya veremos algún atajo con alguna libreria.</p>\n<p>Continuemos con la teoria de uno de los ejemplos anteriores que es la de crear un <em>player</em> inicial para un juego:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setName</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  player<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setPowers</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availablePowers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'fly'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'invisibility'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'bulletproof'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'superstrength'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>powers <span class=\"token operator\">=</span> availablePowers<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availablePowers<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setWeapon</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availableWeapons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'gun'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'katana'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'ninja star'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'grenade'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>weapon <span class=\"token operator\">=</span> availableWeapons<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availableWeapons<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> newPlayer <span class=\"token operator\">=</span> <span class=\"token function\">setWeapon</span><span class=\"token punctuation\">(</span><span class=\"token function\">setPowers</span><span class=\"token punctuation\">(</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Ninja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>newPlayer<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Si nos fijamos en el contenido de <em>newPlayer</em>, es donde tenemos nuestra composición de funciones, lo que se suele ver como:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token function\">f</span><span class=\"token punctuation\">(</span><span class=\"token function\">g</span><span class=\"token punctuation\">(</span>x<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>En este caso puede que sea facil de entender lo que estamos haciendo en este caso, pero si tuvieramos esta forma en soluciones más complejas puede que no nos enteremos de nada, por lo que veamos como ir mejorando nuestra teoria de la composición.</p>\n<p>Lo primero que haremos será crear nuestro propio método <em>compose</em>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">compose</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>fns</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> fns<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">previous<span class=\"token punctuation\">,</span> current</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">current</span><span class=\"token punctuation\">(</span>previous<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n</code></pre></div>\n<p>Este método compose lo que hace es recibir una cantidad <strong>n</strong> de funciones que debe aplicar sobre un valor inicial <strong>x</strong>. En este caso lo hace de <strong>izquierda a derecha</strong>, muchas veces se usa <strong>reduceRight</strong> para hacerlo de <strong>derecha a izquierda</strong>, depende de cuales sean los métodos a usar para la composición nos interesa más una dirección u otra (por defecto derecha a izquierda aunque a mí me gusta más izquierda a derecha).</p>\n<p>Ahora con esta función compose solo tenemos que usarla:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">compose</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token operator\">...</span>fns</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token parameter\">x</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> fns<span class=\"token punctuation\">.</span><span class=\"token function\">reduce</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">previous<span class=\"token punctuation\">,</span> current</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">current</span><span class=\"token punctuation\">(</span>previous<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> x<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setName</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  player<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setPowers</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availablePowers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'fly'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'invisibility'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'bulletproof'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'superstrength'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>powers <span class=\"token operator\">=</span> availablePowers<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availablePowers<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setWeapon</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availableWeapons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'gun'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'katana'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'ninja star'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'grenade'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>weapon <span class=\"token operator\">=</span> availableWeapons<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availableWeapons<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> newPlayer <span class=\"token operator\">=</span> <span class=\"token function\">setWeapon</span><span class=\"token punctuation\">(</span><span class=\"token function\">setPowers</span><span class=\"token punctuation\">(</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Ninja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> otherPlayer <span class=\"token operator\">=</span> <span class=\"token function\">compose</span><span class=\"token punctuation\">(</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Ninja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> setPowers<span class=\"token punctuation\">,</span> setWeapon<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>newPlayer<span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>otherPlayer<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Captura-de-pantalla-2020-11-08-a-las-14.50.00.png\" alt=\"Captura-de-pantalla-2020-11-08-a-las-14.50.00\"></p>\n<p>Como podemos ver ambas funcionan correctamente y es un poco más sencillo de entender lo que estamos haciendo. Recuerdo que este ejemplo es un poco forzado es solo orientativo para ver la funcionalidad <em>compose</em>.</p>\n<p>Veamos el ejemplo con <strong>Ramda</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token constant\">R</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'ramda'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setName</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  player<span class=\"token punctuation\">.</span>name <span class=\"token operator\">=</span> name\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setPowers</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availablePowers <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'fly'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'invisibility'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'bulletproof'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'superstrength'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>powers <span class=\"token operator\">=</span> availablePowers<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availablePowers<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">setWeapon</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">player</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> availableWeapons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'gun'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'katana'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'ninja star'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'grenade'</span><span class=\"token punctuation\">]</span>\n  player<span class=\"token punctuation\">.</span>weapon <span class=\"token operator\">=</span> availableWeapons<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availableWeapons<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n  <span class=\"token keyword\">return</span> player \n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> newPlayer <span class=\"token operator\">=</span> <span class=\"token function\">setWeapon</span><span class=\"token punctuation\">(</span><span class=\"token function\">setPowers</span><span class=\"token punctuation\">(</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Ninja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// Aquí en lugar de compose usamos el método en cuestión de R que es pipe</span>\n<span class=\"token keyword\">const</span> otherPlayer <span class=\"token operator\">=</span> <span class=\"token constant\">R</span><span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token function\">setName</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Ninja'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> setPowers<span class=\"token punctuation\">,</span> setWeapon<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>newPlayer<span class=\"token punctuation\">)</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>otherPlayer<span class=\"token punctuation\">)</span>\n</code></pre></div>\n<p>Solo tenemos que usar <strong>pipe</strong> para hacerlo de izquierda a derecha o <strong>compose</strong> para hacerlo de derecha a izquierda</p>\n<p>Un detalle importante a tener en cuenta y que hacemos uso en el ejemplo, es lo que se conoce como <em>programación tacita o point free</em>, este concepto se refiere a la omisión de los parámetros de los métodos cuando lo usamos por ejemplo en una composición como esta que hemos visto, debido a que los valores de retorno de unos métodos son los de entrada de otros por lo que como el proceso se realiza automáticamente lo podemos omitir. En este caso que hemos visto siempre se retorna el mismo objeto, pero pudiera ser cualquier otro caso mientras que se cumpla este concepto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">funcA <span class=\"token operator\">:</span><span class=\"token operator\">:</span> <span class=\"token constant\">A</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token constant\">B</span>\nfuncB <span class=\"token operator\">:</span><span class=\"token operator\">:</span> <span class=\"token constant\">B</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token constant\">C</span>\n\n<span class=\"token comment\">// Esto lo podemos encadenar porque funcB espera como valor de entrada B que es lo que devuelve funcA</span>\nfuncC<span class=\"token operator\">:</span><span class=\"token operator\">:</span> funcA <span class=\"token operator\">+</span> funcB <span class=\"token operator\">:</span><span class=\"token operator\">:</span> <span class=\"token constant\">A</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token constant\">B</span> <span class=\"token operator\">-</span><span class=\"token operator\">></span> <span class=\"token constant\">C</span>\n</code></pre></div>\n<p>Creo que con esto se entiende más o menos lo básico sobre la composición, en los próximos capítulos veremos elementos más puramente funcionales como pueden ser los <strong>Funtores</strong>, una abrazooooo</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien vamos con la última de las características que tiene la programación funcional antes de adentrarnos puramente en propiedades funcionales. En este caso vamos a ver en detalle que es eso de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Composición de funciones"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto realmente no tiene mucha ciencia, el propio nombre nos indica de que va, se trata de aplicar funciones en cadena para lógicas más complejas. Esto se suele ver en ciertas librerias como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"composition, pipe, flow..."}]},{"type":"text","value":", primero veremos como aplicar esto de forma nativa y ya veremos algún atajo con alguna libreria."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Continuemos con la teoria de uno de los ejemplos anteriores que es la de crear un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"player"}]},{"type":"text","value":" inicial para un juego:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"name"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"name "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" name\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availablePowers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'fly'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'invisibility'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'bulletproof'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'superstrength'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"powers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availableWeapons "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'gun'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'katana'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ninja star'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'grenade'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"weapon "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player \n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newPlayer "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newPlayer"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si nos fijamos en el contenido de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"newPlayer"}]},{"type":"text","value":", es donde tenemos nuestra composición de funciones, lo que se suele ver como:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"f"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"g"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este caso puede que sea facil de entender lo que estamos haciendo en este caso, pero si tuvieramos esta forma en soluciones más complejas puede que no nos enteremos de nada, por lo que veamos como ir mejorando nuestra teoria de la composición."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo primero que haremos será crear nuestro propio método "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"compose"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"compose"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"..."}]},{"type":"text","value":"fns"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" fns"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"previous"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" current"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"current"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"previous"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este método compose lo que hace es recibir una cantidad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"n"}]},{"type":"text","value":" de funciones que debe aplicar sobre un valor inicial "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"x"}]},{"type":"text","value":". En este caso lo hace de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"izquierda a derecha"}]},{"type":"text","value":", muchas veces se usa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"reduceRight"}]},{"type":"text","value":" para hacerlo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"derecha a izquierda"}]},{"type":"text","value":", depende de cuales sean los métodos a usar para la composición nos interesa más una dirección u otra (por defecto derecha a izquierda aunque a mí me gusta más izquierda a derecha)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora con esta función compose solo tenemos que usarla:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"compose"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"..."}]},{"type":"text","value":"fns"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"x"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" fns"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"reduce"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"previous"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" current"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"current"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"previous"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" x"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"name"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"name "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" name\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availablePowers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'fly'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'invisibility'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'bulletproof'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'superstrength'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"powers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availableWeapons "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'gun'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'katana'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ninja star'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'grenade'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"weapon "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player \n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newPlayer "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" otherPlayer "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"compose"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" setPowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" setWeapon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newPlayer"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"otherPlayer"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Captura-de-pantalla-2020-11-08-a-las-14.50.00.png","alt":"Captura-de-pantalla-2020-11-08-a-las-14.50.00"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como podemos ver ambas funcionan correctamente y es un poco más sencillo de entender lo que estamos haciendo. Recuerdo que este ejemplo es un poco forzado es solo orientativo para ver la funcionalidad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"compose"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos el ejemplo con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Ramda"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"R"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"require"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ramda'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"name"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"name "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" name\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availablePowers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'fly'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'invisibility'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'bulletproof'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'superstrength'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"powers "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availablePowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"player"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availableWeapons "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'gun'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'katana'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'ninja star'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'grenade'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  player"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"weapon "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" player \n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newPlayer "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setWeapon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setPowers"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// Aquí en lugar de compose usamos el método en cuestión de R que es pipe"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" otherPlayer "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"R"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"pipe"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"setName"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" setPowers"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" setWeapon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newPlayer"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"otherPlayer"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Solo tenemos que usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pipe"}]},{"type":"text","value":" para hacerlo de izquierda a derecha o "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"compose"}]},{"type":"text","value":" para hacerlo de derecha a izquierda"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un detalle importante a tener en cuenta y que hacemos uso en el ejemplo, es lo que se conoce como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"programación tacita o point free"}]},{"type":"text","value":", este concepto se refiere a la omisión de los parámetros de los métodos cuando lo usamos por ejemplo en una composición como esta que hemos visto, debido a que los valores de retorno de unos métodos son los de entrada de otros por lo que como el proceso se realiza automáticamente lo podemos omitir. En este caso que hemos visto siempre se retorna el mismo objeto, pero pudiera ser cualquier otro caso mientras que se cumpla este concepto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"text","value":"funcA "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"B"}]},{"type":"text","value":"\nfuncB "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"B"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// Esto lo podemos encadenar porque funcB espera como valor de entrada B que es lo que devuelve funcA"}]},{"type":"text","value":"\nfuncC"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" funcA "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" funcB "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":":"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"A"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"B"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"-"}]},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":">"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","constant"]},"children":[{"type":"text","value":"C"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que con esto se entiende más o menos lo básico sobre la composición, en los próximos capítulos veremos elementos más puramente funcionales como pueden ser los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Funtores"}]},{"type":"text","value":", una abrazooooo"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[]},"featureImageSharp":{"base":"Capture-5-1-1.jpeg","publicURL":"/static/28e76839a7fb382fbbe244b857f2980c/Capture-5-1-1.jpeg","imageMeta":{"width":628,"height":263},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMG/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABz9giD//EABcQAQADAAAAAAAAAAAAAAAAAAADERL/2gAIAQEAAQUCS4t//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEQEv/aAAgBAQAGPwIWJ//EABkQAAIDAQAAAAAAAAAAAAAAAAERACFREP/aAAgBAQABPyGERsI0r3n/2gAMAwEAAgADAAAAEHAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAIDAQAAAAAAAAAAAAAAASExABARUf/aAAgBAQABPxDERjkbBCDxvX//2Q==","aspectRatio":2.3972602739726026,"src":"/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5-1-1.jpg","srcSet":"/static/28e76839a7fb382fbbe244b857f2980c/477ba/Capture-5-1-1.jpg 175w,\n/static/28e76839a7fb382fbbe244b857f2980c/06776/Capture-5-1-1.jpg 350w,\n/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5-1-1.jpg 628w","srcWebp":"/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5-1-1.webp","srcSetWebp":"/static/28e76839a7fb382fbbe244b857f2980c/9fca7/Capture-5-1-1.webp 175w,\n/static/28e76839a7fb382fbbe244b857f2980c/37a4e/Capture-5-1-1.webp 350w,\n/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5-1-1.webp 628w","sizes":"(max-width: 628px) 100vw, 628px"}}}}},{"node":{"id":"Ghost__Post__5fa6a809a6c0f5058bff43b6","title":"Javascript Funcional II: Funciones puras, currying y aplicación parcial","slug":"javascript-funcional-ii","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2020/11/Capture-5-1.jpeg","excerpt":"Continuemos con nuestra serie de programación funcional, y en este caso\nseguiremos hablando de sus caracteristicas con Javascript.\nEn el post anterior hablamos de Inmutabilidad, una característica donde no se\nmutaban o modificaban los objetos si no que creabamos otros con los cambios\naplicados.\n\nEsto es básico por ejemplo para el caso de lo siguiente que queremos hablar que\nes Funciones puras\n\nFunciones puras\nLas funciones puras son aquellas donde los cambios que queramos hacer solo se\nproducen ","custom_excerpt":null,"visibility":"public","created_at_pretty":"7 Nov 2020","published_at_pretty":"13 Nov 2020","updated_at_pretty":"19 Jan 2021","created_at":"2020-11-07T14:58:33.000+01:00","published_at":"2020-11-13T11:21:00.000+01:00","updated_at":"2021-01-19T21:06:18.000+01:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},"tags":[{"slug":"funcional","url":"https://jlgarcia.fulldev.ninja/tag/funcional/","name":"funcional","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null},{"slug":"javascript","url":"https://jlgarcia.fulldev.ninja/tag/javascript/","name":"javascript","visibility":"public","feature_image":null,"description":null,"meta_title":null,"meta_description":null,"featureImageSharp":null}],"plaintext":"Continuemos con nuestra serie de programación funcional, y en este caso\nseguiremos hablando de sus caracteristicas con Javascript.\nEn el post anterior hablamos de Inmutabilidad, una característica donde no se\nmutaban o modificaban los objetos si no que creabamos otros con los cambios\naplicados.\n\nEsto es básico por ejemplo para el caso de lo siguiente que queremos hablar que\nes Funciones puras\n\nFunciones puras\nLas funciones puras son aquellas donde los cambios que queramos hacer solo se\nproducen dentro del scope de la función (en su interior básicamente), en ningún\ncaso modifican variables externas. Si tenemos una función que no devuelve nada,\nque usa this o que no tiene argumentos podemos empezar a sospechar que no es\npura. OJO aunque digamos que debemos cumplir este punto en la programación\nfuncional muchas veces no es posible por ejemplo en funciones de IO donde por\nejemplo trabajamos con bases de datos, pero en general debemos poder cumplir con\neste principio.\nVeamos un ejemplo del problema y como lo podemos solucionar, seguiremos la\nteoría del ejemplo anterior\n\nconst oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst addNinja = (actualNinjas, newNinja) => {\n  const ninjas = actualNinjas\n  ninjas.push(newNinja)\n  return ninjas\n}\n\nconst totalNinjas = addNinja(oldNinjas, newNinja)\n\nconsole.log(totalNinjas) // result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]\nconsole.log(oldNinjas) // result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]\n\n\nEs un ejemplo muy forzado lo sé, pero creo que se puede captar el concepto,\naunque le estemos enviando por parámetro los ninjas actuales al ser realmente\nuna referencia modificamos el valor de oldNinjas queramos o no, en este caso\nvemos como nuestra función no es pura, tiene efectos colaterales que no\ndeseamos. En este caso una posible solución podía ser esta:\n\nconst oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst addNinja = (actualNinjas, newNinja) => {\n  return actualNinjas.concat(newNinja)\n}\n\nconst totalNinjas = addNinja(oldNinjas, newNinja)\n\nconsole.log(totalNinjas) // result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]\nconsole.log(oldNinjas) // result <--[\"Ninja1\",\"Ninja2\"]\n\n\nConcat es un método de los arrays que realmente no modifica el objeto original,\nsi no que devuelve uno nuevo, con esto cumpliriamos siempre con la funcionalidad\nen cuestión y no modificamos nada que realmente no queremos. Esta solo es una\nforma de cumplir con lo que estamos buscando sé que tenemos otras muchas\nopciones esto es solo a nivel de ejemplo.\n\nVamos a por la siguiente\n\nFunciones de orden superior\nEsto viene también de la mano de las funciones como ciudadanos de primera clase,\nes decir, las funciones se pueden tratar como cualquier otra variable u objeto\ndel lenguaje y hacen uso de otras funciones.\n\nEstas características estamos usandolas habitualmente en javascript aunque puede\nque no seamos conscientes del todo, por ejemplo cuando hacemos usos de callbacks\no trabajamos con promesas ya estamos haciendo uso de estas características.\nVeamos un ejemplo sencillo que hace uso de las 2 características\n\nfunction calculator (number, operation) {\n  return operation (number)\n}\n\nconst plus2 = (number) => {\n  return number + 2\n}\n\nconst squared = (number) => {\n  return number**2\n}\n\nconst twoPlusTwo = calculator(2, plus2)\nconst threeSquared = calculator(3, squared)\n\nconsole.log(twoPlusTwo) // 4\nconsole.log(threeSquared) // 9\n\n\nComo vemos estamos pasando por parámetro las operaciones que queremos realizar y\nluego ya calculator hace uso de el directamente, creo que más o menos se\nentiende.\n\nVeamos el siguiente punto.\n\nCurrificación y aplicación parcial\nA menudo estos conceptos se separan porque puramente hablando no son lo mismo,\npero hacen uso de la misma funcionalidad realmente lo que cambia es la manera de\naplicarla.\nPara hablar de esto (y aunque no quería meterme en tecnicismos) tengo que\nintroducir el concepto de aridad. La aridad de una función básicamente es la\ncantidad de parámetros que tiene un método:\n\nfunction calculator (number, operation) // <-- aridad 2\n\n\nBien viendo lo que es la aridad ahora veamos una funcionalidad muy util que\ntenemos con javascript, que viene de la mano de la de las funciones puras. Como\nhemos comentado ya, es posible que devolvamos funciones y las recibamos por\nparámetro ¿no?... pues en esto es en lo que se basa tanto la aplicación parcial\ncomo la currificación, veamos un ejemplo primero:\n\nfunction calculator (number) {\n  return function (operation) {\n    return operation(number)\n  }\n}\n\nconst plus2 = (number) => {\n  return number + 2\n}\n\nconst squared = (number) => {\n  return number**2\n}\n\nconst baseNumber = calculator(2)\n\nconsole.log(baseNumber) // function (operation) { return operation(number); }\n\nconst twoPlusTwo = baseNumber(plus2)\nconst twoSquared = baseNumber(squared)\n\nconsole.log(twoPlusTwo) // 4\nconsole.log(twoSquared) // 4\n\n\n\nLo importante ahora mismo es la función calculator, como vemos lo primero que\nhace la función es devolver otra función, si nos fijamos en el console.log de \nbaseNumber vemos como realmente es una función que espera una operación y\nsimplemente lo que tenemos es ya un número preparado para realizar la operación.\n\nVisto esto veamos lo que es aplicación parcial con un ejemplo\n\nconst createPlayer = (name, health) => (weapon) => {\n  return {\n    name,\n    health,\n    weapon\n  }\n}\n\nconst playerBase = createPlayer('DevNinja', 1000)\n\nconst availableWeapons = ['SuperGun', 'Katana', 'Smoke Grenade']\n\nconst playerWeapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n\nconst player1 = playerBase(playerWeapon)\n\nconsole.log(player1) // { name:\"DevNinja\", health:1000, weapon:\"Katana\" }\n\n\nVuelvo a comentar que esto es un poco forzado, pero nos vale para el concepto.\nSi nos fijamos ahora usamos arrow functions que son más comodas para hacer estas\ncosas.\nPues bien en este caso createPlayer lo primero recibe el nombre y el valor de\nsalud y se queda \"a la espera\" de que el sistema le aplique un arma al jugador,\nesto es lo que seria la aplicación parcial, podemos definirlo como una ejecución\nde una función por pasos, pero como vemos en este caso tenemos una aridad\ninicial de 2 y luego de 1, esta situación de aridad es la diferencia principal\nentre aplicación parcial y currificación. La currificación tendría siempre\naridad 1, es decir:\n\nconst createPlayer = (name) => (health) => (weapon) => {\n  return {\n    name,\n    health,\n    weapon\n  }\n}\n\nconst playerBase = createPlayer('DevNinja')\n\nconst playerHealh = Math.floor(Math.random() * 1000)\nconst playerWithInitialHealh = playerBase(playerHealh)\n\nconst availableWeapons = ['SuperGun', 'Katana', 'Smoke Grenade']\nconst playerWeapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n\nconst player1 = playerWithInitialHealh(playerWeapon)\n\nconsole.log(player1) // { name:\"DevNinja\", health:428, weapon:\"Smoke Grenade\" }\n\n\nAhora tenemos que siempre trabajamos con una aridad de 1, lo que modulariza\nbastante el uso de nuestro método createPlayer, haciendo posible que hagamos\ncualquier operación entre cada paso de la función.\n\nBueno creo que más o menos se entienden estos conceptos, voy un poco rápido con\nesto porque existen multitud de ejemplos y explicaciones al respecto por\ninternet, si algo no esta claro recomiendo investigar un poco más, en esta serie\nnos detendremos un poco en conceptos más complejos como los functores y las\nmonadas que son algo más duros para entenderlos.\n\nNos vemos en el siguiente donde hablaremos de la Composición de funciones un\nabrazoooooo Ninjaaas","html":"<!--kg-card-begin: markdown--><p>Continuemos con nuestra serie de programación funcional, y en este caso seguiremos hablando de sus caracteristicas con Javascript.<br>\nEn el post anterior hablamos de <strong>Inmutabilidad</strong>, una característica donde no se mutaban o modificaban los objetos si no que creabamos otros con los cambios aplicados.</p>\n<p>Esto es básico por ejemplo para el caso de lo siguiente que queremos hablar que es <strong>Funciones puras</strong></p>\n<h2 id=\"funcionespuras\">Funciones puras</h2>\n<p>Las funciones puras son aquellas donde los cambios que queramos hacer solo se producen dentro del <em>scope</em> de la función (en su interior básicamente), en ningún caso modifican variables externas. Si tenemos una función que no devuelve nada, que usa <em>this</em> o que no tiene argumentos podemos empezar a sospechar que no es pura. OJO aunque digamos que debemos cumplir este punto en la programación funcional muchas veces no es posible por ejemplo en funciones de IO donde por ejemplo trabajamos con bases de datos, pero en general debemos poder cumplir con este principio.<br>\nVeamos un ejemplo del problema y como lo podemos solucionar, seguiremos la teoría del ejemplo anterior</p>\n<pre><code class=\"language-javascript\">const oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst addNinja = (actualNinjas, newNinja) =&gt; {\n  const ninjas = actualNinjas\n  ninjas.push(newNinja)\n  return ninjas\n}\n\nconst totalNinjas = addNinja(oldNinjas, newNinja)\n\nconsole.log(totalNinjas) // result &lt;--[&quot;Ninja1&quot;,&quot;Ninja2&quot;,&quot;Ninja3&quot;]\nconsole.log(oldNinjas) // result &lt;--[&quot;Ninja1&quot;,&quot;Ninja2&quot;,&quot;Ninja3&quot;]\n</code></pre>\n<p>Es un ejemplo muy forzado lo sé, pero creo que se puede captar el concepto, aunque le estemos enviando por parámetro los ninjas actuales al ser realmente una referencia modificamos el valor de <em>oldNinjas</em> queramos o no, en este caso vemos como nuestra función <strong>no es pura</strong>, tiene efectos colaterales que no deseamos. En este caso una posible solución podía ser esta:</p>\n<pre><code class=\"language-javascript\">const oldNinjas = ['Ninja1', 'Ninja2']\nconst newNinja = 'Ninja3'\n\nconst addNinja = (actualNinjas, newNinja) =&gt; {\n  return actualNinjas.concat(newNinja)\n}\n\nconst totalNinjas = addNinja(oldNinjas, newNinja)\n\nconsole.log(totalNinjas) // result &lt;--[&quot;Ninja1&quot;,&quot;Ninja2&quot;,&quot;Ninja3&quot;]\nconsole.log(oldNinjas) // result &lt;--[&quot;Ninja1&quot;,&quot;Ninja2&quot;]\n</code></pre>\n<p>Concat es un método de los arrays que realmente no modifica el objeto original, si no que devuelve uno nuevo, con esto cumpliriamos siempre con la funcionalidad en cuestión y no modificamos nada que realmente no queremos. Esta solo es una forma de cumplir con lo que estamos buscando sé que tenemos otras muchas opciones esto es solo a nivel de ejemplo.</p>\n<p>Vamos a por la siguiente</p>\n<h2 id=\"funcionesdeordensuperior\">Funciones de orden superior</h2>\n<p>Esto viene también de la mano de las <strong>funciones como ciudadanos de primera clase</strong>, es decir, las funciones se pueden tratar como cualquier otra variable u objeto del lenguaje y hacen uso de otras funciones.</p>\n<p>Estas características estamos usandolas habitualmente en javascript aunque puede que no seamos conscientes del todo, por ejemplo cuando hacemos usos de callbacks o trabajamos con promesas ya estamos haciendo uso de estas características. Veamos un ejemplo sencillo que hace uso de las 2 características</p>\n<pre><code class=\"language-javascript\">function calculator (number, operation) {\n  return operation (number)\n}\n\nconst plus2 = (number) =&gt; {\n  return number + 2\n}\n\nconst squared = (number) =&gt; {\n  return number**2\n}\n\nconst twoPlusTwo = calculator(2, plus2)\nconst threeSquared = calculator(3, squared)\n\nconsole.log(twoPlusTwo) // 4\nconsole.log(threeSquared) // 9\n</code></pre>\n<p>Como vemos estamos pasando por parámetro las operaciones que queremos realizar y luego ya <em>calculator</em> hace uso de el directamente, creo que más o menos se entiende.</p>\n<p>Veamos el siguiente punto.</p>\n<h2 id=\"currificacinyaplicacinparcial\">Currificación y aplicación parcial</h2>\n<p>A menudo estos conceptos se separan porque puramente hablando no son lo mismo, pero hacen uso de la misma funcionalidad realmente lo que cambia es la manera de aplicarla.<br>\nPara hablar de esto (y aunque no quería meterme en tecnicismos) tengo que introducir el concepto de <em>aridad</em>. La aridad de una función básicamente es la cantidad de parámetros que tiene un método:</p>\n<pre><code class=\"language-javascript\">function calculator (number, operation) // &lt;-- aridad 2\n</code></pre>\n<p>Bien viendo lo que es la aridad ahora veamos una funcionalidad muy util que tenemos con javascript, que viene de la mano de la de las funciones puras. Como hemos comentado ya, es posible que devolvamos funciones y las recibamos por parámetro ¿no?... pues en esto es en lo que se basa tanto la aplicación parcial como la currificación, veamos un ejemplo primero:</p>\n<pre><code class=\"language-javascript\">function calculator (number) {\n  return function (operation) {\n    return operation(number)\n  }\n}\n\nconst plus2 = (number) =&gt; {\n  return number + 2\n}\n\nconst squared = (number) =&gt; {\n  return number**2\n}\n\nconst baseNumber = calculator(2)\n\nconsole.log(baseNumber) // function (operation) { return operation(number); }\n\nconst twoPlusTwo = baseNumber(plus2)\nconst twoSquared = baseNumber(squared)\n\nconsole.log(twoPlusTwo) // 4\nconsole.log(twoSquared) // 4\n\n</code></pre>\n<p>Lo importante ahora mismo es la función <em>calculator</em>, como vemos lo primero que hace la función es devolver otra función, si nos fijamos en el console.log de <em>baseNumber</em> vemos como realmente es una función que espera una operación y simplemente lo que tenemos es ya un número preparado para realizar la operación.</p>\n<p>Visto esto veamos lo que es aplicación parcial con un ejemplo</p>\n<pre><code class=\"language-javascript\">const createPlayer = (name, health) =&gt; (weapon) =&gt; {\n  return {\n    name,\n    health,\n    weapon\n  }\n}\n\nconst playerBase = createPlayer('DevNinja', 1000)\n\nconst availableWeapons = ['SuperGun', 'Katana', 'Smoke Grenade']\n\nconst playerWeapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n\nconst player1 = playerBase(playerWeapon)\n\nconsole.log(player1) // { name:&quot;DevNinja&quot;, health:1000, weapon:&quot;Katana&quot; }\n</code></pre>\n<p>Vuelvo a comentar que esto es un poco forzado, pero nos vale para el concepto. Si nos fijamos ahora usamos arrow functions que son más comodas para hacer estas cosas.<br>\nPues bien en este caso <em>createPlayer</em> lo primero recibe el nombre y el valor de salud y se queda &quot;a la espera&quot; de que el sistema le aplique un arma al jugador, esto es lo que seria la aplicación parcial, podemos definirlo como una ejecución de una función por pasos, pero como vemos en este caso tenemos una aridad inicial de 2 y luego de 1, esta situación de aridad es la diferencia principal entre aplicación parcial y currificación. La currificación tendría siempre aridad 1, es decir:</p>\n<pre><code class=\"language-javascript\">const createPlayer = (name) =&gt; (health) =&gt; (weapon) =&gt; {\n  return {\n    name,\n    health,\n    weapon\n  }\n}\n\nconst playerBase = createPlayer('DevNinja')\n\nconst playerHealh = Math.floor(Math.random() * 1000)\nconst playerWithInitialHealh = playerBase(playerHealh)\n\nconst availableWeapons = ['SuperGun', 'Katana', 'Smoke Grenade']\nconst playerWeapon = availableWeapons[Math.floor(Math.random() * availableWeapons.length)]\n\nconst player1 = playerWithInitialHealh(playerWeapon)\n\nconsole.log(player1) // { name:&quot;DevNinja&quot;, health:428, weapon:&quot;Smoke Grenade&quot; }\n</code></pre>\n<p>Ahora tenemos que siempre trabajamos con una aridad de 1, lo que modulariza bastante el uso de nuestro método <em>createPlayer</em>, haciendo posible que hagamos cualquier operación entre cada paso de la función.</p>\n<p>Bueno creo que más o menos se entienden estos conceptos, voy un poco rápido con esto porque existen multitud de ejemplos y explicaciones al respecto por internet, si algo no esta claro recomiendo investigar un poco más, en esta serie nos detendremos un poco en conceptos más complejos como los <em>functores y las monadas</em> que son algo más duros para entenderlos.</p>\n<p>Nos vemos en el siguiente donde hablaremos de la <strong>Composición de funciones</strong> un abrazoooooo Ninjaaas</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/javascript-funcional-ii/","canonical_url":null,"uuid":"50216406-174a-4591-ab2f-93174b039636","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5fa6a809a6c0f5058bff43b6","reading_time":4,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Continuemos con nuestra serie de programación funcional, y en este caso seguiremos hablando de sus caracteristicas con Javascript.<br>\nEn el post anterior hablamos de <strong>Inmutabilidad</strong>, una característica donde no se mutaban o modificaban los objetos si no que creabamos otros con los cambios aplicados.</p>\n<p>Esto es básico por ejemplo para el caso de lo siguiente que queremos hablar que es <strong>Funciones puras</strong></p>\n<h2 id=\"funcionespuras\">Funciones puras</h2>\n<p>Las funciones puras son aquellas donde los cambios que queramos hacer solo se producen dentro del <em>scope</em> de la función (en su interior básicamente), en ningún caso modifican variables externas. Si tenemos una función que no devuelve nada, que usa <em>this</em> o que no tiene argumentos podemos empezar a sospechar que no es pura. OJO aunque digamos que debemos cumplir este punto en la programación funcional muchas veces no es posible por ejemplo en funciones de IO donde por ejemplo trabajamos con bases de datos, pero en general debemos poder cumplir con este principio.<br>\nVeamos un ejemplo del problema y como lo podemos solucionar, seguiremos la teoría del ejemplo anterior</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> oldNinjas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Ninja1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ninja2'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> newNinja <span class=\"token operator\">=</span> <span class=\"token string\">'Ninja3'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">addNinja</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">actualNinjas<span class=\"token punctuation\">,</span> newNinja</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> ninjas <span class=\"token operator\">=</span> actualNinjas\n  ninjas<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>newNinja<span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">return</span> ninjas\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> totalNinjas <span class=\"token operator\">=</span> <span class=\"token function\">addNinja</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">,</span> newNinja<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>totalNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result &#x3C;--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result &#x3C;--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]</span>\n</code></pre></div>\n<p>Es un ejemplo muy forzado lo sé, pero creo que se puede captar el concepto, aunque le estemos enviando por parámetro los ninjas actuales al ser realmente una referencia modificamos el valor de <em>oldNinjas</em> queramos o no, en este caso vemos como nuestra función <strong>no es pura</strong>, tiene efectos colaterales que no deseamos. En este caso una posible solución podía ser esta:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> oldNinjas <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'Ninja1'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Ninja2'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> newNinja <span class=\"token operator\">=</span> <span class=\"token string\">'Ninja3'</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">addNinja</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">actualNinjas<span class=\"token punctuation\">,</span> newNinja</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> actualNinjas<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span>newNinja<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> totalNinjas <span class=\"token operator\">=</span> <span class=\"token function\">addNinja</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">,</span> newNinja<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>totalNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result &#x3C;--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>oldNinjas<span class=\"token punctuation\">)</span> <span class=\"token comment\">// result &#x3C;--[\"Ninja1\",\"Ninja2\"]</span>\n</code></pre></div>\n<p>Concat es un método de los arrays que realmente no modifica el objeto original, si no que devuelve uno nuevo, con esto cumpliriamos siempre con la funcionalidad en cuestión y no modificamos nada que realmente no queremos. Esta solo es una forma de cumplir con lo que estamos buscando sé que tenemos otras muchas opciones esto es solo a nivel de ejemplo.</p>\n<p>Vamos a por la siguiente</p>\n<h2 id=\"funcionesdeordensuperior\">Funciones de orden superior</h2>\n<p>Esto viene también de la mano de las <strong>funciones como ciudadanos de primera clase</strong>, es decir, las funciones se pueden tratar como cualquier otra variable u objeto del lenguaje y hacen uso de otras funciones.</p>\n<p>Estas características estamos usandolas habitualmente en javascript aunque puede que no seamos conscientes del todo, por ejemplo cuando hacemos usos de callbacks o trabajamos con promesas ya estamos haciendo uso de estas características. Veamos un ejemplo sencillo que hace uso de las 2 características</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculator</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number<span class=\"token punctuation\">,</span> operation</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">operation</span> <span class=\"token punctuation\">(</span>number<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">plus2</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> number <span class=\"token operator\">+</span> <span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">squared</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> number<span class=\"token operator\">**</span><span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> twoPlusTwo <span class=\"token operator\">=</span> <span class=\"token function\">calculator</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> plus2<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> threeSquared <span class=\"token operator\">=</span> <span class=\"token function\">calculator</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">,</span> squared<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>twoPlusTwo<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 4</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>threeSquared<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 9</span>\n</code></pre></div>\n<p>Como vemos estamos pasando por parámetro las operaciones que queremos realizar y luego ya <em>calculator</em> hace uso de el directamente, creo que más o menos se entiende.</p>\n<p>Veamos el siguiente punto.</p>\n<h2 id=\"currificacinyaplicacinparcial\">Currificación y aplicación parcial</h2>\n<p>A menudo estos conceptos se separan porque puramente hablando no son lo mismo, pero hacen uso de la misma funcionalidad realmente lo que cambia es la manera de aplicarla.<br>\nPara hablar de esto (y aunque no quería meterme en tecnicismos) tengo que introducir el concepto de <em>aridad</em>. La aridad de una función básicamente es la cantidad de parámetros que tiene un método:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculator</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number<span class=\"token punctuation\">,</span> operation</span><span class=\"token punctuation\">)</span> <span class=\"token comment\">// &#x3C;-- aridad 2</span>\n</code></pre></div>\n<p>Bien viendo lo que es la aridad ahora veamos una funcionalidad muy util que tenemos con javascript, que viene de la mano de la de las funciones puras. Como hemos comentado ya, es posible que devolvamos funciones y las recibamos por parámetro ¿no?... pues en esto es en lo que se basa tanto la aplicación parcial como la currificación, veamos un ejemplo primero:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">calculator</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">operation</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">operation</span><span class=\"token punctuation\">(</span>number<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">plus2</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> number <span class=\"token operator\">+</span> <span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> <span class=\"token function-variable function\">squared</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">number</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> number<span class=\"token operator\">**</span><span class=\"token number\">2</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> baseNumber <span class=\"token operator\">=</span> <span class=\"token function\">calculator</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>baseNumber<span class=\"token punctuation\">)</span> <span class=\"token comment\">// function (operation) { return operation(number); }</span>\n\n<span class=\"token keyword\">const</span> twoPlusTwo <span class=\"token operator\">=</span> <span class=\"token function\">baseNumber</span><span class=\"token punctuation\">(</span>plus2<span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> twoSquared <span class=\"token operator\">=</span> <span class=\"token function\">baseNumber</span><span class=\"token punctuation\">(</span>squared<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>twoPlusTwo<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 4</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>twoSquared<span class=\"token punctuation\">)</span> <span class=\"token comment\">// 4</span>\n\n</code></pre></div>\n<p>Lo importante ahora mismo es la función <em>calculator</em>, como vemos lo primero que hace la función es devolver otra función, si nos fijamos en el console.log de <em>baseNumber</em> vemos como realmente es una función que espera una operación y simplemente lo que tenemos es ya un número preparado para realizar la operación.</p>\n<p>Visto esto veamos lo que es aplicación parcial con un ejemplo</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">createPlayer</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name<span class=\"token punctuation\">,</span> health</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">weapon</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">,</span>\n    health<span class=\"token punctuation\">,</span>\n    weapon\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> playerBase <span class=\"token operator\">=</span> <span class=\"token function\">createPlayer</span><span class=\"token punctuation\">(</span><span class=\"token string\">'DevNinja'</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> availableWeapons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'SuperGun'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Katana'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Smoke Grenade'</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">const</span> playerWeapon <span class=\"token operator\">=</span> availableWeapons<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availableWeapons<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">const</span> player1 <span class=\"token operator\">=</span> <span class=\"token function\">playerBase</span><span class=\"token punctuation\">(</span>playerWeapon<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>player1<span class=\"token punctuation\">)</span> <span class=\"token comment\">// { name:\"DevNinja\", health:1000, weapon:\"Katana\" }</span>\n</code></pre></div>\n<p>Vuelvo a comentar que esto es un poco forzado, pero nos vale para el concepto. Si nos fijamos ahora usamos arrow functions que son más comodas para hacer estas cosas.<br>\nPues bien en este caso <em>createPlayer</em> lo primero recibe el nombre y el valor de salud y se queda \"a la espera\" de que el sistema le aplique un arma al jugador, esto es lo que seria la aplicación parcial, podemos definirlo como una ejecución de una función por pasos, pero como vemos en este caso tenemos una aridad inicial de 2 y luego de 1, esta situación de aridad es la diferencia principal entre aplicación parcial y currificación. La currificación tendría siempre aridad 1, es decir:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token function-variable function\">createPlayer</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">name</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">health</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">weapon</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n    name<span class=\"token punctuation\">,</span>\n    health<span class=\"token punctuation\">,</span>\n    weapon\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">const</span> playerBase <span class=\"token operator\">=</span> <span class=\"token function\">createPlayer</span><span class=\"token punctuation\">(</span><span class=\"token string\">'DevNinja'</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> playerHealh <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">const</span> playerWithInitialHealh <span class=\"token operator\">=</span> <span class=\"token function\">playerBase</span><span class=\"token punctuation\">(</span>playerHealh<span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">const</span> availableWeapons <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'SuperGun'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Katana'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Smoke Grenade'</span><span class=\"token punctuation\">]</span>\n<span class=\"token keyword\">const</span> playerWeapon <span class=\"token operator\">=</span> availableWeapons<span class=\"token punctuation\">[</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>Math<span class=\"token punctuation\">.</span><span class=\"token function\">random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> availableWeapons<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span>\n\n<span class=\"token keyword\">const</span> player1 <span class=\"token operator\">=</span> <span class=\"token function\">playerWithInitialHealh</span><span class=\"token punctuation\">(</span>playerWeapon<span class=\"token punctuation\">)</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>player1<span class=\"token punctuation\">)</span> <span class=\"token comment\">// { name:\"DevNinja\", health:428, weapon:\"Smoke Grenade\" }</span>\n</code></pre></div>\n<p>Ahora tenemos que siempre trabajamos con una aridad de 1, lo que modulariza bastante el uso de nuestro método <em>createPlayer</em>, haciendo posible que hagamos cualquier operación entre cada paso de la función.</p>\n<p>Bueno creo que más o menos se entienden estos conceptos, voy un poco rápido con esto porque existen multitud de ejemplos y explicaciones al respecto por internet, si algo no esta claro recomiendo investigar un poco más, en esta serie nos detendremos un poco en conceptos más complejos como los <em>functores y las monadas</em> que son algo más duros para entenderlos.</p>\n<p>Nos vemos en el siguiente donde hablaremos de la <strong>Composición de funciones</strong> un abrazoooooo Ninjaaas</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Continuemos con nuestra serie de programación funcional, y en este caso seguiremos hablando de sus caracteristicas con Javascript."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn el post anterior hablamos de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Inmutabilidad"}]},{"type":"text","value":", una característica donde no se mutaban o modificaban los objetos si no que creabamos otros con los cambios aplicados."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto es básico por ejemplo para el caso de lo siguiente que queremos hablar que es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Funciones puras"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"funcionespuras"},"children":[{"type":"text","value":"Funciones puras"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Las funciones puras son aquellas donde los cambios que queramos hacer solo se producen dentro del "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scope"}]},{"type":"text","value":" de la función (en su interior básicamente), en ningún caso modifican variables externas. Si tenemos una función que no devuelve nada, que usa "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":" o que no tiene argumentos podemos empezar a sospechar que no es pura. OJO aunque digamos que debemos cumplir este punto en la programación funcional muchas veces no es posible por ejemplo en funciones de IO donde por ejemplo trabajamos con bases de datos, pero en general debemos poder cumplir con este principio."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVeamos un ejemplo del problema y como lo podemos solucionar, seguiremos la teoría del ejemplo anterior"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" oldNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja1'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja2'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newNinja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja3'"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"addNinja"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"actualNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" newNinja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" ninjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" actualNinjas\n  ninjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"push"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" ninjas\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" totalNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"addNinja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"totalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Es un ejemplo muy forzado lo sé, pero creo que se puede captar el concepto, aunque le estemos enviando por parámetro los ninjas actuales al ser realmente una referencia modificamos el valor de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"oldNinjas"}]},{"type":"text","value":" queramos o no, en este caso vemos como nuestra función "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"no es pura"}]},{"type":"text","value":", tiene efectos colaterales que no deseamos. En este caso una posible solución podía ser esta:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" oldNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja1'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja2'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" newNinja "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Ninja3'"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"addNinja"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"actualNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" newNinja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" actualNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"concat"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" totalNinjas "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"addNinja"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" newNinja"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"totalNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result <--[\"Ninja1\",\"Ninja2\",\"Ninja3\"]"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"oldNinjas"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// result <--[\"Ninja1\",\"Ninja2\"]"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Concat es un método de los arrays que realmente no modifica el objeto original, si no que devuelve uno nuevo, con esto cumpliriamos siempre con la funcionalidad en cuestión y no modificamos nada que realmente no queremos. Esta solo es una forma de cumplir con lo que estamos buscando sé que tenemos otras muchas opciones esto es solo a nivel de ejemplo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a por la siguiente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"funcionesdeordensuperior"},"children":[{"type":"text","value":"Funciones de orden superior"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto viene también de la mano de las "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"funciones como ciudadanos de primera clase"}]},{"type":"text","value":", es decir, las funciones se pueden tratar como cualquier otra variable u objeto del lenguaje y hacen uso de otras funciones."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estas características estamos usandolas habitualmente en javascript aunque puede que no seamos conscientes del todo, por ejemplo cuando hacemos usos de callbacks o trabajamos con promesas ya estamos haciendo uso de estas características. Veamos un ejemplo sencillo que hace uso de las 2 características"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" operation"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"operation"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"number"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"plus2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" number "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"squared"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" number"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" twoPlusTwo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" plus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" threeSquared "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"3"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" squared"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"twoPlusTwo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// 4"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"threeSquared"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// 9"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos estamos pasando por parámetro las operaciones que queremos realizar y luego ya "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"calculator"}]},{"type":"text","value":" hace uso de el directamente, creo que más o menos se entiende."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos el siguiente punto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"currificacinyaplicacinparcial"},"children":[{"type":"text","value":"Currificación y aplicación parcial"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A menudo estos conceptos se separan porque puramente hablando no son lo mismo, pero hacen uso de la misma funcionalidad realmente lo que cambia es la manera de aplicarla."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPara hablar de esto (y aunque no quería meterme en tecnicismos) tengo que introducir el concepto de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"aridad"}]},{"type":"text","value":". La aridad de una función básicamente es la cantidad de parámetros que tiene un método:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" operation"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// <-- aridad 2"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien viendo lo que es la aridad ahora veamos una funcionalidad muy util que tenemos con javascript, que viene de la mano de la de las funciones puras. Como hemos comentado ya, es posible que devolvamos funciones y las recibamos por parámetro ¿no?... pues en esto es en lo que se basa tanto la aplicación parcial como la currificación, veamos un ejemplo primero:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"function"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"operation"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"operation"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"number"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"plus2"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" number "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"+"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"squared"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"number"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" number"},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"**"}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" baseNumber "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"calculator"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"2"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"baseNumber"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// function (operation) { return operation(number); }"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" twoPlusTwo "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"baseNumber"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"plus2"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" twoSquared "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"baseNumber"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"squared"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"twoPlusTwo"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// 4"}]},{"type":"text","value":"\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"twoSquared"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// 4"}]},{"type":"text","value":"\n\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo importante ahora mismo es la función "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"calculator"}]},{"type":"text","value":", como vemos lo primero que hace la función es devolver otra función, si nos fijamos en el console.log de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"baseNumber"}]},{"type":"text","value":" vemos como realmente es una función que espera una operación y simplemente lo que tenemos es ya un número preparado para realizar la operación."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Visto esto veamos lo que es aplicación parcial con un ejemplo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"createPlayer"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"name"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" health"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"weapon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    name"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    health"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    weapon\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerBase "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createPlayer"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'DevNinja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availableWeapons "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'SuperGun'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Katana'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Smoke Grenade'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerWeapon "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" player1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"playerBase"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"playerWeapon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"player1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// { name:\"DevNinja\", health:1000, weapon:\"Katana\" }"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vuelvo a comentar que esto es un poco forzado, pero nos vale para el concepto. Si nos fijamos ahora usamos arrow functions que son más comodas para hacer estas cosas."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPues bien en este caso "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"createPlayer"}]},{"type":"text","value":" lo primero recibe el nombre y el valor de salud y se queda \"a la espera\" de que el sistema le aplique un arma al jugador, esto es lo que seria la aplicación parcial, podemos definirlo como una ejecución de una función por pasos, pero como vemos en este caso tenemos una aridad inicial de 2 y luego de 1, esta situación de aridad es la diferencia principal entre aplicación parcial y currificación. La currificación tendría siempre aridad 1, es decir:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"javascript"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-javascript"]},"children":[{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function-variable","function"]},"children":[{"type":"text","value":"createPlayer"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"name"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"health"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","parameter"]},"children":[{"type":"text","value":"weapon"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"=>"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n  "},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"return"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"{"}]},{"type":"text","value":"\n    name"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    health"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":"\n    weapon\n  "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"}"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerBase "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"createPlayer"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'DevNinja'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerHealh "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","number"]},"children":[{"type":"text","value":"1000"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerWithInitialHealh "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"playerBase"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"playerHealh"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" availableWeapons "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'SuperGun'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Katana'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":","}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","string"]},"children":[{"type":"text","value":"'Smoke Grenade'"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" playerWeapon "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"["}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"floor"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"Math"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"random"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"*"}]},{"type":"text","value":" availableWeapons"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"text","value":"length"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"]"}]},{"type":"text","value":"\n\n"},{"type":"element","tagName":"span","properties":{"className":["token","keyword"]},"children":[{"type":"text","value":"const"}]},{"type":"text","value":" player1 "},{"type":"element","tagName":"span","properties":{"className":["token","operator"]},"children":[{"type":"text","value":"="}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"playerWithInitialHealh"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"playerWeapon"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":"\n\nconsole"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"."}]},{"type":"element","tagName":"span","properties":{"className":["token","function"]},"children":[{"type":"text","value":"log"}]},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":"("}]},{"type":"text","value":"player1"},{"type":"element","tagName":"span","properties":{"className":["token","punctuation"]},"children":[{"type":"text","value":")"}]},{"type":"text","value":" "},{"type":"element","tagName":"span","properties":{"className":["token","comment"]},"children":[{"type":"text","value":"// { name:\"DevNinja\", health:428, weapon:\"Smoke Grenade\" }"}]},{"type":"text","value":"\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora tenemos que siempre trabajamos con una aridad de 1, lo que modulariza bastante el uso de nuestro método "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"createPlayer"}]},{"type":"text","value":", haciendo posible que hagamos cualquier operación entre cada paso de la función."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno creo que más o menos se entienden estos conceptos, voy un poco rápido con esto porque existen multitud de ejemplos y explicaciones al respecto por internet, si algo no esta claro recomiendo investigar un poco más, en esta serie nos detendremos un poco en conceptos más complejos como los "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"functores y las monadas"}]},{"type":"text","value":" que son algo más duros para entenderlos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos vemos en el siguiente donde hablaremos de la "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Composición de funciones"}]},{"type":"text","value":" un abrazoooooo Ninjaaas"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"funcionespuras","heading":"Funciones puras"},{"id":"funcionesdeordensuperior","heading":"Funciones de orden superior"},{"id":"currificacinyaplicacinparcial","heading":"Currificación y aplicación parcial"}]},"featureImageSharp":{"base":"Capture-5-1.jpeg","publicURL":"/static/28e76839a7fb382fbbe244b857f2980c/Capture-5-1.jpeg","imageMeta":{"width":628,"height":263},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAMG/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABz9giD//EABcQAQADAAAAAAAAAAAAAAAAAAADERL/2gAIAQEAAQUCS4t//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEQEv/aAAgBAQAGPwIWJ//EABkQAAIDAQAAAAAAAAAAAAAAAAERACFREP/aAAgBAQABPyGERsI0r3n/2gAMAwEAAgADAAAAEHAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAIDAQAAAAAAAAAAAAAAASExABARUf/aAAgBAQABPxDERjkbBCDxvX//2Q==","aspectRatio":2.3972602739726026,"src":"/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5-1.jpg","srcSet":"/static/28e76839a7fb382fbbe244b857f2980c/477ba/Capture-5-1.jpg 175w,\n/static/28e76839a7fb382fbbe244b857f2980c/06776/Capture-5-1.jpg 350w,\n/static/28e76839a7fb382fbbe244b857f2980c/fc145/Capture-5-1.jpg 628w","srcWebp":"/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5-1.webp","srcSetWebp":"/static/28e76839a7fb382fbbe244b857f2980c/9fca7/Capture-5-1.webp 175w,\n/static/28e76839a7fb382fbbe244b857f2980c/37a4e/Capture-5-1.webp 350w,\n/static/28e76839a7fb382fbbe244b857f2980c/09ccc/Capture-5-1.webp 628w","sizes":"(max-width: 628px) 100vw, 628px"}}}}}]}},"pageContext":{"slug":"javascript-funcional-intro","prev":"js-algoritmos-y-estructurdas","next":"mongodb-ninja-iv-index-ninja-2-0","tag":"funcional","limit":3,"skip":0,"primaryTagCount":3,"collectionPaths":{}}},
    "staticQueryHashes": ["1272700106","1676991999","2138873178","2546165603","2681841279","2938721187","293880488","3052966952","4156497161"]}