{
    "componentChunkName": "component---node-modules-gatsby-theme-try-ghost-src-templates-post-js",
    "path": "/mongodb-ninja-ii-queries/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__5a338158333e0f134c248f42","title":"MongoDB Ninja(II): Queries & Performance","slug":"mongodb-ninja-ii-queries","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/MongoBanner-1.png","excerpt":"Ahora hablaremos sobre las queries o busquedas que podemos hacer en Mongo, este\npost puede que sea algo más corto que el anterior, pero prefería poner esta\nparte un poco por separado.\n\nAntes de empezar quiero comentar algunos conceptos similares entre las bases de\ndatos relacionales y MongoDB pero que quizás tienen distinto nombre:\n\n * Database: O base de datos en relacional es lo mismo en MongoDB.\n * Table: O tabla en relacional en Mongo es Colección.\n * Row: O fila en relacional en Mongo es Do","custom_excerpt":null,"visibility":"public","created_at_pretty":"14 Oct 2017","published_at_pretty":"24 Oct 2017","updated_at_pretty":"18 Jan 2018","created_at":"2017-10-14T13:22:30.000+02:00","published_at":"2017-10-24T10:21:00.000+02:00","updated_at":"2018-01-18T15:07:14.000+01:00","meta_title":"MongoDB Ninja(II): Queries & Performance","meta_description":"Veamos algunos tipos de búsquedas que podemos hacer en MongoDB y como podemos optimizarlas.","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":"Ahora hablaremos sobre las queries o busquedas que podemos hacer en Mongo, este\npost puede que sea algo más corto que el anterior, pero prefería poner esta\nparte un poco por separado.\n\nAntes de empezar quiero comentar algunos conceptos similares entre las bases de\ndatos relacionales y MongoDB pero que quizás tienen distinto nombre:\n\n * Database: O base de datos en relacional es lo mismo en MongoDB.\n * Table: O tabla en relacional en Mongo es Colección.\n * Row: O fila en relacional en Mongo es Document/Documento.\n * index: O indice en relacional es lo mismo en MongoDB.\n * Join: Como se conoce en relacional en Mongo es Lookup\n * Foreign Key: En Mongo se conoce como Reference/Referencia.\n * Transacciones: En Mongo existen como transacciones de un unico documento. En\n   relacional son necesarias las transacciones porque tenemos datos que\n   modificar en multiples tablas, sin embargo, en Mongo toda la información que\n   hace referencia a un objeto esta siempre en un unico documento, pensar que\n   más o menos los datos se guardan al estilo JSON, es decir esta todo dentro de\n   un mismo objeto.\n\nPrimero de todo vamos a crearnos de nuevo nuestra base de datos ya que la\neliminamos en el post anterior\n\nuse ninjas\n\n\nY vamos a crearnos 3 elementos o documentos en ella\n\ndb.heros.insert({name: \"Batman\", money: 1000000})\ndb.heros.insert({name: \"Iron Man\", money: 5000000})\ndb.heros.insert({name: \"Black Panther\", money: 10000000})\n\n\nCon esto ya tendríamos los 3 creados\n\n\n\nYa vimos como hacer algún filtro básico al estilo, buscame por el nombre X\n\ndb.heros.find({name: \"Iron Man\"})\n\n\n\n\nTambién podemos usar expresiones regulares directamente, imaginemos que queremos\nque nos muestre todos los elementos que tienen Man o man en su campo name\n\ndb.heros.find({name: /[Mm]an/})\n\n\nEsto nos devuelve tanto a Batman como Iron Man\n\n\n\nPodemos limitar o ignorar la cantidad de datos que queremos. Con limit/skip y la\ncantidad de elementos\n\ndb.heros.find().limit(1)\ndb.heros.find().skip(1)\n\n\nPero, ¿y si queremos buscar por dos nombres distintos?...pués para ello usamos \n$in y le pasamos un array con las opciones\n\ndb.heros.find({name: {$in:[\"Batman\",\"Black Panther\"]}})\n\n\n\n(tenemos tambien la opción $nin para indicarle que no sea distinto a lo que le\nindicamos)\n\nAcabamos de ver un ejemplo buscando dentro de la misma propiedad, pero ¿y para\nbuscar en propiedades distintas?...tenemos un $or muy bonito para ello, al cual\nle pasamos un array con las propiedades que queremos buscar\n\ndb.heros.find({$or:[{name: \"Black Panther\"},{money: 5000000}]})\n\n\nSin problemas nos encuentra lo que buscamos\n\n\n\nHasta el momento hemos realizado búsquedas exactas, es decir, buscábamos por\nelementos coincidentes 100%, pero no siempre sabemos el número exacto de\nalgo....veamos como podemos realizar búsquedas que cumplan algún tipo de\ncondición, por ejemplo hagamos que nos encuentre todos los elementos que su\npropiedad money sea superior a 5000000\n\ndb.heros.find({money: {$gt:5000000}})\n\n\nNos devuelve solo a Black Panther\n\n\n\nComo os podéis imaginar el $gt es de greather than y al igual que greather than,\ntenemos less than (lt), greather than or equal (gte) o less than equal (lte).\nProbemos el gte\n\ndb.heros.find({money: {$gte:5000000}})\n\n\nAhora nos devuelve también a Iron Man\n\n\n\nTodas estas formas de buscar se pueden mezcla entre sí, por ejemplo hagamos una\nbúsqueda que sea menor de 5000000 o mayor de 5000000\n\ndb.heros.find({$or:[{money:{$lt: 5000000}},{money:{$gt:5000000}}]})\n\n\nY nos devuelve todo menos lo que era 5000000\n\n\n\nAunque esta búsqueda la podriamos haber realizado de alguna forma más sencilla,\nes solo para que se vea que podemos mezclar todo como queramos,pero , por\nejemplo, podríamos haberlo indicado con un $nin\n\ndb.heros.find({money: {$nin: [5000000]}})\n\n\nVeamos algunas cosas más...como tal un documento de mongo no tiene porque tener\nsolo un nivel de profundidad, puede tener un montón de subdocumentos dentro.\nVamos a crearle un subdocumento a Batman indicando si tiene muchos o pocos\namigos (al principio solo Alfred jejejeje). Repasamos así como usar update\n\ndb.heros.update({name: \"Batman\"},{$set:{friends:{civils: \"Alfred\",heros: \"Robin\"}}})\n\n\nSi ahora buscamos a Batman veamos que tiene (le ponemos pretty para verlo mejor)\n\ndb.heros.find({name: \"Batman\"}).pretty()\n\n\n\n\nTambién es posible tener un array de elementos, a los cuales podemos añadir más\nelementos directamente. Ahora trabajemos con Iron Man, añadamos una array de\nobjetos con algunas de sus armaduras. Primero creemos un array vacio, con update\n\ndb.heros.update({name: \"Iron Man\"},{$set:{armors: []}})\n\n\nBien ahora añadamos el primero\n\ndb.heros.update({name: \"Iron Man\"},{$push:{armors: {armor1: \"Mark I\"}}})\n\n\nComo véis hemos usado $push como modificador para añadir elementos. Si ahora\nmostramos vemos como tenemos un array con un elemento\n\n\nProbemos añadiendo otro\n\ndb.heros.update({name: \"Iron Man\"},{$push:{armors: {armor2: \"HearthBreaker\"}}})\n\n\nAhora veríamos como tenemos 2 elementos\n\n\n\nPerformance\nHasta ahora hemos visto un poco de todas las operaciones que podemos hacer con\nmongo, no hemos visto algo que posiblemente algunos se pregunten, ¿es posible\ninsertar más de un elemento?...Por supuesto que sí, pero depende más del\nlenguaje de programación usado, en general existe un método que es bulkInsert o\nsimilar donde pasandole un array,list, arrayList....insertará los registros.\nEsto lo veremos cuando juntemos MongoDB con NodeJS.\nBien ahora vamos a parar un poco y vamos a ver como podemos saber cuanto tardan\nnuestras querys, que hacen internamente y si podemos mejorar algo. Además\nveremos como podemos hacer para que nos devuelva solo los datos que queramos y\nno todo el objeto. Empecemos por esto ya que es lo más sencillo.\n\nPara esto simplemente tenemos que indicarlo al hacer el find, probemos por\nejemplo a traernos solo el campo money de Black Panther\n\ndb.heros.find({name: \"Black Panther\"},{money:1})\n\n\nComo véis solo le pasamos el campo y con 1 indicamos si queremos ese campo, si\nle pusieramos un 0 sería que no queremos ese, si no el resto.\n\nCon el 1 tendríamos este resultado\n\n\nCon el 0\n\n\nEntonces como hemos dicho si no quisiéramos ver el campo _id\n\ndb.heros.find({name: \"Black Panther\"},{money:1,_id:0})\n\n\n\n\nAhora supongamos que queremos ordenar la salida. Para ello vamos a quitar el\nfiltro de nombre, dejar que nos muestre name y money pero quitando el campo _id \ny ordenando por money\n\ndb.heros.find({},{_id:0,money:1,name:1}).sort({money:1})\n\n\n\n\nEsa sería con money de forma ascendente si lo queremos descendente\n\ndb.heros.find({},{_id:0,money:1,name:1}).sort({money:-1})\n\n\n\n\nPerfecto, ya hemos visto como hacer querys más específicas, ahora veamos como\nhacen las querys mongo por dentro y como podríamos mejorarlas.\n\nPara obtener información sobre una query tenemos el método explain(). Probemoslo\npor ejemplo con el último comando\n\ndb.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n\n\nEste comando nos devolvería algo como esto\n\n\n\nComo podéis ver nos proporciona información en cuanto a la configuración de la\nquery, como que hacemos un SORT y nos indica el patrón\n\n\"stage\" : \"SORT\",\n\"sortPattern\" : {\n     \t\"money\" : -1\n},\n\n\nO por ejemplo en que forma genera el sort y en que dirección\n\n\"inputStage\" : {\n   \"stage\" : \"SORT_KEY_GENERATOR\",\n   \"inputStage\" : {\n\t\t\"stage\" : \"COLLSCAN\",\n\t\t\"direction\" : \"forward\"\n   }\n}\n\n\nAquí tenemos que fijarnos en COLLSCAN, esto nos indica que se esta recorriendo\ntoda la colección y luego la ordena (lo mismo nos saldría en una búsqueda sin \nsort), un poco más abajo veremos como cambia este campo.\n\nBien tenemos información pero realmente sería ideal poder ver algunas\nestadísticas de esto como de tiempo por ejemplo...no hay problema solo tenemos\nque pedirselo a explain\n\ndb.heros.find({},{_id:0,money:1,name:1}).explain(\"executionStats\")\n\n\nVemos como además de lo que nos mostraba antes tenemos estadísticas\n\n\n\nPor ejemplo tenemos executionTimeMillis que nos indica el tiempo que ha tardado\nla query.....en este caso como tenemos pocos datos no tarda nada, pero ahora os\nvoy a mostrar un ejemplo que contiene unos 1000000 elementos y estas serían sus\nestadísticas\n\n\n\nFijáos que ha tardado 421 milisegundos y que el stage sigue siendo COLLSCAN.\nPara mí esta query tardaría mucho, por lo que yo quiero optimizar esta\nquery.....y ¿qué podemos hacer para esto? Antes hemos dicho que al poner \nCOLLSCAN lo que hace es recorrerse toda la colección y luego filtra fijáos en la\nimagen que pone totalDocsExamined: 1000000, para optimizar esto podemos crear\nindices. Esto ya comentamos como era, con createIndex con el campo y el orden\n\ndb.heros.createIndex({money:1})\n\n\nVeamos ahora que pone en nuestro explain con nuestra query anterior de sort\n\ndb.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n\n\n\n\nSi os fijáis ahora ha cambiado nuestro stage: IXSCAN, esto nos indica que esta\nbuscando en el índice que hemos creado. No tiene sentido ver el executionStats \nen nuestro ejemplo porque tenemos pocos documentos, pero ahora os muesto una\nimagen real del mismo ejemplo de antes de 1000000 de elementos pero con un \nindice\n\n\n\nSi os fijáis lo primero que vemos es que executionTimeMillis es 0 y lo segundo\nque totalDocsExamined son 90, es decir que en el index existen 90 documentos que\ncumplen con la query que le hemos pasado y nos los ha devuelto directamente.\n\nAquí podemos ver como realmente los índices tienen una función real y realmente\nútil. Tenemos que tener cuidado con los índices porque puede parecer que lo\nmejor es hacer índices de todo, pero realmente no son totalmente gratis, estos\nocupan espacio de almacenamiento y el índice se tiene que ir actualizando junto\ncon la base de datos por lo que aumentamos el tiempo de procesamiento a la hora\nde hacer inserciones en la base de datos, todo esto lo tenemos que tener en\ncuenta a la hora de crear indices siendo lo ideal planear bien cuales serán\nnuestras querys más usadas o las más importantes antes de ponernos a crear\níndices como locos.\n\nPor el momento esto es todo sobre las Queries $ Performance más adelante veremos\nalguna cosa más pero creo que con esto cubrimos casi todos los escenarios que\npodemos necesitar en cuanto a queries ser refiere.\n\nEn el siguiente post veremos algunas cosas sobre el scheme, como almacena los\ndatos Mongo y varias cosas más...nos vemos en el siguienteeeee un abrazoooorrr","html":"<!--kg-card-begin: markdown--><p>Ahora hablaremos sobre las <em>queries</em> o busquedas que podemos hacer en Mongo, este post puede que sea algo más corto que el anterior, pero prefería poner esta parte un poco por separado.</p>\n<p>Antes de empezar quiero comentar algunos conceptos similares entre las bases de datos relacionales y MongoDB pero que quizás tienen distinto nombre:</p>\n<ul>\n<li><strong>Database</strong>: O base de datos en relacional es lo mismo en MongoDB.</li>\n<li><strong>Table</strong>: O tabla en relacional en Mongo es <strong>Colección</strong>.</li>\n<li><strong>Row</strong>: O fila en relacional en Mongo es <strong>Document/Documento</strong>.</li>\n<li><strong>index</strong>: O indice en relacional es lo mismo en MongoDB.</li>\n<li><strong>Join</strong>: Como se conoce en relacional en Mongo es <strong>Lookup</strong></li>\n<li><strong>Foreign Key</strong>: En Mongo se conoce como <strong>Reference/Referencia</strong>.</li>\n<li><strong>Transacciones</strong>: En Mongo existen como transacciones de un unico documento. En relacional son necesarias las transacciones porque tenemos datos que modificar en multiples tablas, sin embargo, en Mongo toda la información que hace referencia a un objeto esta siempre en un unico documento, pensar que más o menos los datos se guardan al estilo JSON, es decir esta todo dentro de un mismo objeto.</li>\n</ul>\n<p>Primero de todo vamos a crearnos de nuevo nuestra base de datos ya que la eliminamos en el post anterior</p>\n<pre><code>use ninjas\n</code></pre>\n<p>Y vamos a crearnos 3 elementos o documentos en ella</p>\n<pre><code>db.heros.insert({name: &quot;Batman&quot;, money: 1000000})\ndb.heros.insert({name: &quot;Iron Man&quot;, money: 5000000})\ndb.heros.insert({name: &quot;Black Panther&quot;, money: 10000000})\n</code></pre>\n<p>Con esto ya tendríamos los 3 creados</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.32.26.png\" alt=\"Three new documents\"></p>\n<p>Ya vimos como hacer algún filtro básico al estilo, buscame por el nombre X</p>\n<pre><code>db.heros.find({name: &quot;Iron Man&quot;})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.34.23.png\" alt=\"Find by name\"></p>\n<p>También podemos usar <em>expresiones regulares directamente</em>, imaginemos que queremos que nos muestre todos los elementos que tienen <em>Man o man</em> en su campo <em>name</em></p>\n<pre><code>db.heros.find({name: /[Mm]an/})\n</code></pre>\n<p>Esto nos devuelve tanto a <em>Batman</em> como <em>Iron Man</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.10.25.png\" alt=\"Regular expresion query\"></p>\n<p>Podemos <em>limitar</em> o <em>ignorar</em> la cantidad de datos que queremos. Con <strong>limit/skip</strong> y la cantidad de elementos</p>\n<pre><code>db.heros.find().limit(1)\ndb.heros.find().skip(1)\n</code></pre>\n<p>Pero, ¿y si queremos buscar por dos nombres distintos?...pués para ello usamos <strong>$in</strong> y le pasamos un array con las opciones</p>\n<pre><code>db.heros.find({name: {$in:[&quot;Batman&quot;,&quot;Black Panther&quot;]}})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.39.07.png\" alt=\"Multiple name choices example\"><br>\n(tenemos tambien la opción <strong>$nin</strong> para indicarle que no sea distinto a lo que le indicamos)</p>\n<p>Acabamos de ver un ejemplo buscando dentro de la misma propiedad, pero ¿y para buscar en propiedades distintas?...tenemos un <strong>$or</strong> muy bonito para ello, al cual le pasamos un array con las propiedades que queremos buscar</p>\n<pre><code>db.heros.find({$or:[{name: &quot;Black Panther&quot;},{money: 5000000}]})\n</code></pre>\n<p>Sin problemas nos encuentra lo que buscamos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.43.42.png\" alt=\"Multiple different properties example\"></p>\n<p>Hasta el momento hemos realizado búsquedas <em>exactas</em>, es decir, buscábamos por elementos coincidentes 100%, pero no siempre sabemos el número exacto de algo....veamos como podemos realizar búsquedas que cumplan algún tipo de condición, por ejemplo hagamos que nos encuentre todos los elementos que su propiedad <em>money</em> sea superior a <em>5000000</em></p>\n<pre><code>db.heros.find({money: {$gt:5000000}})\n</code></pre>\n<p>Nos devuelve solo a <em>Black Panther</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.49.12.png\" alt=\"greather than example\"></p>\n<p>Como os podéis imaginar el <em>$gt</em> es de <em>greather than</em> y al igual que <em>greather than</em>, tenemos <em>less than</em> (lt), <em>greather than or equal</em> (gte) o <em>less than equal</em> (lte). Probemos el gte</p>\n<pre><code>db.heros.find({money: {$gte:5000000}})\n</code></pre>\n<p>Ahora nos devuelve también a <em>Iron Man</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.51.31.png\" alt=\"greather than equal example\"></p>\n<p>Todas estas formas de buscar se pueden mezcla entre sí, por ejemplo hagamos una búsqueda que sea menor de 5000000 o mayor de 5000000</p>\n<pre><code>db.heros.find({$or:[{money:{$lt: 5000000}},{money:{$gt:5000000}}]})\n</code></pre>\n<p>Y nos devuelve todo menos lo que era 5000000</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.56.16.png\" alt=\"Mix filter options\"></p>\n<p>Aunque esta búsqueda la podriamos haber realizado de alguna forma más sencilla, es solo para que se vea que podemos mezclar todo como queramos,pero , por ejemplo,  podríamos haberlo indicado con un <strong>$nin</strong></p>\n<pre><code>db.heros.find({money: {$nin: [5000000]}})\n</code></pre>\n<p>Veamos algunas cosas más...como tal un documento de mongo no tiene porque tener solo un nivel de profundidad, puede tener un montón de <em>subdocumentos</em> dentro.<br>\nVamos a crearle un subdocumento a Batman indicando si tiene muchos o pocos amigos (al principio solo Alfred jejejeje). Repasamos así como usar <em>update</em></p>\n<pre><code>db.heros.update({name: &quot;Batman&quot;},{$set:{friends:{civils: &quot;Alfred&quot;,heros: &quot;Robin&quot;}}})\n</code></pre>\n<p>Si ahora buscamos a Batman veamos que tiene (le ponemos pretty para verlo mejor)</p>\n<pre><code>db.heros.find({name: &quot;Batman&quot;}).pretty()\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-14.16.12.png\" alt=\"Subdocuments creation\"></p>\n<p>También es posible tener un <em>array</em> de elementos, a los cuales podemos añadir más elementos directamente. Ahora trabajemos con <em>Iron Man</em>, añadamos una array de objetos con algunas de sus armaduras. Primero creemos un array vacio, con <em>update</em></p>\n<pre><code>db.heros.update({name: &quot;Iron Man&quot;},{$set:{armors: []}})\n</code></pre>\n<p>Bien ahora añadamos el primero</p>\n<pre><code>db.heros.update({name: &quot;Iron Man&quot;},{$push:{armors: {armor1: &quot;Mark I&quot;}}})\n</code></pre>\n<p>Como véis hemos usado <strong>$push</strong> como modificador para añadir elementos. Si ahora mostramos vemos como tenemos un array con un elemento<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.00.10.png\" alt=\"Array with one element\"></p>\n<p>Probemos añadiendo otro</p>\n<pre><code>db.heros.update({name: &quot;Iron Man&quot;},{$push:{armors: {armor2: &quot;HearthBreaker&quot;}}})\n</code></pre>\n<p>Ahora veríamos como tenemos 2 elementos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.02.11.png\" alt=\"Array with two elements\"></p>\n<h3 id=\"performance\">Performance</h3>\n<p>Hasta ahora hemos visto un poco de todas las operaciones que podemos hacer con mongo, no hemos visto algo que posiblemente algunos se pregunten, ¿es posible insertar más de un elemento?...Por supuesto que sí, pero depende más del lenguaje de programación usado, en general existe un método que es <em>bulkInsert</em> o similar donde pasandole un <em>array,list, arrayList</em>....insertará los registros. Esto lo veremos cuando juntemos <strong>MongoDB con NodeJS</strong>.<br>\nBien ahora vamos a parar un poco y vamos a ver como podemos saber cuanto tardan nuestras querys, que hacen internamente y si podemos mejorar algo. Además veremos como podemos hacer para que nos devuelva solo los datos que queramos y no todo el objeto. Empecemos por esto ya que es lo más sencillo.</p>\n<p>Para esto simplemente tenemos que indicarlo al hacer el find, probemos por ejemplo a traernos solo el campo money de <em>Black Panther</em></p>\n<pre><code>db.heros.find({name: &quot;Black Panther&quot;},{money:1})\n</code></pre>\n<p>Como véis solo le pasamos el campo y con <strong>1</strong> indicamos si queremos ese campo, si le pusieramos un <strong>0</strong> sería que no queremos ese, si no el resto.</p>\n<p>Con el <strong>1</strong> tendríamos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.21.59.png\" alt=\"Only money example\"></p>\n<p>Con el <strong>0</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.22.33.png\" alt=\"All except money\"></p>\n<p>Entonces como hemos dicho si no quisiéramos ver el campo <em>_id</em></p>\n<pre><code>db.heros.find({name: &quot;Black Panther&quot;},{money:1,_id:0})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.23.55.png\" alt=\"Without _id\"></p>\n<p>Ahora supongamos que queremos ordenar la salida. Para ello vamos a quitar el filtro de nombre, dejar que nos muestre <strong>name y money</strong> pero quitando el campo <em>_id</em> y ordenando por <em>money</em></p>\n<pre><code>db.heros.find({},{_id:0,money:1,name:1}).sort({money:1})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.29.21.png\" alt=\"Multifilter query\"></p>\n<p>Esa sería con money de forma ascendente si lo queremos descendente</p>\n<pre><code>db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.30.16.png\" alt=\"Multifilter descending\"></p>\n<p>Perfecto, ya hemos visto como hacer <em>querys más específicas</em>, ahora veamos como hacen las querys mongo por dentro y como podríamos mejorarlas.</p>\n<p>Para obtener información sobre una query tenemos el método <strong>explain()</strong>. Probemoslo por ejemplo con el último comando</p>\n<pre><code>db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n</code></pre>\n<p>Este comando nos devolvería algo como esto</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.35.51.png\" alt=\"Explain command example\"></p>\n<p>Como podéis ver nos proporciona información en cuanto a la configuración de la query, como que hacemos un <em>SORT</em> y nos indica el patrón</p>\n<pre><code>&quot;stage&quot; : &quot;SORT&quot;,\n&quot;sortPattern&quot; : {\n     \t&quot;money&quot; : -1\n},\n</code></pre>\n<p>O por ejemplo en que forma genera el sort y en que dirección</p>\n<pre><code>&quot;inputStage&quot; : {\n   &quot;stage&quot; : &quot;SORT_KEY_GENERATOR&quot;,\n   &quot;inputStage&quot; : {\n\t\t&quot;stage&quot; : &quot;COLLSCAN&quot;,\n\t\t&quot;direction&quot; : &quot;forward&quot;\n   }\n}\n</code></pre>\n<p>Aquí tenemos que fijarnos en <strong>COLLSCAN</strong>, esto nos indica que se esta recorriendo toda la colección y luego la ordena (lo mismo nos saldría en una búsqueda sin <em>sort</em>), un poco más abajo veremos como cambia este campo.</p>\n<p>Bien tenemos información pero realmente sería ideal poder ver algunas estadísticas de esto como de tiempo por ejemplo...no hay problema solo tenemos que pedirselo a <em>explain</em></p>\n<pre><code>db.heros.find({},{_id:0,money:1,name:1}).explain(&quot;executionStats&quot;)\n</code></pre>\n<p>Vemos como además de lo que nos mostraba antes tenemos estadísticas</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.44.30.png\" alt=\"example stats\"></p>\n<p>Por ejemplo tenemos <em>executionTimeMillis</em> que nos indica el tiempo que ha tardado la query.....en este caso como tenemos pocos datos no tarda nada, pero ahora os voy a mostrar un ejemplo que contiene unos 1000000 elementos y estas serían sus estadísticas</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.46.43.png\" alt=\"1000000 stats example\"></p>\n<p>Fijáos que ha tardado <strong>421 milisegundos</strong> y que el <strong>stage sigue siendo COLLSCAN</strong>. Para mí esta query tardaría mucho, por lo que yo quiero optimizar esta query.....y ¿qué podemos hacer para esto? Antes hemos dicho que al poner <em>COLLSCAN</em> lo que hace es recorrerse toda la colección y luego filtra fijáos en la imagen que pone <strong>totalDocsExamined: 1000000</strong>, para optimizar esto podemos <strong>crear indices</strong>. Esto ya comentamos como era, con <strong>createIndex</strong> con el campo y el orden</p>\n<pre><code>db.heros.createIndex({money:1})\n</code></pre>\n<p>Veamos ahora que pone en nuestro <em>explain</em> con nuestra query anterior de <em>sort</em></p>\n<pre><code>db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.53.02.png\" alt=\"Index filter explain\"></p>\n<p>Si os fijáis ahora ha cambiado nuestro <strong>stage: IXSCAN</strong>, esto nos indica que esta buscando en el índice que hemos creado. No tiene sentido ver el <em>executionStats</em> en nuestro ejemplo porque tenemos pocos documentos, pero ahora os muesto una imagen real del mismo ejemplo de antes de 1000000 de elementos pero con un <em>indice</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.56.32.png\" alt=\"1000000 index filter\"></p>\n<p>Si os fijáis lo primero que vemos es que <strong>executionTimeMillis</strong> es <strong>0</strong> y lo segundo que <strong>totalDocsExamined</strong> son 90, es decir que en el index existen 90 documentos que cumplen con la query que le hemos pasado y nos los ha devuelto directamente.</p>\n<p>Aquí podemos ver como realmente los índices tienen una función real y realmente útil. Tenemos que tener cuidado con los índices porque puede parecer que lo mejor es hacer índices de todo, pero realmente no son totalmente gratis, estos ocupan espacio de almacenamiento y el índice se tiene que ir actualizando junto con la base de datos por lo que aumentamos el tiempo de procesamiento a la hora de hacer inserciones en la base de datos, todo esto lo tenemos que tener en cuenta a la hora de crear indices siendo lo ideal planear bien cuales serán nuestras querys más usadas o las más importantes antes de ponernos a crear índices como locos.</p>\n<p>Por el momento esto es todo sobre las <em>Queries $ Performance</em> más adelante veremos alguna cosa más pero creo que con esto cubrimos casi todos los escenarios que podemos necesitar en cuanto a <em>queries</em> ser refiere.</p>\n<p>En el siguiente post veremos algunas cosas sobre el <em>scheme</em>, como almacena los datos Mongo y varias cosas más...nos vemos en el siguienteeeee un abrazoooorrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-ii-queries/","canonical_url":null,"uuid":"6e3e306c-da3f-45f2-8bc2-c60121567237","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59e1f37658177700014ca3cf","reading_time":8,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Ahora hablaremos sobre las <em>queries</em> o busquedas que podemos hacer en Mongo, este post puede que sea algo más corto que el anterior, pero prefería poner esta parte un poco por separado.</p>\n<p>Antes de empezar quiero comentar algunos conceptos similares entre las bases de datos relacionales y MongoDB pero que quizás tienen distinto nombre:</p>\n<ul>\n<li><strong>Database</strong>: O base de datos en relacional es lo mismo en MongoDB.</li>\n<li><strong>Table</strong>: O tabla en relacional en Mongo es <strong>Colección</strong>.</li>\n<li><strong>Row</strong>: O fila en relacional en Mongo es <strong>Document/Documento</strong>.</li>\n<li><strong>index</strong>: O indice en relacional es lo mismo en MongoDB.</li>\n<li><strong>Join</strong>: Como se conoce en relacional en Mongo es <strong>Lookup</strong></li>\n<li><strong>Foreign Key</strong>: En Mongo se conoce como <strong>Reference/Referencia</strong>.</li>\n<li><strong>Transacciones</strong>: En Mongo existen como transacciones de un unico documento. En relacional son necesarias las transacciones porque tenemos datos que modificar en multiples tablas, sin embargo, en Mongo toda la información que hace referencia a un objeto esta siempre en un unico documento, pensar que más o menos los datos se guardan al estilo JSON, es decir esta todo dentro de un mismo objeto.</li>\n</ul>\n<p>Primero de todo vamos a crearnos de nuevo nuestra base de datos ya que la eliminamos en el post anterior</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">use ninjas\n</code></pre></div>\n<p>Y vamos a crearnos 3 elementos o documentos en ella</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Batman\", money: 1000000})\ndb.heros.insert({name: \"Iron Man\", money: 5000000})\ndb.heros.insert({name: \"Black Panther\", money: 10000000})\n</code></pre></div>\n<p>Con esto ya tendríamos los 3 creados</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.32.26.png\" alt=\"Three new documents\"></p>\n<p>Ya vimos como hacer algún filtro básico al estilo, buscame por el nombre X</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: \"Iron Man\"})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.34.23.png\" alt=\"Find by name\"></p>\n<p>También podemos usar <em>expresiones regulares directamente</em>, imaginemos que queremos que nos muestre todos los elementos que tienen <em>Man o man</em> en su campo <em>name</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: /[Mm]an/})\n</code></pre></div>\n<p>Esto nos devuelve tanto a <em>Batman</em> como <em>Iron Man</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.10.25.png\" alt=\"Regular expresion query\"></p>\n<p>Podemos <em>limitar</em> o <em>ignorar</em> la cantidad de datos que queremos. Con <strong>limit/skip</strong> y la cantidad de elementos</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find().limit(1)\ndb.heros.find().skip(1)\n</code></pre></div>\n<p>Pero, ¿y si queremos buscar por dos nombres distintos?...pués para ello usamos <strong>$in</strong> y le pasamos un array con las opciones</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: {$in:[\"Batman\",\"Black Panther\"]}})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.39.07.png\" alt=\"Multiple name choices example\"><br>\n(tenemos tambien la opción <strong>$nin</strong> para indicarle que no sea distinto a lo que le indicamos)</p>\n<p>Acabamos de ver un ejemplo buscando dentro de la misma propiedad, pero ¿y para buscar en propiedades distintas?...tenemos un <strong>$or</strong> muy bonito para ello, al cual le pasamos un array con las propiedades que queremos buscar</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({$or:[{name: \"Black Panther\"},{money: 5000000}]})\n</code></pre></div>\n<p>Sin problemas nos encuentra lo que buscamos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.43.42.png\" alt=\"Multiple different properties example\"></p>\n<p>Hasta el momento hemos realizado búsquedas <em>exactas</em>, es decir, buscábamos por elementos coincidentes 100%, pero no siempre sabemos el número exacto de algo....veamos como podemos realizar búsquedas que cumplan algún tipo de condición, por ejemplo hagamos que nos encuentre todos los elementos que su propiedad <em>money</em> sea superior a <em>5000000</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({money: {$gt:5000000}})\n</code></pre></div>\n<p>Nos devuelve solo a <em>Black Panther</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.49.12.png\" alt=\"greather than example\"></p>\n<p>Como os podéis imaginar el <em>$gt</em> es de <em>greather than</em> y al igual que <em>greather than</em>, tenemos <em>less than</em> (lt), <em>greather than or equal</em> (gte) o <em>less than equal</em> (lte). Probemos el gte</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({money: {$gte:5000000}})\n</code></pre></div>\n<p>Ahora nos devuelve también a <em>Iron Man</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.51.31.png\" alt=\"greather than equal example\"></p>\n<p>Todas estas formas de buscar se pueden mezcla entre sí, por ejemplo hagamos una búsqueda que sea menor de 5000000 o mayor de 5000000</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({$or:[{money:{$lt: 5000000}},{money:{$gt:5000000}}]})\n</code></pre></div>\n<p>Y nos devuelve todo menos lo que era 5000000</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.56.16.png\" alt=\"Mix filter options\"></p>\n<p>Aunque esta búsqueda la podriamos haber realizado de alguna forma más sencilla, es solo para que se vea que podemos mezclar todo como queramos,pero , por ejemplo,  podríamos haberlo indicado con un <strong>$nin</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({money: {$nin: [5000000]}})\n</code></pre></div>\n<p>Veamos algunas cosas más...como tal un documento de mongo no tiene porque tener solo un nivel de profundidad, puede tener un montón de <em>subdocumentos</em> dentro.<br>\nVamos a crearle un subdocumento a Batman indicando si tiene muchos o pocos amigos (al principio solo Alfred jejejeje). Repasamos así como usar <em>update</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({name: \"Batman\"},{$set:{friends:{civils: \"Alfred\",heros: \"Robin\"}}})\n</code></pre></div>\n<p>Si ahora buscamos a Batman veamos que tiene (le ponemos pretty para verlo mejor)</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: \"Batman\"}).pretty()\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-14.16.12.png\" alt=\"Subdocuments creation\"></p>\n<p>También es posible tener un <em>array</em> de elementos, a los cuales podemos añadir más elementos directamente. Ahora trabajemos con <em>Iron Man</em>, añadamos una array de objetos con algunas de sus armaduras. Primero creemos un array vacio, con <em>update</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({name: \"Iron Man\"},{$set:{armors: []}})\n</code></pre></div>\n<p>Bien ahora añadamos el primero</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({name: \"Iron Man\"},{$push:{armors: {armor1: \"Mark I\"}}})\n</code></pre></div>\n<p>Como véis hemos usado <strong>$push</strong> como modificador para añadir elementos. Si ahora mostramos vemos como tenemos un array con un elemento<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.00.10.png\" alt=\"Array with one element\"></p>\n<p>Probemos añadiendo otro</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({name: \"Iron Man\"},{$push:{armors: {armor2: \"HearthBreaker\"}}})\n</code></pre></div>\n<p>Ahora veríamos como tenemos 2 elementos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.02.11.png\" alt=\"Array with two elements\"></p>\n<h3 id=\"performance\">Performance</h3>\n<p>Hasta ahora hemos visto un poco de todas las operaciones que podemos hacer con mongo, no hemos visto algo que posiblemente algunos se pregunten, ¿es posible insertar más de un elemento?...Por supuesto que sí, pero depende más del lenguaje de programación usado, en general existe un método que es <em>bulkInsert</em> o similar donde pasandole un <em>array,list, arrayList</em>....insertará los registros. Esto lo veremos cuando juntemos <strong>MongoDB con NodeJS</strong>.<br>\nBien ahora vamos a parar un poco y vamos a ver como podemos saber cuanto tardan nuestras querys, que hacen internamente y si podemos mejorar algo. Además veremos como podemos hacer para que nos devuelva solo los datos que queramos y no todo el objeto. Empecemos por esto ya que es lo más sencillo.</p>\n<p>Para esto simplemente tenemos que indicarlo al hacer el find, probemos por ejemplo a traernos solo el campo money de <em>Black Panther</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: \"Black Panther\"},{money:1})\n</code></pre></div>\n<p>Como véis solo le pasamos el campo y con <strong>1</strong> indicamos si queremos ese campo, si le pusieramos un <strong>0</strong> sería que no queremos ese, si no el resto.</p>\n<p>Con el <strong>1</strong> tendríamos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.21.59.png\" alt=\"Only money example\"></p>\n<p>Con el <strong>0</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.22.33.png\" alt=\"All except money\"></p>\n<p>Entonces como hemos dicho si no quisiéramos ver el campo <em>_id</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({name: \"Black Panther\"},{money:1,_id:0})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.23.55.png\" alt=\"Without _id\"></p>\n<p>Ahora supongamos que queremos ordenar la salida. Para ello vamos a quitar el filtro de nombre, dejar que nos muestre <strong>name y money</strong> pero quitando el campo <em>_id</em> y ordenando por <em>money</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({},{_id:0,money:1,name:1}).sort({money:1})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.29.21.png\" alt=\"Multifilter query\"></p>\n<p>Esa sería con money de forma ascendente si lo queremos descendente</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.30.16.png\" alt=\"Multifilter descending\"></p>\n<p>Perfecto, ya hemos visto como hacer <em>querys más específicas</em>, ahora veamos como hacen las querys mongo por dentro y como podríamos mejorarlas.</p>\n<p>Para obtener información sobre una query tenemos el método <strong>explain()</strong>. Probemoslo por ejemplo con el último comando</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n</code></pre></div>\n<p>Este comando nos devolvería algo como esto</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.35.51.png\" alt=\"Explain command example\"></p>\n<p>Como podéis ver nos proporciona información en cuanto a la configuración de la query, como que hacemos un <em>SORT</em> y nos indica el patrón</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\"stage\" : \"SORT\",\n\"sortPattern\" : {\n     \t\"money\" : -1\n},\n</code></pre></div>\n<p>O por ejemplo en que forma genera el sort y en que dirección</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\"inputStage\" : {\n   \"stage\" : \"SORT_KEY_GENERATOR\",\n   \"inputStage\" : {\n\t\t\"stage\" : \"COLLSCAN\",\n\t\t\"direction\" : \"forward\"\n   }\n}\n</code></pre></div>\n<p>Aquí tenemos que fijarnos en <strong>COLLSCAN</strong>, esto nos indica que se esta recorriendo toda la colección y luego la ordena (lo mismo nos saldría en una búsqueda sin <em>sort</em>), un poco más abajo veremos como cambia este campo.</p>\n<p>Bien tenemos información pero realmente sería ideal poder ver algunas estadísticas de esto como de tiempo por ejemplo...no hay problema solo tenemos que pedirselo a <em>explain</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({},{_id:0,money:1,name:1}).explain(\"executionStats\")\n</code></pre></div>\n<p>Vemos como además de lo que nos mostraba antes tenemos estadísticas</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.44.30.png\" alt=\"example stats\"></p>\n<p>Por ejemplo tenemos <em>executionTimeMillis</em> que nos indica el tiempo que ha tardado la query.....en este caso como tenemos pocos datos no tarda nada, pero ahora os voy a mostrar un ejemplo que contiene unos 1000000 elementos y estas serían sus estadísticas</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.46.43.png\" alt=\"1000000 stats example\"></p>\n<p>Fijáos que ha tardado <strong>421 milisegundos</strong> y que el <strong>stage sigue siendo COLLSCAN</strong>. Para mí esta query tardaría mucho, por lo que yo quiero optimizar esta query.....y ¿qué podemos hacer para esto? Antes hemos dicho que al poner <em>COLLSCAN</em> lo que hace es recorrerse toda la colección y luego filtra fijáos en la imagen que pone <strong>totalDocsExamined: 1000000</strong>, para optimizar esto podemos <strong>crear indices</strong>. Esto ya comentamos como era, con <strong>createIndex</strong> con el campo y el orden</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.createIndex({money:1})\n</code></pre></div>\n<p>Veamos ahora que pone en nuestro <em>explain</em> con nuestra query anterior de <em>sort</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.53.02.png\" alt=\"Index filter explain\"></p>\n<p>Si os fijáis ahora ha cambiado nuestro <strong>stage: IXSCAN</strong>, esto nos indica que esta buscando en el índice que hemos creado. No tiene sentido ver el <em>executionStats</em> en nuestro ejemplo porque tenemos pocos documentos, pero ahora os muesto una imagen real del mismo ejemplo de antes de 1000000 de elementos pero con un <em>indice</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.56.32.png\" alt=\"1000000 index filter\"></p>\n<p>Si os fijáis lo primero que vemos es que <strong>executionTimeMillis</strong> es <strong>0</strong> y lo segundo que <strong>totalDocsExamined</strong> son 90, es decir que en el index existen 90 documentos que cumplen con la query que le hemos pasado y nos los ha devuelto directamente.</p>\n<p>Aquí podemos ver como realmente los índices tienen una función real y realmente útil. Tenemos que tener cuidado con los índices porque puede parecer que lo mejor es hacer índices de todo, pero realmente no son totalmente gratis, estos ocupan espacio de almacenamiento y el índice se tiene que ir actualizando junto con la base de datos por lo que aumentamos el tiempo de procesamiento a la hora de hacer inserciones en la base de datos, todo esto lo tenemos que tener en cuenta a la hora de crear indices siendo lo ideal planear bien cuales serán nuestras querys más usadas o las más importantes antes de ponernos a crear índices como locos.</p>\n<p>Por el momento esto es todo sobre las <em>Queries $ Performance</em> más adelante veremos alguna cosa más pero creo que con esto cubrimos casi todos los escenarios que podemos necesitar en cuanto a <em>queries</em> ser refiere.</p>\n<p>En el siguiente post veremos algunas cosas sobre el <em>scheme</em>, como almacena los datos Mongo y varias cosas más...nos vemos en el siguienteeeee un abrazoooorrr</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":"Ahora hablaremos sobre las "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"queries"}]},{"type":"text","value":" o busquedas que podemos hacer en Mongo, este post puede que sea algo más corto que el anterior, pero prefería poner esta parte un poco por separado."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de empezar quiero comentar algunos conceptos similares entre las bases de datos relacionales y MongoDB pero que quizás tienen distinto nombre:"}]},{"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":"Database"}]},{"type":"text","value":": O base de datos en relacional es lo mismo en MongoDB."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Table"}]},{"type":"text","value":": O tabla en relacional en Mongo es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Colección"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Row"}]},{"type":"text","value":": O fila en relacional en Mongo es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Document/Documento"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"index"}]},{"type":"text","value":": O indice en relacional es lo mismo en MongoDB."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Join"}]},{"type":"text","value":": Como se conoce en relacional en Mongo es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Lookup"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Foreign Key"}]},{"type":"text","value":": En Mongo se conoce como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Reference/Referencia"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Transacciones"}]},{"type":"text","value":": En Mongo existen como transacciones de un unico documento. En relacional son necesarias las transacciones porque tenemos datos que modificar en multiples tablas, sin embargo, en Mongo toda la información que hace referencia a un objeto esta siempre en un unico documento, pensar que más o menos los datos se guardan al estilo JSON, es decir esta todo dentro de un mismo objeto."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Primero de todo vamos a crearnos de nuevo nuestra base de datos ya que la eliminamos en el post anterior"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"use ninjas\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y vamos a crearnos 3 elementos o documentos en ella"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Batman\", money: 1000000})\ndb.heros.insert({name: \"Iron Man\", money: 5000000})\ndb.heros.insert({name: \"Black Panther\", money: 10000000})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto ya tendríamos los 3 creados"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.32.26.png","alt":"Three new documents"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya vimos como hacer algún filtro básico al estilo, buscame por el nombre X"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: \"Iron Man\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.34.23.png","alt":"Find by name"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También podemos usar "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"expresiones regulares directamente"}]},{"type":"text","value":", imaginemos que queremos que nos muestre todos los elementos que tienen "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Man o man"}]},{"type":"text","value":" en su campo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"name"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: /[Mm]an/})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos devuelve tanto a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Batman"}]},{"type":"text","value":" como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Iron Man"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.10.25.png","alt":"Regular expresion query"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Podemos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"limitar"}]},{"type":"text","value":" o "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ignorar"}]},{"type":"text","value":" la cantidad de datos que queremos. Con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"limit/skip"}]},{"type":"text","value":" y la cantidad de elementos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find().limit(1)\ndb.heros.find().skip(1)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pero, ¿y si queremos buscar por dos nombres distintos?...pués para ello usamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$in"}]},{"type":"text","value":" y le pasamos un array con las opciones"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: {$in:[\"Batman\",\"Black Panther\"]}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.39.07.png","alt":"Multiple name choices example"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n(tenemos tambien la opción "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$nin"}]},{"type":"text","value":" para indicarle que no sea distinto a lo que le indicamos)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Acabamos de ver un ejemplo buscando dentro de la misma propiedad, pero ¿y para buscar en propiedades distintas?...tenemos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$or"}]},{"type":"text","value":" muy bonito para ello, al cual le pasamos un array con las propiedades que queremos buscar"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({$or:[{name: \"Black Panther\"},{money: 5000000}]})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sin problemas nos encuentra lo que buscamos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.43.42.png","alt":"Multiple different properties example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta el momento hemos realizado búsquedas "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"exactas"}]},{"type":"text","value":", es decir, buscábamos por elementos coincidentes 100%, pero no siempre sabemos el número exacto de algo....veamos como podemos realizar búsquedas que cumplan algún tipo de condición, por ejemplo hagamos que nos encuentre todos los elementos que su propiedad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"money"}]},{"type":"text","value":" sea superior a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"5000000"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({money: {$gt:5000000}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos devuelve solo a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Black Panther"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.49.12.png","alt":"greather than example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como os podéis imaginar el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"$gt"}]},{"type":"text","value":" es de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"greather than"}]},{"type":"text","value":" y al igual que "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"greather than"}]},{"type":"text","value":", tenemos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"less than"}]},{"type":"text","value":" (lt), "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"greather than or equal"}]},{"type":"text","value":" (gte) o "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"less than equal"}]},{"type":"text","value":" (lte). Probemos el gte"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({money: {$gte:5000000}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora nos devuelve también a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Iron Man"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.51.31.png","alt":"greather than equal example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Todas estas formas de buscar se pueden mezcla entre sí, por ejemplo hagamos una búsqueda que sea menor de 5000000 o mayor de 5000000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({$or:[{money:{$lt: 5000000}},{money:{$gt:5000000}}]})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y nos devuelve todo menos lo que era 5000000"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.56.16.png","alt":"Mix filter options"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aunque esta búsqueda la podriamos haber realizado de alguna forma más sencilla, es solo para que se vea que podemos mezclar todo como queramos,pero , por ejemplo,  podríamos haberlo indicado con un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$nin"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({money: {$nin: [5000000]}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos algunas cosas más...como tal un documento de mongo no tiene porque tener solo un nivel de profundidad, puede tener un montón de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"subdocumentos"}]},{"type":"text","value":" dentro."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos a crearle un subdocumento a Batman indicando si tiene muchos o pocos amigos (al principio solo Alfred jejejeje). Repasamos así como usar "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"update"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({name: \"Batman\"},{$set:{friends:{civils: \"Alfred\",heros: \"Robin\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora buscamos a Batman veamos que tiene (le ponemos pretty para verlo mejor)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: \"Batman\"}).pretty()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-14.16.12.png","alt":"Subdocuments creation"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También es posible tener un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"array"}]},{"type":"text","value":" de elementos, a los cuales podemos añadir más elementos directamente. Ahora trabajemos con "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Iron Man"}]},{"type":"text","value":", añadamos una array de objetos con algunas de sus armaduras. Primero creemos un array vacio, con "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"update"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({name: \"Iron Man\"},{$set:{armors: []}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien ahora añadamos el primero"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({name: \"Iron Man\"},{$push:{armors: {armor1: \"Mark I\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis hemos usado "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$push"}]},{"type":"text","value":" como modificador para añadir elementos. Si ahora mostramos vemos como tenemos un array con un elemento"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.00.10.png","alt":"Array with one element"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Probemos añadiendo otro"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({name: \"Iron Man\"},{$push:{armors: {armor2: \"HearthBreaker\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora veríamos como tenemos 2 elementos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.02.11.png","alt":"Array with two elements"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"performance"},"children":[{"type":"text","value":"Performance"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta ahora hemos visto un poco de todas las operaciones que podemos hacer con mongo, no hemos visto algo que posiblemente algunos se pregunten, ¿es posible insertar más de un elemento?...Por supuesto que sí, pero depende más del lenguaje de programación usado, en general existe un método que es "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"bulkInsert"}]},{"type":"text","value":" o similar donde pasandole un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"array,list, arrayList"}]},{"type":"text","value":"....insertará los registros. Esto lo veremos cuando juntemos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MongoDB con NodeJS"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien ahora vamos a parar un poco y vamos a ver como podemos saber cuanto tardan nuestras querys, que hacen internamente y si podemos mejorar algo. Además veremos como podemos hacer para que nos devuelva solo los datos que queramos y no todo el objeto. Empecemos por esto ya que es lo más sencillo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para esto simplemente tenemos que indicarlo al hacer el find, probemos por ejemplo a traernos solo el campo money de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Black Panther"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: \"Black Panther\"},{money:1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis solo le pasamos el campo y con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" indicamos si queremos ese campo, si le pusieramos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" sería que no queremos ese, si no el resto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"1"}]},{"type":"text","value":" tendríamos este resultado"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.21.59.png","alt":"Only money example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.22.33.png","alt":"All except money"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Entonces como hemos dicho si no quisiéramos ver el campo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"_id"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({name: \"Black Panther\"},{money:1,_id:0})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.23.55.png","alt":"Without _id"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora supongamos que queremos ordenar la salida. Para ello vamos a quitar el filtro de nombre, dejar que nos muestre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"name y money"}]},{"type":"text","value":" pero quitando el campo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":" y ordenando por "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"money"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({},{_id:0,money:1,name:1}).sort({money:1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.29.21.png","alt":"Multifilter query"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esa sería con money de forma ascendente si lo queremos descendente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.30.16.png","alt":"Multifilter descending"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perfecto, ya hemos visto como hacer "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"querys más específicas"}]},{"type":"text","value":", ahora veamos como hacen las querys mongo por dentro y como podríamos mejorarlas."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para obtener información sobre una query tenemos el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"explain()"}]},{"type":"text","value":". Probemoslo por ejemplo con el último comando"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este comando nos devolvería algo como esto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.35.51.png","alt":"Explain command example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como podéis ver nos proporciona información en cuanto a la configuración de la query, como que hacemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"SORT"}]},{"type":"text","value":" y nos indica el patrón"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"stage\" : \"SORT\",\n\"sortPattern\" : {\n     \t\"money\" : -1\n},\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"O por ejemplo en que forma genera el sort y en que dirección"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"inputStage\" : {\n   \"stage\" : \"SORT_KEY_GENERATOR\",\n   \"inputStage\" : {\n\t\t\"stage\" : \"COLLSCAN\",\n\t\t\"direction\" : \"forward\"\n   }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aquí tenemos que fijarnos en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"COLLSCAN"}]},{"type":"text","value":", esto nos indica que se esta recorriendo toda la colección y luego la ordena (lo mismo nos saldría en una búsqueda sin "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sort"}]},{"type":"text","value":"), un poco más abajo veremos como cambia este campo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien tenemos información pero realmente sería ideal poder ver algunas estadísticas de esto como de tiempo por ejemplo...no hay problema solo tenemos que pedirselo a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"explain"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({},{_id:0,money:1,name:1}).explain(\"executionStats\")\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos como además de lo que nos mostraba antes tenemos estadísticas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.44.30.png","alt":"example stats"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por ejemplo tenemos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"executionTimeMillis"}]},{"type":"text","value":" que nos indica el tiempo que ha tardado la query.....en este caso como tenemos pocos datos no tarda nada, pero ahora os voy a mostrar un ejemplo que contiene unos 1000000 elementos y estas serían sus estadísticas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.46.43.png","alt":"1000000 stats example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fijáos que ha tardado "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"421 milisegundos"}]},{"type":"text","value":" y que el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"stage sigue siendo COLLSCAN"}]},{"type":"text","value":". Para mí esta query tardaría mucho, por lo que yo quiero optimizar esta query.....y ¿qué podemos hacer para esto? Antes hemos dicho que al poner "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"COLLSCAN"}]},{"type":"text","value":" lo que hace es recorrerse toda la colección y luego filtra fijáos en la imagen que pone "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"totalDocsExamined: 1000000"}]},{"type":"text","value":", para optimizar esto podemos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"crear indices"}]},{"type":"text","value":". Esto ya comentamos como era, con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"createIndex"}]},{"type":"text","value":" con el campo y el orden"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.createIndex({money:1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos ahora que pone en nuestro "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"explain"}]},{"type":"text","value":" con nuestra query anterior de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"sort"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({},{_id:0,money:1,name:1}).sort({money:-1}).explain()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.53.02.png","alt":"Index filter explain"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis ahora ha cambiado nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"stage: IXSCAN"}]},{"type":"text","value":", esto nos indica que esta buscando en el índice que hemos creado. No tiene sentido ver el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"executionStats"}]},{"type":"text","value":" en nuestro ejemplo porque tenemos pocos documentos, pero ahora os muesto una imagen real del mismo ejemplo de antes de 1000000 de elementos pero con un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"indice"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-12.56.32.png","alt":"1000000 index filter"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis lo primero que vemos es que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"executionTimeMillis"}]},{"type":"text","value":" es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"0"}]},{"type":"text","value":" y lo segundo que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"totalDocsExamined"}]},{"type":"text","value":" son 90, es decir que en el index existen 90 documentos que cumplen con la query que le hemos pasado y nos los ha devuelto directamente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Aquí podemos ver como realmente los índices tienen una función real y realmente útil. Tenemos que tener cuidado con los índices porque puede parecer que lo mejor es hacer índices de todo, pero realmente no son totalmente gratis, estos ocupan espacio de almacenamiento y el índice se tiene que ir actualizando junto con la base de datos por lo que aumentamos el tiempo de procesamiento a la hora de hacer inserciones en la base de datos, todo esto lo tenemos que tener en cuenta a la hora de crear indices siendo lo ideal planear bien cuales serán nuestras querys más usadas o las más importantes antes de ponernos a crear índices como locos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por el momento esto es todo sobre las "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Queries $ Performance"}]},{"type":"text","value":" más adelante veremos alguna cosa más pero creo que con esto cubrimos casi todos los escenarios que podemos necesitar en cuanto a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"queries"}]},{"type":"text","value":" ser refiere."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el siguiente post veremos algunas cosas sobre el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scheme"}]},{"type":"text","value":", como almacena los datos Mongo y varias cosas más...nos vemos en el siguienteeeee un abrazoooorrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"performance","heading":"Performance"}]},"featureImageSharp":{"base":"MongoBanner-1.png","publicURL":"/static/e2d851a4e8d17762251ac236e48b5140/MongoBanner-1.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.9548872180451127,"src":"/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner-1.png","srcSet":"/static/e2d851a4e8d17762251ac236e48b5140/bcfcb/MongoBanner-1.png 260w,\n/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner-1.png 510w","srcWebp":"/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-1.webp","srcSetWebp":"/static/e2d851a4e8d17762251ac236e48b5140/dc8f3/MongoBanner-1.webp 260w,\n/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-1.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"}}}},"prev":{"id":"Ghost__Post__5a338158333e0f134c248f43","title":"MongoDB Ninja(III): Sin Scheme","slug":"mongodb-ninja-iii","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/MongoBanner-2.png","excerpt":"Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno\n(y aprovechando que este post es más corto lo meto aquí), ¿qué es el journal?.\nPara el que no sepa de que hablo si miramos en el filesystem donde se está\nalmacenando nuestra base de datos tenemos una carpeta journal\n\n\n\nEsta carpeta es una colección especial de Mongo en la que se almacenan los datos\ntemporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un\nmecanismo de salvaguarda en caso de que nues","custom_excerpt":null,"visibility":"public","created_at_pretty":"15 Oct 2017","published_at_pretty":"29 Oct 2017","updated_at_pretty":"18 Jan 2018","created_at":"2017-10-15T13:16:29.000+02:00","published_at":"2017-10-29T21:46:00.000+01:00","updated_at":"2018-01-18T15:04:52.000+01:00","meta_title":"MongoDB Ninja(III): Sin Scheme","meta_description":"Hablemos sobre el \"esquema\"(scheme) en MongoDB, que es lo que tenemos que tener en cuenta para usar de la mejor manera posible esta base de datos","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 voy a comentar sobre una duda que surgió hace poco en mi entorno\n(y aprovechando que este post es más corto lo meto aquí), ¿qué es el journal?.\nPara el que no sepa de que hablo si miramos en el filesystem donde se está\nalmacenando nuestra base de datos tenemos una carpeta journal\n\n\n\nEsta carpeta es una colección especial de Mongo en la que se almacenan los datos\ntemporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un\nmecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de\nalgo. Es decir, mongo tiene un proceso que por defecto cada 60 segundos o cada \n2GB de journal pasa los datos al disco si no han sido pasados antes.\nEsto se puede ver cuando arrancamos mongo\n\n\n\nSi os fijáis en esa línea, entre otras cosas nos aparece esta línea\n\nlog=(enabled=true,archive=true,path=journal,compressor=snappy)\n\n\nDonde indica donde mete los datos de log (que sería el journal), y también\ntenemos esta otra\n\ncheckpoint=(wait=60,log_size=2GB)\n\n\nQue nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha\nescrito o cuando el log llegue a 2GB), pues el journal sería una colección muy\nligera que esta guardando los datos cada 100 ms, por lo que en el caso de que\nnuestro servidor se caiga entre checkpoints y no tuvieramos los últimos cambios\nen el disco, si los tendríamos en el journal.\n\nDocumentos en MongoDB\nHemos comentado que Mongo es una base de datos orientada a documentos (ya lo\ncomentamos por encima jejeje), estos documentos realmente son objetos JSON.\nEstos se almacenan codificados en un formato específico conocido como BSON \n(Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear\nlos documentos, simplemente trabajamos con ellos en su propio formato. Por eso\nes tan eficiente en las búsquedas.\n\nScheme\nEmpecemos a comentar cosas sobre el scheme, en Mongo no tenemos un esquema \ndefinido pero aún así es algo que tenemos que pensar antes de empezar a trabajar\nMongo. Todo se basa siempre en lo mismo: tiempos de lectura, es decir tenemos\nque intentar que para obtener los datos, imaginemos que de este mismo blog, de\nuna de las páginas lo podamos hacer en una única query, ya que en Mongo esto es\nlo que haría realmente eficiente nuestro esquema. Ya hemos visto lo que tarda\nrealmente en hacer búsquedas de muchos elementos en una sola query (como el\nejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una\nbúsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en\nmostrar una página sería bastante más alto.\n\nY pensando en esto es como tenemos que definir nuestros scheme ficticio, ¿que\ninformación voy a necesitar en cada momento?. Para explicar esto lo voy a poner\ncon ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un\npost de un blog normalmente tiene estos elementos:\n\n * Titulo\n * Autor\n * Fecha de publicación\n * Texto del post\n * A lo mejor tiene tags\n * Comentarios\n\nMás o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría\nde los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de \ncada documento tiene que tener toda su información para poder traerla en una\nquery un ejemplo de post sería este:\n\n{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n\n\nMás o menos podría tener sentido, ¿no? pero claro....el tema de los\ncomentarios.......al final según el post podríamos tener un documento gigante y\npara recorrerlo en busca de algo.....o supongamos que tenemos un montón de\ncomentarios en todos los posts......uffff.....demasiado para que la gestión sea\nrealmente eficiente, planteemonos lo siguiente ¿qué es lo que mostramos\nrealmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente\ntenemos un límite de los que mostramos y luego si el usuario quiere ya pide\nmás?.... realmente el escenario normalmente es este último ¿verdad?...bien, pero\n¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es \nlinkarlos, es decir, establecer algún tipo de relación con alguna propiedad.\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que\nmostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que\nteniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con\ncódigo realmente, es decir depende del cliente...pero y si ya tiene 5, ¿qué\nhacemos?...alguno pensará que tenemos que hacer una query para eliminar y otra\npara añadir.....pero realmente no es necesario, tal como es el lenguaje podemos\nhacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda\n\ndb.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n\n\nCon $pop [https://docs.mongodb.com/manual/reference/operator/update/pop/] \neliminamos o el último o el primero según queramos y como ya hemos visto con \n$push [https://docs.mongodb.com/manual/reference/operator/update/push/] añadimos\nnuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener\nun precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos\ngestionar los documentos de post de una forma bastante eficiente.\n\nAhora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es\ntenerlos en otra colección donde hagamos referencia al post en cuestión, por\nejemplo\n\n{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n\n\nCuando el usuario pida más comentarios solo tenemos que buscar por el post_id y\nlisto, ya tendríamos todos los comentarios que necesitamos y si os fijáis al\nsepararlo de esta manera tenemos la posibilidad de añadirle más información a\nlos comentarios por si la necesitamos.\n\nEsto es solo un ejemplo de como podemos establecer relaciones en nuestras bases\nde datos simplemente teniendo una propiedad que relacione ambas, esto se puede\ncomplicar tanto como sea necesario, lo único siempre pensar en como se va a\ntrabajar realmente en nuestra aplicación, cuales van a ser las querys que se van\na realizar o cuales son las que necesitamos para que sea lo más eficiente\nposible.\n\nA parte de esto tenemos que ver la posibilidad de gestionar un poco el no scheme\n, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier\ncosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí\ntenemos dos entornos que podemos gestionar el de la aplicación cliente y el\npropio de MongoDB.\n\nEn cuanto a la aplicación cliente poco que decir, más que realmente la\nresponsabilidad del modelo de los documentos tenía que estar en el cliente ya\nsea controlándolo a mano o con modeladores de objetos específicos de cada\nlenguaje, como puede ser Mongoose [http://mongoosejs.com/] en NodeJS (lo\nusaremos más adelante).\n\nMongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de\n2015 (si no me equivoco) su propio validador de documentos. Básicamente nos\npermite controlar qué se inserta o se actualiza en nuestra base de datos,\nhagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es\nque miréis la documentación oficial\n[https://docs.mongodb.com/manual/core/document-validation/] para ver todo lo que\npodemos hacer con esto. Comentar también que esto debería ser como una segunda\ncomprobación, que exista esta opción no hace que no sea necesaria la opción de\ncontrolar los objetos en las aplicaciones cliente.\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar\nnúmeros, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo\nstring sin problemas\n\ndb.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n\n\nSi ahora buscamos a Deadpool y a Black Panther vemos como cada uno tiene un\ncampo money distinto:\n\n\n\nPara evitar creamos un validator de los datos de una colección ya existente de\nesta forma:\n\ndb.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n\n\nEn collMod le estamos indicando la colección que queremos modificar y como\nvalidador le indicamos que el campo money tiene que ser de tipo number.\nAhora si intentamos insertar un documento nuevo con el campo money como string\n\ndb.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n\n\nObtenemos este resultado\n\n\nTenemos, si o si, que pasarle los datos en el formato que los solicita\n\ndb.heros.insert({name: \"Wolverine\", money: 200})\n\n\nPara que realmente los inserte en la base de datos\n\n\nEstas reglas de validación las podemos hacer tan complejas como queramos,\npodemos usar expresiones regulares, dar opciones de datos específicas.......lo\nque he comentado mirar la documentación oficial\n[https://docs.mongodb.com/manual/core/document-validation/] sobre el tema y\nvereis que podéis hacer.\n\nComentar que podemos crear las reglas de validación junto con la creación de la\ncolección\n\ndb.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n\n\nY ya de paso si cremos así la colección nos aparece directamente sin insertar\nningún dato, y tenemos también nuestra regla de validación desde el principio.\n\nBueno hasta aquí el post sobre vivir con no scheme, como véis no tenemos un\nmodelado de esquemas al estilo relacional pero creo que entre el poder linkar\ncolecciones usando algun campo como referencia y con los validators podemos\ntrabajar casi en cualquier entorno que queramos con esta base de datos.\n\nEn el próximo post veremos como hacer algunos índices mas complejos como las de \ngeolocalicación.\n\nNos vemos en el siguienteeee un abrazooorrrrrr","html":"<!--kg-card-begin: markdown--><p>Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), <strong>¿qué es el journal?</strong>. Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta <strong>journal</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png\" alt=\"Journal folder\"></p>\n<p>Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada <strong>60 segundos</strong> o cada <strong>2GB</strong> de journal pasa los datos al disco si no han sido pasados antes.<br>\nEsto se puede ver cuando arrancamos <em>mongo</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png\" alt=\"Journal init\"></p>\n<p>Si os fijáis en esa línea, entre otras cosas nos aparece esta línea</p>\n<pre><code>log=(enabled=true,archive=true,path=journal,compressor=snappy)\n</code></pre>\n<p>Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra</p>\n<pre><code>checkpoint=(wait=60,log_size=2GB)\n</code></pre>\n<p>Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues <strong>el journal sería una colección muy ligera que esta guardando los datos cada 100 ms</strong>, por lo que en el caso de que nuestro servidor se caiga entre <em>checkpoints</em> y no tuvieramos los últimos cambios en el disco, si los tendríamos en el <em>journal</em>.</p>\n<h3 id=\"documentosenmongodb\">Documentos en MongoDB</h3>\n<p>Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son <strong>objetos JSON</strong>. Estos se almacenan codificados en un formato específico conocido como <strong>BSON</strong> (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas.</p>\n<h3 id=\"scheme\">Scheme</h3>\n<p>Empecemos a comentar cosas sobre el <em>scheme</em>, en Mongo no tenemos un <em>esquema</em> definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: <strong>tiempos de lectura</strong>, es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro <em>esquema</em>. Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto.</p>\n<p>Y pensando en esto es como tenemos que definir nuestros <em>scheme</em> ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:</p>\n<ul>\n<li>Titulo</li>\n<li>Autor</li>\n<li>Fecha de publicación</li>\n<li>Texto del post</li>\n<li>A lo mejor tiene tags</li>\n<li>Comentarios</li>\n</ul>\n<p>Más o menos esos son los elementos que podríamos decir &quot;básicos&quot; en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de <strong>cada documento tiene que tener toda su información para poder traerla en una query</strong> un ejemplo de post sería este:</p>\n<pre><code>{\n&quot;post_id&quot;: 12334,\n&quot;post_title&quot;: &quot;Titulo de Post&quot;,\n&quot;author&quot;: &quot;Juan Luis Garcia&quot;,\n&quot;publish_date&quot;: &quot;11-11-1111&quot;,\n&quot;post_text&quot;: &quot;Un montón de palabras juntas contando algo&quot;,\n&quot;tags&quot;:[&quot;tag1&quot;,&quot;tag2&quot;,&quot;tag3&quot;],\n&quot;comments&quot;:[{\n    &quot;comment_author&quot;: &quot;Superman&quot;,\n    &quot;comment_date&quot;: &quot;12-12-1212&quot;,\n    &quot;comment_text&quot;: &quot;Esto es un supercomentario&quot;\n  },{\n    &quot;comment_author&quot;: &quot;Batman&quot;,\n    &quot;comment_date&quot;: &quot;13-13-1313&quot;,\n    &quot;comment_text&quot;: &quot;¡¡Soy Batman!!&quot;\n  },\n  {...},{...},{...}]\n}\n</code></pre>\n<p>Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente <em>¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?....</em> realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es <em>linkarlos</em>, es decir, establecer algún tipo de relación con alguna propiedad.<br>\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y <em>si ya tiene 5, ¿qué hacemos?</em>...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda</p>\n<pre><code>db.blog.update({post_title: &quot;Algo&quot;},{$pop:{comments:1},$push:{comment:.....}})\n</code></pre>\n<p>Con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/pop/\">$pop</a> eliminamos o el último o el primero según queramos y como ya hemos visto con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/push/\">$push</a> añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente.</p>\n<p>Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo</p>\n<pre><code>{\n    &quot;comment_id&quot;: 41325,\n    &quot;post_id&quot;: 12334,\n    &quot;comment_author&quot;: &quot;Superman&quot;,\n    &quot;comment_author_email&quot;: &quot;superman@correo.com&quot;,\n    &quot;comment_date&quot;: &quot;12-12-1212&quot;,\n    &quot;comment_text&quot;: &quot;Esto es un supercomentario&quot;\n},\n{\n    &quot;comment_id&quot;: 41326,\n    &quot;post_id&quot;: 12334,\n    &quot;comment_author&quot;: &quot;Batman&quot;,\n    &quot;comment_author_email&quot;: &quot;batman@correo.com&quot;,\n    &quot;comment_date&quot;: &quot;13-13-1313&quot;,\n    &quot;comment_text&quot;: &quot;¡¡¡Soy Batman!!!&quot;\n}\n</code></pre>\n<p>Cuando el usuario pida más comentarios solo tenemos que buscar por el <strong>post_id</strong> y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos.</p>\n<p>Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible.</p>\n<p>A parte de esto tenemos que ver la posibilidad de gestionar un poco <strong>el no scheme</strong>, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB.</p>\n<p>En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser <a href=\"http://mongoosejs.com/\"><strong>Mongoose</strong></a> en NodeJS (lo usaremos más adelante).</p>\n<p>MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio <em>validador</em> de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente.<br>\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas</p>\n<pre><code>db.heros.insert({name: &quot;Deadpool&quot;, money: &quot;one hundred&quot;})\n</code></pre>\n<p>Si ahora buscamos a <em>Deadpool</em> y a <em>Black Panther</em> vemos como cada uno tiene un campo <em>money</em> distinto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png\" alt=\"Deadpool insert\"></p>\n<p>Para evitar creamos un <em>validator</em> de los datos de una colección ya existente de esta forma:</p>\n<pre><code>db.runCommand({collMod: &quot;heros&quot;,validator: {money: { $type: &quot;number&quot;}}})\n</code></pre>\n<p>En <strong>collMod</strong> le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo <strong>money</strong> tiene que ser de tipo <em>number</em>.<br>\nAhora si intentamos insertar un documento nuevo con el campo money como string</p>\n<pre><code>db.heros.insert({name: &quot;Wolverine&quot;, money: &quot;two hundreds&quot;})\n</code></pre>\n<p>Obtenemos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png\" alt=\"Failed validation example\"></p>\n<p>Tenemos, si o si, que pasarle los datos en el formato que los solicita</p>\n<pre><code>db.heros.insert({name: &quot;Wolverine&quot;, money: 200})\n</code></pre>\n<p>Para que realmente los inserte en la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png\" alt=\"Validation pass example\"></p>\n<p>Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> sobre el tema y vereis que podéis hacer.</p>\n<p>Comentar que podemos crear las reglas de validación junto con la creación de la colección</p>\n<pre><code>db.createCollection(&quot;heros2&quot;,{validator: {money: { $type: &quot;number&quot;}}})\n</code></pre>\n<p>Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio.</p>\n<p>Bueno hasta aquí el post sobre vivir con <strong>no scheme</strong>, como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder <strong>linkar colecciones</strong> usando algun campo como referencia y con los <strong>validators</strong> podemos trabajar casi en cualquier entorno que queramos con esta base de datos.</p>\n<p>En el próximo post veremos como hacer algunos índices mas complejos como las de <strong>geolocalicación</strong>.</p>\n<p>Nos vemos en el siguienteeee un abrazooorrrrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-iii/","canonical_url":null,"uuid":"345cafab-6c06-4c6f-aad6-0e0f9011cc35","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59e3438d58177700014ca3da","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), <strong>¿qué es el journal?</strong>. Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta <strong>journal</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png\" alt=\"Journal folder\"></p>\n<p>Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada <strong>60 segundos</strong> o cada <strong>2GB</strong> de journal pasa los datos al disco si no han sido pasados antes.<br>\nEsto se puede ver cuando arrancamos <em>mongo</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png\" alt=\"Journal init\"></p>\n<p>Si os fijáis en esa línea, entre otras cosas nos aparece esta línea</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">log=(enabled=true,archive=true,path=journal,compressor=snappy)\n</code></pre></div>\n<p>Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">checkpoint=(wait=60,log_size=2GB)\n</code></pre></div>\n<p>Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues <strong>el journal sería una colección muy ligera que esta guardando los datos cada 100 ms</strong>, por lo que en el caso de que nuestro servidor se caiga entre <em>checkpoints</em> y no tuvieramos los últimos cambios en el disco, si los tendríamos en el <em>journal</em>.</p>\n<h3 id=\"documentosenmongodb\">Documentos en MongoDB</h3>\n<p>Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son <strong>objetos JSON</strong>. Estos se almacenan codificados en un formato específico conocido como <strong>BSON</strong> (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas.</p>\n<h3 id=\"scheme\">Scheme</h3>\n<p>Empecemos a comentar cosas sobre el <em>scheme</em>, en Mongo no tenemos un <em>esquema</em> definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: <strong>tiempos de lectura</strong>, es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro <em>esquema</em>. Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto.</p>\n<p>Y pensando en esto es como tenemos que definir nuestros <em>scheme</em> ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:</p>\n<ul>\n<li>Titulo</li>\n<li>Autor</li>\n<li>Fecha de publicación</li>\n<li>Texto del post</li>\n<li>A lo mejor tiene tags</li>\n<li>Comentarios</li>\n</ul>\n<p>Más o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de <strong>cada documento tiene que tener toda su información para poder traerla en una query</strong> un ejemplo de post sería este:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n</code></pre></div>\n<p>Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente <em>¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?....</em> realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es <em>linkarlos</em>, es decir, establecer algún tipo de relación con alguna propiedad.<br>\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y <em>si ya tiene 5, ¿qué hacemos?</em>...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n</code></pre></div>\n<p>Con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/pop/\">$pop</a> eliminamos o el último o el primero según queramos y como ya hemos visto con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/push/\">$push</a> añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente.</p>\n<p>Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n</code></pre></div>\n<p>Cuando el usuario pida más comentarios solo tenemos que buscar por el <strong>post_id</strong> y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos.</p>\n<p>Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible.</p>\n<p>A parte de esto tenemos que ver la posibilidad de gestionar un poco <strong>el no scheme</strong>, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB.</p>\n<p>En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser <a href=\"http://mongoosejs.com/\"><strong>Mongoose</strong></a> en NodeJS (lo usaremos más adelante).</p>\n<p>MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio <em>validador</em> de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente.<br>\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n</code></pre></div>\n<p>Si ahora buscamos a <em>Deadpool</em> y a <em>Black Panther</em> vemos como cada uno tiene un campo <em>money</em> distinto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png\" alt=\"Deadpool insert\"></p>\n<p>Para evitar creamos un <em>validator</em> de los datos de una colección ya existente de esta forma:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n</code></pre></div>\n<p>En <strong>collMod</strong> le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo <strong>money</strong> tiene que ser de tipo <em>number</em>.<br>\nAhora si intentamos insertar un documento nuevo con el campo money como string</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n</code></pre></div>\n<p>Obtenemos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png\" alt=\"Failed validation example\"></p>\n<p>Tenemos, si o si, que pasarle los datos en el formato que los solicita</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Wolverine\", money: 200})\n</code></pre></div>\n<p>Para que realmente los inserte en la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png\" alt=\"Validation pass example\"></p>\n<p>Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> sobre el tema y vereis que podéis hacer.</p>\n<p>Comentar que podemos crear las reglas de validación junto con la creación de la colección</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n</code></pre></div>\n<p>Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio.</p>\n<p>Bueno hasta aquí el post sobre vivir con <strong>no scheme</strong>, como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder <strong>linkar colecciones</strong> usando algun campo como referencia y con los <strong>validators</strong> podemos trabajar casi en cualquier entorno que queramos con esta base de datos.</p>\n<p>En el próximo post veremos como hacer algunos índices mas complejos como las de <strong>geolocalicación</strong>.</p>\n<p>Nos vemos en el siguienteeee un abrazooorrrrrr</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":"Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"¿qué es el journal?"}]},{"type":"text","value":". Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"journal"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png","alt":"Journal folder"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"60 segundos"}]},{"type":"text","value":" o cada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2GB"}]},{"type":"text","value":" de journal pasa los datos al disco si no han sido pasados antes."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEsto se puede ver cuando arrancamos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mongo"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png","alt":"Journal init"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis en esa línea, entre otras cosas nos aparece esta línea"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log=(enabled=true,archive=true,path=journal,compressor=snappy)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"checkpoint=(wait=60,log_size=2GB)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"el journal sería una colección muy ligera que esta guardando los datos cada 100 ms"}]},{"type":"text","value":", por lo que en el caso de que nuestro servidor se caiga entre "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"checkpoints"}]},{"type":"text","value":" y no tuvieramos los últimos cambios en el disco, si los tendríamos en el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"journal"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"documentosenmongodb"},"children":[{"type":"text","value":"Documentos en MongoDB"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"objetos JSON"}]},{"type":"text","value":". Estos se almacenan codificados en un formato específico conocido como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"BSON"}]},{"type":"text","value":" (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"scheme"},"children":[{"type":"text","value":"Scheme"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empecemos a comentar cosas sobre el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scheme"}]},{"type":"text","value":", en Mongo no tenemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"esquema"}]},{"type":"text","value":" definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tiempos de lectura"}]},{"type":"text","value":", es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"esquema"}]},{"type":"text","value":". Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y pensando en esto es como tenemos que definir nuestros "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scheme"}]},{"type":"text","value":" ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Titulo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Autor"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Fecha de publicación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Texto del post"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"A lo mejor tiene tags"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Comentarios"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"cada documento tiene que tener toda su información para poder traerla en una query"}]},{"type":"text","value":" un ejemplo de post sería este:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?...."}]},{"type":"text","value":" realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"linkarlos"}]},{"type":"text","value":", es decir, establecer algún tipo de relación con alguna propiedad."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"si ya tiene 5, ¿qué hacemos?"}]},{"type":"text","value":"...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/operator/update/pop/"},"children":[{"type":"text","value":"$pop"}]},{"type":"text","value":" eliminamos o el último o el primero según queramos y como ya hemos visto con "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/operator/update/push/"},"children":[{"type":"text","value":"$push"}]},{"type":"text","value":" añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Cuando el usuario pida más comentarios solo tenemos que buscar por el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"post_id"}]},{"type":"text","value":" y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A parte de esto tenemos que ver la posibilidad de gestionar un poco "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"el no scheme"}]},{"type":"text","value":", es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser "},{"type":"element","tagName":"a","properties":{"href":"http://mongoosejs.com/"},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mongoose"}]}]},{"type":"text","value":" en NodeJS (lo usaremos más adelante)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validador"}]},{"type":"text","value":" de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/core/document-validation/"},"children":[{"type":"text","value":"documentación oficial"}]},{"type":"text","value":" para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora buscamos a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Deadpool"}]},{"type":"text","value":" y a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Black Panther"}]},{"type":"text","value":" vemos como cada uno tiene un campo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"money"}]},{"type":"text","value":" distinto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png","alt":"Deadpool insert"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para evitar creamos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" de los datos de una colección ya existente de esta forma:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"collMod"}]},{"type":"text","value":" le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"money"}]},{"type":"text","value":" tiene que ser de tipo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAhora si intentamos insertar un documento nuevo con el campo money como string"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Obtenemos este resultado"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png","alt":"Failed validation example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos, si o si, que pasarle los datos en el formato que los solicita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Wolverine\", money: 200})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para que realmente los inserte en la base de datos"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png","alt":"Validation pass example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/core/document-validation/"},"children":[{"type":"text","value":"documentación oficial"}]},{"type":"text","value":" sobre el tema y vereis que podéis hacer."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Comentar que podemos crear las reglas de validación junto con la creación de la colección"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno hasta aquí el post sobre vivir con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"no scheme"}]},{"type":"text","value":", como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"linkar colecciones"}]},{"type":"text","value":" usando algun campo como referencia y con los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"validators"}]},{"type":"text","value":" podemos trabajar casi en cualquier entorno que queramos con esta base de datos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el próximo post veremos como hacer algunos índices mas complejos como las de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geolocalicación"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos vemos en el siguienteeee un abrazooorrrrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"documentosenmongodb","heading":"Documentos en MongoDB"},{"id":"scheme","heading":"Scheme"}]},"featureImageSharp":{"base":"MongoBanner-2.png","publicURL":"/static/e2d851a4e8d17762251ac236e48b5140/MongoBanner-2.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-2.png","srcSet":"/static/e2d851a4e8d17762251ac236e48b5140/847ef/MongoBanner-2.png 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/91cba/MongoBanner-2.png 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner-2.png 510w","srcWebp":"/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-2.webp","srcSetWebp":"/static/e2d851a4e8d17762251ac236e48b5140/9fca7/MongoBanner-2.webp 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/37a4e/MongoBanner-2.webp 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-2.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"}}}},"next":{"id":"Ghost__Post__5a338158333e0f134c248f40","title":"MongoDB Ninja(I): Intro and Shell Basics","slug":"mongodb-ninja-i","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/MongoBanner.png","excerpt":"Bueno como he ido comentando en los posts de Node empezamos con MongoDB aunque\ndentro de poco lo juntaremos con Node para trabajar. Comentar que no todo el\ncontenido es propiamente mio, está todo basado en conocimientos transmitidos por \nKeepCoding y en Webinars oficiales de MongoDB, mezclado con mi experiencia\npersonal ;)\n\n¿Qué es MongoDB?\nMongoDB es una base de datos no relacional sin esquemas.....y esto que\nsignifica:\n\n * No tenemos JOIN, tendremos que hacerlo nosotros\n * Cada registro podría","custom_excerpt":null,"visibility":"public","created_at_pretty":"12 Oct 2017","published_at_pretty":"19 Oct 2017","updated_at_pretty":"26 Dec 2017","created_at":"2017-10-12T19:27:32.000+02:00","published_at":"2017-10-19T10:26:00.000+02:00","updated_at":"2017-12-26T18:05:44.000+01:00","meta_title":"MongoDB Ninja(I): Intro and Shell Basics","meta_description":"Comenzamos con lo básico de MongoDB, que es? ¿Cuáles son sus ventajas? Y algunas cosas más","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":"Bueno como he ido comentando en los posts de Node empezamos con MongoDB aunque\ndentro de poco lo juntaremos con Node para trabajar. Comentar que no todo el\ncontenido es propiamente mio, está todo basado en conocimientos transmitidos por \nKeepCoding y en Webinars oficiales de MongoDB, mezclado con mi experiencia\npersonal ;)\n\n¿Qué es MongoDB?\nMongoDB es una base de datos no relacional sin esquemas.....y esto que\nsignifica:\n\n * No tenemos JOIN, tendremos que hacerlo nosotros\n * Cada registro podría tener una estructura distinta\n * Mínimo soporte a transacciones\n * Como su nombre indica no se basa en las relaciones entre sus elementos.\n\nUna base de datos NoSql(el termino por cierto vino de un hastag de twitter no es\nrealmente oficial #nosql) puede darnos bastante más rendimiento que una\nrelacional (según en que entorno por supuesto) por algunas razones como estas:\n\n * No tiene que gestionar transacciones\n * No tiene que gestionar relaciones\n * No es necesario convertir objetos a tablas y tablas a objetos....\n\nDefinen su propia arquitectura como Nexus, porque no es una NoSql típica, cumple\ncon los básicos de una base de datos no relacional:\n\n * Flexibilidad: Soporta casi de todos los tipos de elementos que queramos.\n * Escalabilidad y rendimiento: Podemos aumentar el número de servidores de base\n   de datos hasta que nos cansemos (todos ellos trabajando en la misma) y el\n   rendimiento aumentaría casi de forma lineal (esa es la teoría).\n * Siempre disponible y despliegue global: Viene muy relacionado con el punto\n   anterior, porque tener muchos servidores nos garantiza disponibilidad, y esos\n   mismos servidores pueden estar distribuidos por todo el mundo.\n\nPero además de cumplir como NoSql tiene características que la hacen ser algo\nmás (al estilo relacional):\n\n * Lenguaje de querys muy expresivo: Podemos crear querys casi tan complejas\n   como en un lenguaje relacional.\n * Indices secundarios: Tras usar un indice principal para una búsqueda, si\n   previamente lo hemos configurado usaría otro secundario (pensando en querys\n   complejas donde se vayan cumpliendo cosas) lo que hace que la busqueda sea\n   muy agil.\n * Fuerte consistencia\n * Enterprise Management & Integrations: Esta pensada para trabajar casi en\n   cualquier entorno, con múltiples sistemas de integración y con gestión\n   empresarial.\n\nPodemos comentar también que no tiene esquema definido, toda la responsabilidad\ndel orden de los datos la tiene la aplicación que use la base de datos, es\ndecir, si queremos de repente tener un campo nuevo solo tenemos que hacerlo\ndirectamente en nuestro código Java, JavaScript,etc.... y MongoDB lo aceptará.\n\nNo voy a entrar en temas de escalabilidad y tolerancia a fallos muy a fondo,\nsolo comentar que:\n\n * Tenemos escalabilidad podríamos decir vertical, lo que se conocería como \n   Replica Set, serían varios servidores juntos en los que tenemos uno primaria\n   y otros secundarios que van compartiendo información, cuando uno falla en\n   unos 2 segundos se levantará uno de los secundarios. Por lo que realmente\n   cualquiera puede ser primario o secundario.\n * Y también tenemos escalabilidad horizontal, conocida como shards, cada shard\n   es un conjunto de replica set normalmente separados geográficamente o por lo\n   menos no están agrupados como sería con los replica set. Dentro de este\n   entorno podemos definir que se replica y donde, por ejemplo por temas de la\n   LOPD solo queremos que los datos de España se repliquen en servidores que\n   esten en España. Y para controlar que querys van a que servidor tenemos un\n   proceso llamado MongoS (Mongo Shard Router), que normalmente existe uno por\n   servidor, que es el que se encargaría de dirigir estas querys a su lugar\n   correcto.\n\nCreo que hasta aquí tenemos lo básico sobre Mongo, continuemos con la\ninstalación.\n\nInstalación\nMás que instalación yo diría que es descarga y ejecución pero bueno mantengamos\nel orden un poco :P.\nTenemos varias opciones, definidas también según nuestro sistema operativo: \nLinux [https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/], \nWindows [https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/] o \nMacOS [https://docs.mongodb.com/master/tutorial/install-mongodb-on-os-x/].\nEn general es bastante sencillo, se instala/descarga y se ejecuta definiendo el\npath donde se guardará nuestra base de datos, en mi caso trabajo en el blog con\nMacOS asi que los ejemplos pueden estar un poco más enfocados a este sistema\noperativo pero intentaré ser lo más genérico posible.\nUna vez instalado y ejecutado (cada uno que situe la base de datos donde quiera\ntal como lo pone en la documentación de instalación) por defecto estará\nesperando conexiones en el puerto 27017, pero se podría cambiar por cualquier\notro sin problema.\nEn windows se gestiona su arranque y detenimiento con comandos específicos que\nvienen en la documentación, en el caso de linux y mac, si lo hemos realizado\ndescargando e instalando tendremos un shell que es donde veremos los logs de\nconsola que muestra mongo, para pararlo solo tenemos que cerrar la ventana o\nparar el proceso como cualquier otro.\nBien, una vez ejecutado, para trabajar de primeras con Mongo nos vamos a la\ncarpeta donde tengamos descargado Mongo y dentro y podemos ejecutar\n\nbin/mongo\n\n\nEsto nos abrirá una conexión en shell con la base de datos\n\n\nY esto sería lo que muestra el log de consola de Mongo\n\n\nUna vez conectados, veamos algunos comandos básicos de uso de MongoDB.\n\n * show dbs: Nos muestra las bases de datos que tenemos actualmente.\n * \n\n\n\n * use nameDB: Para hacer gestiones en una base de datos específica. Esto\n   también lo usaríamos para crear bases de datos nuevas (OJO hasta que no\n   introduzcamos datos no nos aparecería)\n\n\n\n\n * show collections: Muestra las colecciones existentes en esa base de datos\n   (para haceros una idea serían algo así como las tablas en bases de datos\n   relacionales)\n\n\nSi la base de datos es nueva de primeras no habría nada, las colecciones se\ncrearián cuando insertemos algo (al igual que cualquier base de datos nueva),\nentonces vamos a insertar algo. Los datos en Mongo tienen un estilo similar json\n, al estilo clave => valor\n\ndb.heros.insert({name: \"Batman\", powers: \"Money\"})\n\n\nAl insertar algo correctamente la consola nos lo indicaría\n\n\n\nUna vez insertado si ahora hacemos un show dbs nos mostraría la nueva base de\ndatos, y lo mismo al hacer show collections tras seleccionar esa base de datos\n\n\n\n * Ver lo que tiene una colección: Para ver lo que tiene una colección lo\n   hacemos con db.collectionName.find(), es decir:\n\ndb.heros.find()\n\n\nTambién podemos ponerle .pretty() al final para que nos lo muestre en un formato\nquizá más cómodo si tenemos varios objetos\n\n\n\nSi os fijáis tenemos una nueva propiedad en nuestro objeto que es _id, esta\npropiedad es un identificador único de objeto que le asigna Mongo por defecto a\ncada elemtento insertado. Vamos a crear alguno más para probar a borrar y\nactualizar alguno\n\ndb.heros.insert({name: \"Superman\", powers: \"is Super, no more\"})\ndb.heros.insert({name: \"Goku\", powers: \"Super Saiyan\"})\n\n\nSi ahora hacemos un find\n\n\n\nYa tenemos varios documentos, ahora vamos a eliminar alguno para probar, por\nejemplo borremos a Superman. Os podéis imaginar pero veamos\n\n * Eliminar un elemento: Lo hacemos de manera similar al insert con \n   db.colectionName.remove(idObject)\n\ndb.heros.remove({_id: ObjectId(\"59e1e758c5662c1d57baf70f\")})\n\n\nEsto nos indica que ha eliminado un elemento y si hacemos un find de nuevo\ntenemos solo dos elementos\n\n\n\n * Actualizar un elemento: Sigue la misma teoria que el resto, pero en este\n   caso, a parte del criterio de búsqueda del objeto tenemos que indicarle\n   también que es lo que actualizamos. En este caso en lugar de usar el id para\n   encontrar un objeto lo haremos con otra propiedad, por ejemplo el nombre\n\ndb.heros.update({name: \"Batman\"}, {$set: {powers: \"Ninjitsu\"}})\n\n\nOJO con $set, si no lo ponemos así nos sustituiría todo el elemento por lo que\nle hubieramos pasado.\n\nTras ejecutarlo, como siempre, la consola nos indica lo que ha hecho y si\nbuscamos a Batman veremos como ha cambiado su propiedad powers\n\n\n\n * Crear indices: Si vamos a buscar mucho por cierta propiedad en nuestros\n   documentos dentro de mongo lo ideal es crear indices, ya que agilizan las\n   búsquedas bastante, sobre todo cuando tenemos muchos elementos. Para ello es\n   tan fácil como createIndex y dentro el orden del índice.\n\ndb.heros.createIndex({name: 1, powers: -1})\n\n\nEn este índice lo que le hemos puesto es que cree un índice primero por name con\norden ascendente y eso mismo si el nombre es el mismo que lo ordene por la\npropiedad powers de forma descendente (creo que el +1 -1 está más o menos\nclaro). Si queremos ver los índices que tenemos creados solo tenemos que hacer \ngetIndexes()\n\ndb.heros.getIndexes()\n\n\nY nos devolverá algo como esto\n\n\n\nComo véis ya existia un índice ascendente por _id y luego esta el nuestro que\nacabamos de crear. Podemos ver más opciones con los índices en la documentación\noficial [https://docs.mongodb.com/manual/indexes/]\n\n * Eliminar una colección entera: Fácil db.colectionName.drop()\n\ndb.ninjas.drop()\n\n\nAl no tener ninguna tabla más o colección nos eliminará también la base de datos\n\n\n\nDe momento lo vamos a dejar con la base de datos eliminada en el próximo post la\ncrearemos de nuevo con otros elementos.\n\nEstas serían las opciones más básicas, como tal en la documentación oficial\n[https://docs.mongodb.com/manual] tenemos muchas más.\n\nUn abrazoooorrrr","html":"<!--kg-card-begin: markdown--><p>Bueno como he ido comentando en los posts de Node empezamos con <em>MongoDB</em> aunque dentro de poco lo juntaremos con Node para trabajar. Comentar que no todo el contenido es propiamente mio, está todo basado en conocimientos transmitidos por <strong>KeepCoding</strong> y en <strong>Webinars oficiales de MongoDB</strong>, mezclado con mi experiencia personal ;)</p>\n<h3 id=\"quesmongodb\">¿Qué es MongoDB?</h3>\n<p>MongoDB es una base de datos <em>no relacional</em> sin esquemas.....y esto que significa:</p>\n<ul>\n<li>No tenemos JOIN, tendremos que hacerlo nosotros</li>\n<li>Cada registro podría tener una estructura distinta</li>\n<li>Mínimo soporte a transacciones</li>\n<li>Como su nombre indica no se basa en las relaciones entre sus elementos.</li>\n</ul>\n<p>Una base de datos NoSql(el termino por cierto vino de un hastag de twitter no es realmente oficial #nosql) puede darnos bastante más rendimiento que una relacional (según en que entorno por supuesto) por algunas razones como estas:</p>\n<ul>\n<li>No tiene que gestionar transacciones</li>\n<li>No tiene que gestionar relaciones</li>\n<li>No es necesario convertir objetos a tablas y tablas a objetos....</li>\n</ul>\n<p>Definen su propia arquitectura como <strong>Nexus</strong>, porque no es una NoSql típica, cumple con los básicos de una base de datos no relacional:</p>\n<ul>\n<li><strong>Flexibilidad</strong>: Soporta casi de todos los tipos de elementos que queramos.</li>\n<li><strong>Escalabilidad y rendimiento</strong>: Podemos aumentar el número de servidores de base de datos hasta que nos cansemos (todos ellos trabajando en la misma) y el rendimiento aumentaría casi de forma lineal (esa es la teoría).</li>\n<li><strong>Siempre disponible y despliegue global</strong>: Viene muy relacionado con el punto anterior, porque tener muchos servidores nos garantiza disponibilidad, y esos mismos servidores pueden estar distribuidos por todo el mundo.</li>\n</ul>\n<p>Pero además de cumplir como <em>NoSql</em> tiene características que la hacen ser algo más (al estilo relacional):</p>\n<ul>\n<li><strong>Lenguaje de querys muy expresivo</strong>: Podemos crear querys casi tan complejas como en un lenguaje relacional.</li>\n<li><strong>Indices secundarios</strong>: Tras usar un indice principal para una búsqueda, si previamente lo hemos configurado usaría otro secundario (pensando en querys complejas donde se vayan cumpliendo cosas) lo que hace que la busqueda sea muy agil.</li>\n<li><strong>Fuerte consistencia</strong></li>\n<li><strong>Enterprise Management &amp; Integrations</strong>: Esta pensada para trabajar casi en cualquier entorno, con múltiples sistemas de integración y con gestión empresarial.</li>\n</ul>\n<p>Podemos comentar también que no tiene <strong>esquema definido</strong>, toda la responsabilidad del orden de los datos la tiene la aplicación que use la base de datos, es decir, si queremos de repente tener un campo nuevo solo tenemos que hacerlo directamente en nuestro código Java, JavaScript,etc.... y MongoDB lo aceptará.</p>\n<p>No voy a entrar en temas de escalabilidad y tolerancia a fallos muy a fondo, solo comentar que:</p>\n<ul>\n<li>Tenemos escalabilidad podríamos decir <em>vertical</em>, lo que se conocería como <em>Replica Set</em>, serían varios servidores juntos en los que tenemos uno primaria y otros secundarios que van compartiendo información, cuando uno falla en unos 2 segundos se levantará uno de los secundarios. Por lo que realmente cualquiera puede ser primario o secundario.</li>\n<li>Y también tenemos escalabilidad horizontal, conocida como <em>shards</em>, cada <em>shard es un conjunto de replica set</em> normalmente separados geográficamente o por lo menos no están agrupados como sería con los <em>replica set</em>. Dentro de este entorno podemos definir que se replica y donde, por ejemplo por temas de la LOPD solo queremos que los datos de España se repliquen en servidores que esten en España. Y para controlar que querys van a que servidor tenemos un proceso llamado <strong>MongoS</strong> (Mongo Shard Router), que normalmente existe uno por servidor, que es el que se encargaría de dirigir estas querys a su lugar correcto.</li>\n</ul>\n<p>Creo que hasta aquí tenemos lo básico sobre Mongo, continuemos con la  instalación.</p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>Más que instalación yo diría que es descarga y ejecución pero bueno mantengamos el orden un poco :P.<br>\nTenemos varias opciones, definidas también según nuestro sistema operativo: <a href=\"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/\">Linux</a>, <a href=\"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/\">Windows</a> o <a href=\"https://docs.mongodb.com/master/tutorial/install-mongodb-on-os-x/\">MacOS</a>.<br>\nEn general es bastante sencillo, se instala/descarga y se ejecuta definiendo el path donde se guardará nuestra base de datos, en mi caso trabajo en el blog con MacOS asi que los ejemplos pueden estar un poco más enfocados a este sistema operativo pero intentaré ser lo más genérico posible.<br>\nUna vez instalado y ejecutado (cada uno que situe la base de datos donde quiera tal como lo pone en la documentación de instalación) por defecto estará esperando conexiones en el <strong>puerto 27017</strong>, pero se podría cambiar por cualquier otro sin problema.<br>\nEn windows se gestiona su arranque y detenimiento con comandos específicos que vienen en la documentación, en el caso de linux y mac, si lo hemos realizado descargando e instalando tendremos un shell que es donde veremos los logs de consola que muestra mongo, para pararlo solo tenemos que cerrar la ventana o parar el proceso como cualquier otro.<br>\nBien, una vez ejecutado, para trabajar de primeras con Mongo nos vamos a la carpeta donde tengamos descargado Mongo y dentro y podemos ejecutar</p>\n<pre><code>bin/mongo\n</code></pre>\n<p>Esto nos abrirá una conexión en shell con la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.40.31.png\" alt=\"MongoDb Connect example\"></p>\n<p>Y esto sería lo que muestra el log de consola de Mongo<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.41.40.png\" alt=\"Connection log example\"></p>\n<p>Una vez conectados, veamos algunos comandos básicos de uso de MongoDB.</p>\n<ul>\n<li><strong>show dbs</strong>: Nos muestra las bases de datos que tenemos actualmente.</li>\n<li></li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.45.29.png\" alt=\"show dbs example\"></p>\n<ul>\n<li><strong>use nameDB</strong>: Para hacer gestiones en una base de datos específica. Esto también lo usaríamos para crear bases de datos nuevas (OJO hasta que no introduzcamos datos no nos aparecería)</li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.47.06.png\" alt=\"use dbName example\"><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.51.56.png\" alt=\"Create new db\"></p>\n<ul>\n<li><strong>show collections</strong>: Muestra las colecciones existentes en esa base de datos (para haceros una idea serían algo así como las tablas en bases de datos relacionales)</li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.48.56.png\" alt=\"show collections example\"><br>\nSi la base de datos es nueva de primeras no habría nada, las colecciones se crearián cuando insertemos algo (al igual que cualquier base de datos nueva), entonces vamos a insertar algo. Los datos en <em>Mongo</em> tienen un estilo similar <em>json</em>, al estilo clave =&gt; valor</p>\n<pre><code>db.heros.insert({name: &quot;Batman&quot;, powers: &quot;Money&quot;})\n</code></pre>\n<p>Al insertar algo correctamente la consola nos lo indicaría</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.18.06.png\" alt=\"Document inserted\"></p>\n<p>Una vez insertado si ahora hacemos un <em>show dbs</em> nos mostraría la nueva base de datos, y lo mismo al hacer <em>show collections</em> tras seleccionar esa base de datos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.20.30.png\" alt=\"Show new collections\"></p>\n<ul>\n<li><strong>Ver lo que tiene una colección</strong>: Para ver lo que tiene una colección lo hacemos con <em>db.collectionName.find()</em>, es decir:</li>\n</ul>\n<pre><code>db.heros.find()\n</code></pre>\n<p>También podemos ponerle <em>.pretty()</em> al final para que nos lo muestre en un formato quizá más cómodo si tenemos varios objetos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.22.35.png\" alt=\"Find documents example\"></p>\n<p>Si os fijáis tenemos una nueva propiedad en nuestro objeto que es <em>_id</em>, esta propiedad es un identificador único de objeto que le asigna <em>Mongo</em> por defecto a cada elemtento insertado. Vamos a crear alguno más para probar a borrar y actualizar alguno</p>\n<pre><code>db.heros.insert({name: &quot;Superman&quot;, powers: &quot;is Super, no more&quot;})\ndb.heros.insert({name: &quot;Goku&quot;, powers: &quot;Super Saiyan&quot;})\n</code></pre>\n<p>Si ahora hacemos un <em>find</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.31.53.png\" alt=\"Find with more documents\"></p>\n<p>Ya tenemos varios documentos, ahora vamos a eliminar alguno para probar, por ejemplo borremos a Superman. Os podéis imaginar pero veamos</p>\n<ul>\n<li><strong>Eliminar un elemento</strong>: Lo hacemos de manera similar al <em>insert</em> con <em>db.colectionName.remove(idObject)</em></li>\n</ul>\n<pre><code>db.heros.remove({_id: ObjectId(&quot;59e1e758c5662c1d57baf70f&quot;)})\n</code></pre>\n<p>Esto nos indica que ha eliminado un elemento y si hacemos un <em>find</em> de nuevo tenemos solo dos elementos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.50.41.png\" alt=\"Remove one item\"></p>\n<ul>\n<li><strong>Actualizar un elemento</strong>: Sigue la misma teoria que el resto, pero en este caso, a parte del criterio de búsqueda del objeto tenemos que indicarle también que es lo que actualizamos. En este caso en lugar de usar el <em>id</em> para encontrar un objeto lo haremos con otra propiedad, por ejemplo el nombre</li>\n</ul>\n<pre><code>db.heros.update({name: &quot;Batman&quot;}, {$set: {powers: &quot;Ninjitsu&quot;}})\n</code></pre>\n<p><strong>OJO con $set, si no lo ponemos así nos sustituiría todo el elemento por lo que le hubieramos pasado</strong>.</p>\n<p>Tras ejecutarlo, como siempre, la consola nos indica lo que ha hecho y si buscamos a <em>Batman</em> veremos como ha cambiado su propiedad <em>powers</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.58.56.png\" alt=\"Batman powers update\"></p>\n<ul>\n<li><strong>Crear indices</strong>: Si vamos a buscar mucho por cierta propiedad en nuestros documentos dentro de mongo lo ideal es crear indices, ya que agilizan las búsquedas bastante, sobre todo cuando tenemos muchos elementos. Para ello es tan fácil como <em>createIndex</em> y dentro el orden del índice.</li>\n</ul>\n<pre><code>db.heros.createIndex({name: 1, powers: -1})\n</code></pre>\n<p>En este índice lo que le hemos puesto es que cree un índice primero por <em>name</em> con orden <em>ascendente</em> y eso mismo si el nombre es el mismo que lo ordene por la propiedad <em>powers</em> de forma <em>descendente</em> (creo que el +1 -1 está más o menos claro). Si queremos ver los índices que tenemos creados solo tenemos que hacer <em>getIndexes()</em></p>\n<pre><code>db.heros.getIndexes()\n</code></pre>\n<p>Y nos devolverá algo como esto</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.10.43.png\" alt=\"Index examples\"></p>\n<p>Como véis ya existia un índice ascendente por <em>_id</em> y luego esta el nuestro que acabamos de crear. Podemos ver más opciones con los índices en la <a href=\"https://docs.mongodb.com/manual/indexes/\">documentación oficial</a></p>\n<ul>\n<li><strong>Eliminar una colección entera</strong>: Fácil <em>db.colectionName.drop()</em></li>\n</ul>\n<pre><code>db.ninjas.drop()\n</code></pre>\n<p>Al no tener ninguna tabla más o colección nos eliminará también la base de datos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.25.34.png\" alt=\"Captura-de-pantalla-2017-10-14-a-las-13.25.34\"></p>\n<p>De momento lo vamos a dejar con la base de datos eliminada en el próximo post la crearemos de nuevo con otros elementos.</p>\n<p>Estas serían las opciones más básicas, como tal en la <a href=\"https://docs.mongodb.com/manual\">documentación oficial</a> tenemos muchas más.</p>\n<p>Un abrazoooorrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-i/","canonical_url":null,"uuid":"f68acaa4-256d-4530-98f4-9a058d57a251","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59dfa60458177700014ca3bf","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Bueno como he ido comentando en los posts de Node empezamos con <em>MongoDB</em> aunque dentro de poco lo juntaremos con Node para trabajar. Comentar que no todo el contenido es propiamente mio, está todo basado en conocimientos transmitidos por <strong>KeepCoding</strong> y en <strong>Webinars oficiales de MongoDB</strong>, mezclado con mi experiencia personal ;)</p>\n<h3 id=\"quesmongodb\">¿Qué es MongoDB?</h3>\n<p>MongoDB es una base de datos <em>no relacional</em> sin esquemas.....y esto que significa:</p>\n<ul>\n<li>No tenemos JOIN, tendremos que hacerlo nosotros</li>\n<li>Cada registro podría tener una estructura distinta</li>\n<li>Mínimo soporte a transacciones</li>\n<li>Como su nombre indica no se basa en las relaciones entre sus elementos.</li>\n</ul>\n<p>Una base de datos NoSql(el termino por cierto vino de un hastag de twitter no es realmente oficial #nosql) puede darnos bastante más rendimiento que una relacional (según en que entorno por supuesto) por algunas razones como estas:</p>\n<ul>\n<li>No tiene que gestionar transacciones</li>\n<li>No tiene que gestionar relaciones</li>\n<li>No es necesario convertir objetos a tablas y tablas a objetos....</li>\n</ul>\n<p>Definen su propia arquitectura como <strong>Nexus</strong>, porque no es una NoSql típica, cumple con los básicos de una base de datos no relacional:</p>\n<ul>\n<li><strong>Flexibilidad</strong>: Soporta casi de todos los tipos de elementos que queramos.</li>\n<li><strong>Escalabilidad y rendimiento</strong>: Podemos aumentar el número de servidores de base de datos hasta que nos cansemos (todos ellos trabajando en la misma) y el rendimiento aumentaría casi de forma lineal (esa es la teoría).</li>\n<li><strong>Siempre disponible y despliegue global</strong>: Viene muy relacionado con el punto anterior, porque tener muchos servidores nos garantiza disponibilidad, y esos mismos servidores pueden estar distribuidos por todo el mundo.</li>\n</ul>\n<p>Pero además de cumplir como <em>NoSql</em> tiene características que la hacen ser algo más (al estilo relacional):</p>\n<ul>\n<li><strong>Lenguaje de querys muy expresivo</strong>: Podemos crear querys casi tan complejas como en un lenguaje relacional.</li>\n<li><strong>Indices secundarios</strong>: Tras usar un indice principal para una búsqueda, si previamente lo hemos configurado usaría otro secundario (pensando en querys complejas donde se vayan cumpliendo cosas) lo que hace que la busqueda sea muy agil.</li>\n<li><strong>Fuerte consistencia</strong></li>\n<li><strong>Enterprise Management &#x26; Integrations</strong>: Esta pensada para trabajar casi en cualquier entorno, con múltiples sistemas de integración y con gestión empresarial.</li>\n</ul>\n<p>Podemos comentar también que no tiene <strong>esquema definido</strong>, toda la responsabilidad del orden de los datos la tiene la aplicación que use la base de datos, es decir, si queremos de repente tener un campo nuevo solo tenemos que hacerlo directamente en nuestro código Java, JavaScript,etc.... y MongoDB lo aceptará.</p>\n<p>No voy a entrar en temas de escalabilidad y tolerancia a fallos muy a fondo, solo comentar que:</p>\n<ul>\n<li>Tenemos escalabilidad podríamos decir <em>vertical</em>, lo que se conocería como <em>Replica Set</em>, serían varios servidores juntos en los que tenemos uno primaria y otros secundarios que van compartiendo información, cuando uno falla en unos 2 segundos se levantará uno de los secundarios. Por lo que realmente cualquiera puede ser primario o secundario.</li>\n<li>Y también tenemos escalabilidad horizontal, conocida como <em>shards</em>, cada <em>shard es un conjunto de replica set</em> normalmente separados geográficamente o por lo menos no están agrupados como sería con los <em>replica set</em>. Dentro de este entorno podemos definir que se replica y donde, por ejemplo por temas de la LOPD solo queremos que los datos de España se repliquen en servidores que esten en España. Y para controlar que querys van a que servidor tenemos un proceso llamado <strong>MongoS</strong> (Mongo Shard Router), que normalmente existe uno por servidor, que es el que se encargaría de dirigir estas querys a su lugar correcto.</li>\n</ul>\n<p>Creo que hasta aquí tenemos lo básico sobre Mongo, continuemos con la  instalación.</p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>Más que instalación yo diría que es descarga y ejecución pero bueno mantengamos el orden un poco :P.<br>\nTenemos varias opciones, definidas también según nuestro sistema operativo: <a href=\"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/\">Linux</a>, <a href=\"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/\">Windows</a> o <a href=\"https://docs.mongodb.com/master/tutorial/install-mongodb-on-os-x/\">MacOS</a>.<br>\nEn general es bastante sencillo, se instala/descarga y se ejecuta definiendo el path donde se guardará nuestra base de datos, en mi caso trabajo en el blog con MacOS asi que los ejemplos pueden estar un poco más enfocados a este sistema operativo pero intentaré ser lo más genérico posible.<br>\nUna vez instalado y ejecutado (cada uno que situe la base de datos donde quiera tal como lo pone en la documentación de instalación) por defecto estará esperando conexiones en el <strong>puerto 27017</strong>, pero se podría cambiar por cualquier otro sin problema.<br>\nEn windows se gestiona su arranque y detenimiento con comandos específicos que vienen en la documentación, en el caso de linux y mac, si lo hemos realizado descargando e instalando tendremos un shell que es donde veremos los logs de consola que muestra mongo, para pararlo solo tenemos que cerrar la ventana o parar el proceso como cualquier otro.<br>\nBien, una vez ejecutado, para trabajar de primeras con Mongo nos vamos a la carpeta donde tengamos descargado Mongo y dentro y podemos ejecutar</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">bin/mongo\n</code></pre></div>\n<p>Esto nos abrirá una conexión en shell con la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.40.31.png\" alt=\"MongoDb Connect example\"></p>\n<p>Y esto sería lo que muestra el log de consola de Mongo<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.41.40.png\" alt=\"Connection log example\"></p>\n<p>Una vez conectados, veamos algunos comandos básicos de uso de MongoDB.</p>\n<ul>\n<li><strong>show dbs</strong>: Nos muestra las bases de datos que tenemos actualmente.</li>\n<li></li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.45.29.png\" alt=\"show dbs example\"></p>\n<ul>\n<li><strong>use nameDB</strong>: Para hacer gestiones en una base de datos específica. Esto también lo usaríamos para crear bases de datos nuevas (OJO hasta que no introduzcamos datos no nos aparecería)</li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.47.06.png\" alt=\"use dbName example\"><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.51.56.png\" alt=\"Create new db\"></p>\n<ul>\n<li><strong>show collections</strong>: Muestra las colecciones existentes en esa base de datos (para haceros una idea serían algo así como las tablas en bases de datos relacionales)</li>\n</ul>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.48.56.png\" alt=\"show collections example\"><br>\nSi la base de datos es nueva de primeras no habría nada, las colecciones se crearián cuando insertemos algo (al igual que cualquier base de datos nueva), entonces vamos a insertar algo. Los datos en <em>Mongo</em> tienen un estilo similar <em>json</em>, al estilo clave => valor</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Batman\", powers: \"Money\"})\n</code></pre></div>\n<p>Al insertar algo correctamente la consola nos lo indicaría</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.18.06.png\" alt=\"Document inserted\"></p>\n<p>Una vez insertado si ahora hacemos un <em>show dbs</em> nos mostraría la nueva base de datos, y lo mismo al hacer <em>show collections</em> tras seleccionar esa base de datos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.20.30.png\" alt=\"Show new collections\"></p>\n<ul>\n<li><strong>Ver lo que tiene una colección</strong>: Para ver lo que tiene una colección lo hacemos con <em>db.collectionName.find()</em>, es decir:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find()\n</code></pre></div>\n<p>También podemos ponerle <em>.pretty()</em> al final para que nos lo muestre en un formato quizá más cómodo si tenemos varios objetos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.22.35.png\" alt=\"Find documents example\"></p>\n<p>Si os fijáis tenemos una nueva propiedad en nuestro objeto que es <em>_id</em>, esta propiedad es un identificador único de objeto que le asigna <em>Mongo</em> por defecto a cada elemtento insertado. Vamos a crear alguno más para probar a borrar y actualizar alguno</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Superman\", powers: \"is Super, no more\"})\ndb.heros.insert({name: \"Goku\", powers: \"Super Saiyan\"})\n</code></pre></div>\n<p>Si ahora hacemos un <em>find</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.31.53.png\" alt=\"Find with more documents\"></p>\n<p>Ya tenemos varios documentos, ahora vamos a eliminar alguno para probar, por ejemplo borremos a Superman. Os podéis imaginar pero veamos</p>\n<ul>\n<li><strong>Eliminar un elemento</strong>: Lo hacemos de manera similar al <em>insert</em> con <em>db.colectionName.remove(idObject)</em></li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.remove({_id: ObjectId(\"59e1e758c5662c1d57baf70f\")})\n</code></pre></div>\n<p>Esto nos indica que ha eliminado un elemento y si hacemos un <em>find</em> de nuevo tenemos solo dos elementos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.50.41.png\" alt=\"Remove one item\"></p>\n<ul>\n<li><strong>Actualizar un elemento</strong>: Sigue la misma teoria que el resto, pero en este caso, a parte del criterio de búsqueda del objeto tenemos que indicarle también que es lo que actualizamos. En este caso en lugar de usar el <em>id</em> para encontrar un objeto lo haremos con otra propiedad, por ejemplo el nombre</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({name: \"Batman\"}, {$set: {powers: \"Ninjitsu\"}})\n</code></pre></div>\n<p><strong>OJO con $set, si no lo ponemos así nos sustituiría todo el elemento por lo que le hubieramos pasado</strong>.</p>\n<p>Tras ejecutarlo, como siempre, la consola nos indica lo que ha hecho y si buscamos a <em>Batman</em> veremos como ha cambiado su propiedad <em>powers</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.58.56.png\" alt=\"Batman powers update\"></p>\n<ul>\n<li><strong>Crear indices</strong>: Si vamos a buscar mucho por cierta propiedad en nuestros documentos dentro de mongo lo ideal es crear indices, ya que agilizan las búsquedas bastante, sobre todo cuando tenemos muchos elementos. Para ello es tan fácil como <em>createIndex</em> y dentro el orden del índice.</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.createIndex({name: 1, powers: -1})\n</code></pre></div>\n<p>En este índice lo que le hemos puesto es que cree un índice primero por <em>name</em> con orden <em>ascendente</em> y eso mismo si el nombre es el mismo que lo ordene por la propiedad <em>powers</em> de forma <em>descendente</em> (creo que el +1 -1 está más o menos claro). Si queremos ver los índices que tenemos creados solo tenemos que hacer <em>getIndexes()</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.getIndexes()\n</code></pre></div>\n<p>Y nos devolverá algo como esto</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.10.43.png\" alt=\"Index examples\"></p>\n<p>Como véis ya existia un índice ascendente por <em>_id</em> y luego esta el nuestro que acabamos de crear. Podemos ver más opciones con los índices en la <a href=\"https://docs.mongodb.com/manual/indexes/\">documentación oficial</a></p>\n<ul>\n<li><strong>Eliminar una colección entera</strong>: Fácil <em>db.colectionName.drop()</em></li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.ninjas.drop()\n</code></pre></div>\n<p>Al no tener ninguna tabla más o colección nos eliminará también la base de datos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.25.34.png\" alt=\"Captura-de-pantalla-2017-10-14-a-las-13.25.34\"></p>\n<p>De momento lo vamos a dejar con la base de datos eliminada en el próximo post la crearemos de nuevo con otros elementos.</p>\n<p>Estas serían las opciones más básicas, como tal en la <a href=\"https://docs.mongodb.com/manual\">documentación oficial</a> tenemos muchas más.</p>\n<p>Un abrazoooorrrr</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":"Bueno como he ido comentando en los posts de Node empezamos con "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"MongoDB"}]},{"type":"text","value":" aunque dentro de poco lo juntaremos con Node para trabajar. Comentar que no todo el contenido es propiamente mio, está todo basado en conocimientos transmitidos por "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"KeepCoding"}]},{"type":"text","value":" y en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Webinars oficiales de MongoDB"}]},{"type":"text","value":", mezclado con mi experiencia personal ;)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"quesmongodb"},"children":[{"type":"text","value":"¿Qué es MongoDB?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"MongoDB es una base de datos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"no relacional"}]},{"type":"text","value":" sin esquemas.....y esto que significa:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No tenemos JOIN, tendremos que hacerlo nosotros"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Cada registro podría tener una estructura distinta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Mínimo soporte a transacciones"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Como su nombre indica no se basa en las relaciones entre sus elementos."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una base de datos NoSql(el termino por cierto vino de un hastag de twitter no es realmente oficial #nosql) puede darnos bastante más rendimiento que una relacional (según en que entorno por supuesto) por algunas razones como estas:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No tiene que gestionar transacciones"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No tiene que gestionar relaciones"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"No es necesario convertir objetos a tablas y tablas a objetos...."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Definen su propia arquitectura como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Nexus"}]},{"type":"text","value":", porque no es una NoSql típica, cumple con los básicos de una base de datos no relacional:"}]},{"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":"Flexibilidad"}]},{"type":"text","value":": Soporta casi de todos los tipos de elementos que queramos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Escalabilidad y rendimiento"}]},{"type":"text","value":": Podemos aumentar el número de servidores de base de datos hasta que nos cansemos (todos ellos trabajando en la misma) y el rendimiento aumentaría casi de forma lineal (esa es la teoría)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Siempre disponible y despliegue global"}]},{"type":"text","value":": Viene muy relacionado con el punto anterior, porque tener muchos servidores nos garantiza disponibilidad, y esos mismos servidores pueden estar distribuidos por todo el mundo."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pero además de cumplir como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"NoSql"}]},{"type":"text","value":" tiene características que la hacen ser algo más (al estilo relacional):"}]},{"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":"Lenguaje de querys muy expresivo"}]},{"type":"text","value":": Podemos crear querys casi tan complejas como en un lenguaje relacional."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Indices secundarios"}]},{"type":"text","value":": Tras usar un indice principal para una búsqueda, si previamente lo hemos configurado usaría otro secundario (pensando en querys complejas donde se vayan cumpliendo cosas) lo que hace que la busqueda sea muy agil."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Fuerte consistencia"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Enterprise Management & Integrations"}]},{"type":"text","value":": Esta pensada para trabajar casi en cualquier entorno, con múltiples sistemas de integración y con gestión empresarial."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Podemos comentar también que no tiene "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"esquema definido"}]},{"type":"text","value":", toda la responsabilidad del orden de los datos la tiene la aplicación que use la base de datos, es decir, si queremos de repente tener un campo nuevo solo tenemos que hacerlo directamente en nuestro código Java, JavaScript,etc.... y MongoDB lo aceptará."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"No voy a entrar en temas de escalabilidad y tolerancia a fallos muy a fondo, solo comentar que:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tenemos escalabilidad podríamos decir "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"vertical"}]},{"type":"text","value":", lo que se conocería como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Replica Set"}]},{"type":"text","value":", serían varios servidores juntos en los que tenemos uno primaria y otros secundarios que van compartiendo información, cuando uno falla en unos 2 segundos se levantará uno de los secundarios. Por lo que realmente cualquiera puede ser primario o secundario."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Y también tenemos escalabilidad horizontal, conocida como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"shards"}]},{"type":"text","value":", cada "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"shard es un conjunto de replica set"}]},{"type":"text","value":" normalmente separados geográficamente o por lo menos no están agrupados como sería con los "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"replica set"}]},{"type":"text","value":". Dentro de este entorno podemos definir que se replica y donde, por ejemplo por temas de la LOPD solo queremos que los datos de España se repliquen en servidores que esten en España. Y para controlar que querys van a que servidor tenemos un proceso llamado "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MongoS"}]},{"type":"text","value":" (Mongo Shard Router), que normalmente existe uno por servidor, que es el que se encargaría de dirigir estas querys a su lugar correcto."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que hasta aquí tenemos lo básico sobre Mongo, continuemos con la  instalación."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"instalacin"},"children":[{"type":"text","value":"Instalación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más que instalación yo diría que es descarga y ejecución pero bueno mantengamos el orden un poco :P."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nTenemos varias opciones, definidas también según nuestro sistema operativo: "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/"},"children":[{"type":"text","value":"Linux"}]},{"type":"text","value":", "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/"},"children":[{"type":"text","value":"Windows"}]},{"type":"text","value":" o "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/master/tutorial/install-mongodb-on-os-x/"},"children":[{"type":"text","value":"MacOS"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn general es bastante sencillo, se instala/descarga y se ejecuta definiendo el path donde se guardará nuestra base de datos, en mi caso trabajo en el blog con MacOS asi que los ejemplos pueden estar un poco más enfocados a este sistema operativo pero intentaré ser lo más genérico posible."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nUna vez instalado y ejecutado (cada uno que situe la base de datos donde quiera tal como lo pone en la documentación de instalación) por defecto estará esperando conexiones en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"puerto 27017"}]},{"type":"text","value":", pero se podría cambiar por cualquier otro sin problema."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn windows se gestiona su arranque y detenimiento con comandos específicos que vienen en la documentación, en el caso de linux y mac, si lo hemos realizado descargando e instalando tendremos un shell que es donde veremos los logs de consola que muestra mongo, para pararlo solo tenemos que cerrar la ventana o parar el proceso como cualquier otro."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien, una vez ejecutado, para trabajar de primeras con Mongo nos vamos a la carpeta donde tengamos descargado Mongo y dentro y podemos ejecutar"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bin/mongo\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos abrirá una conexión en shell con la base de datos"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.40.31.png","alt":"MongoDb Connect example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y esto sería lo que muestra el log de consola de Mongo"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.41.40.png","alt":"Connection log example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una vez conectados, veamos algunos comandos básicos de uso de MongoDB."}]},{"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":"show dbs"}]},{"type":"text","value":": Nos muestra las bases de datos que tenemos actualmente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[]},{"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/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.45.29.png","alt":"show dbs example"},"children":[]}]},{"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":"use nameDB"}]},{"type":"text","value":": Para hacer gestiones en una base de datos específica. Esto también lo usaríamos para crear bases de datos nuevas (OJO hasta que no introduzcamos datos no nos aparecería)"}]},{"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/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.47.06.png","alt":"use dbName example"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.51.56.png","alt":"Create new db"},"children":[]}]},{"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":"show collections"}]},{"type":"text","value":": Muestra las colecciones existentes en esa base de datos (para haceros una idea serían algo así como las tablas en bases de datos relacionales)"}]},{"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/2017/10/Captura-de-pantalla-2017-10-12-a-las-21.48.56.png","alt":"show collections example"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi la base de datos es nueva de primeras no habría nada, las colecciones se crearián cuando insertemos algo (al igual que cualquier base de datos nueva), entonces vamos a insertar algo. Los datos en "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Mongo"}]},{"type":"text","value":" tienen un estilo similar "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"json"}]},{"type":"text","value":", al estilo clave => valor"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Batman\", powers: \"Money\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Al insertar algo correctamente la consola nos lo indicaría"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.18.06.png","alt":"Document inserted"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una vez insertado si ahora hacemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"show dbs"}]},{"type":"text","value":" nos mostraría la nueva base de datos, y lo mismo al hacer "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"show collections"}]},{"type":"text","value":" tras seleccionar esa base de datos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.20.30.png","alt":"Show new collections"},"children":[]}]},{"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":"Ver lo que tiene una colección"}]},{"type":"text","value":": Para ver lo que tiene una colección lo hacemos con "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"db.collectionName.find()"}]},{"type":"text","value":", es decir:"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"También podemos ponerle "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":".pretty()"}]},{"type":"text","value":" al final para que nos lo muestre en un formato quizá más cómodo si tenemos varios objetos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.22.35.png","alt":"Find documents example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis tenemos una nueva propiedad en nuestro objeto que es "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":", esta propiedad es un identificador único de objeto que le asigna "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Mongo"}]},{"type":"text","value":" por defecto a cada elemtento insertado. Vamos a crear alguno más para probar a borrar y actualizar alguno"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Superman\", powers: \"is Super, no more\"})\ndb.heros.insert({name: \"Goku\", powers: \"Super Saiyan\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora hacemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"find"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.31.53.png","alt":"Find with more documents"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tenemos varios documentos, ahora vamos a eliminar alguno para probar, por ejemplo borremos a Superman. Os podéis imaginar pero veamos"}]},{"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":"Eliminar un elemento"}]},{"type":"text","value":": Lo hacemos de manera similar al "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"insert"}]},{"type":"text","value":" con "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"db.colectionName.remove(idObject)"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.remove({_id: ObjectId(\"59e1e758c5662c1d57baf70f\")})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos indica que ha eliminado un elemento y si hacemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"find"}]},{"type":"text","value":" de nuevo tenemos solo dos elementos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.50.41.png","alt":"Remove one item"},"children":[]}]},{"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":"Actualizar un elemento"}]},{"type":"text","value":": Sigue la misma teoria que el resto, pero en este caso, a parte del criterio de búsqueda del objeto tenemos que indicarle también que es lo que actualizamos. En este caso en lugar de usar el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"id"}]},{"type":"text","value":" para encontrar un objeto lo haremos con otra propiedad, por ejemplo el nombre"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({name: \"Batman\"}, {$set: {powers: \"Ninjitsu\"}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO con $set, si no lo ponemos así nos sustituiría todo el elemento por lo que le hubieramos pasado"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tras ejecutarlo, como siempre, la consola nos indica lo que ha hecho y si buscamos a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Batman"}]},{"type":"text","value":" veremos como ha cambiado su propiedad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"powers"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-12.58.56.png","alt":"Batman powers update"},"children":[]}]},{"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":"Crear indices"}]},{"type":"text","value":": Si vamos a buscar mucho por cierta propiedad en nuestros documentos dentro de mongo lo ideal es crear indices, ya que agilizan las búsquedas bastante, sobre todo cuando tenemos muchos elementos. Para ello es tan fácil como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"createIndex"}]},{"type":"text","value":" y dentro el orden del índice."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.createIndex({name: 1, powers: -1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este índice lo que le hemos puesto es que cree un índice primero por "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" con orden "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"ascendente"}]},{"type":"text","value":" y eso mismo si el nombre es el mismo que lo ordene por la propiedad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"powers"}]},{"type":"text","value":" de forma "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"descendente"}]},{"type":"text","value":" (creo que el +1 -1 está más o menos claro). Si queremos ver los índices que tenemos creados solo tenemos que hacer "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"getIndexes()"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.getIndexes()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y nos devolverá algo como esto"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.10.43.png","alt":"Index examples"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis ya existia un índice ascendente por "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"_id"}]},{"type":"text","value":" y luego esta el nuestro que acabamos de crear. Podemos ver más opciones con los índices en la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/indexes/"},"children":[{"type":"text","value":"documentación oficial"}]}]},{"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":"Eliminar una colección entera"}]},{"type":"text","value":": Fácil "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"db.colectionName.drop()"}]}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.ninjas.drop()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Al no tener ninguna tabla más o colección nos eliminará también la base de datos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-14-a-las-13.25.34.png","alt":"Captura-de-pantalla-2017-10-14-a-las-13.25.34"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"De momento lo vamos a dejar con la base de datos eliminada en el próximo post la crearemos de nuevo con otros elementos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estas serían las opciones más básicas, como tal en la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual"},"children":[{"type":"text","value":"documentación oficial"}]},{"type":"text","value":" tenemos muchas más."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un abrazoooorrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"quesmongodb","heading":"¿Qué es MongoDB?"},{"id":"instalacin","heading":"Instalació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__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"}}}}},{"node":{"id":"Ghost__Post__5a3a19cf84f3c8302096922d","title":"MongoDB Ninja(IV): Index Ninja","slug":"mongodb-ninja-iv-index-ninja","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/MongoBanner.png","excerpt":"Hablemos más profundamente sobre los índices,\n\n¿Qué son los índices?\nLos índices son una forma muy eficiente de buscar los datos por un valor\nespecífico y nos evita tener que recorrer toda la colección en busca de un dato\nespecífico.\nLos índices en las bases de datos tradicionales se basan en Binary Tree Sort, y\nMongo también.\nVeamos de una forma muy resumida como funcionaría este tipo de algoritmo.\n\nBinary Tree Sort\nPara que nos hagamos una idea, es un tipo específico de ordenación que tiene\nes","custom_excerpt":null,"visibility":"public","created_at_pretty":"20 Dec 2017","published_at_pretty":"23 Dec 2017","updated_at_pretty":"19 Jan 2018","created_at":"2017-12-20T09:05:35.000+01:00","published_at":"2017-12-23T20:59:52.000+01:00","updated_at":"2018-01-19T14:06:31.000+01:00","meta_title":"Mongo DB Ninja(IV): Index Ninja","meta_description":"Veamos en profundidad todo el poder que nos ofrece MongoDB gracias a la indexación avanzada.","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":"Hablemos más profundamente sobre los índices,\n\n¿Qué son los índices?\nLos índices son una forma muy eficiente de buscar los datos por un valor\nespecífico y nos evita tener que recorrer toda la colección en busca de un dato\nespecífico.\nLos índices en las bases de datos tradicionales se basan en Binary Tree Sort, y\nMongo también.\nVeamos de una forma muy resumida como funcionaría este tipo de algoritmo.\n\nBinary Tree Sort\nPara que nos hagamos una idea, es un tipo específico de ordenación que tiene\nesta pinta\n\n\n\nSupongamos entonces que buscamos el número 10, en la búsqueda lo que hace es\ncomprobar los números en la posición en la que está y sigue estos pasos:\n\n * ¿El número que busco es menor que 8? No.\n * ¿Está entre 8 - 12? Sí. Paso la búsqueda por la rama central.\n\nBásicamente sigue este orden:\n\n * Si es menor que el número más a la izquierda pasamos la búsqueda por la rama\n   que esté más a la izquierda.\n * Si está entre números lo mando por la rama que comprenda esos números.\n * Si el número es mayor que el número que esta más a la derecha envío la\n   búsqueda por la rama que está más a la derecha.\n\nY así con tantos niveles como tenga el árbol. Aunque en conjunto pueda ser algo\nmás complicado que esto, pero esta es la teoría fundamental de este algoritmo de\nordenación/búsqueda. Por dar un dato extra la fórmula de lo que tarda en la\nbúsqueda sería:\n\nO(log(n))\n\n\nCreo que no tengo la capacidad para explicar bien la fórmula, tenéis un montón\nde información al respecto por internet. Info\n[https://es.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation]\n\nY, ¿que hace la indexación con este algoritmo?...a parte de ordenar los datos de\nesa manera, intenta que un bloque de números entre en un sector del disco, lo\nque hace que en una sola pasada sea capaz de leer todos los números de un bloque\ny así en conjunto se consigue que la búsqueda de elementos sea realmente rápida.\n\nY después de comentar sobre BTS (Binary Tree Search) continuemos hablando de los\níndices.\n\nTipos de índices\nAhora viene el cambio de concepto, ya hemos visto en post anteriores como se\nhacian los índices, digamos, simples\n\ndb.collectionName.createIndex({nombreDelCampo: Ascendente/descendente})\n\ndb.heros.createIndex({money:1})\n\n\nEstos son los índices más habituales y son los que usan BTS realmente, pero\ntenemos otros 2 tipos de índices que no usan este mecanismo de ordenación:\n\n * Full text Index: Indices de texto libre. Nos permite buscar el texto que hay\n   en los documentos, es una búsqueda tipo Google. Al generar este tipo de\n   índice crea una base de datos grande con todos los documentos de tipo texto\n   (según los criterios que indiquemos) y a la hora de buscar nos muestras los\n   elementos por relevancia (cuanto más aparezca la palabra que buscamos en el\n   documento, más relevante se vuelve)\n * Geospatial Index: Indices de búsqueda geoespacial, que nos permiten manejar\n   datos geográficos, latitudes y longitudes pero no solo puntos si no, nos\n   permiten hacer búsquedas por zonas (en plan datos a mi alrededor o a X Km o\n   si tengo por ejemplo una línea de las de Google maps ruta/origen/destino\n   podríamos buscar lo que está cerca de la línea). Esto se vuelve muy útil para\n   aplicaciones móviles por ejemplo.\n\nFull text Index\nPrimero veamos como crear este tipo de índice:\n\ndb.nameCollection.createIndex({\"fieldName\": \"text\"})\n\ndb.heros.createIndex({ name: \"text\"})\n\n\nSi os fijáis un poco, se crean de la misma forma que habitualmente, solo que en\nlugar de indicarle la dirección del índice(ascendente/descendente con +/-1) lo\nque hacemos es indicarle que es de tipo text.\nEsto nos crea una especie de índice invertido, en el que en lugar de indexar al\nestilo \"esta palabra está en todos estos documentos\", lo que hace es darle la\nvuelta, es decir, este documento tiene estas palabras.\nSi hacemos la prueba con el campo name de nuestra colección (sé que no tiene\nsentido es un campo muy pequeño pero para hacer las pruebas nos vale) y\nmostramos los índices:\n\ndb.heros.getIndexes()\n\n\n\n\nVemos como cambia bastante la configuración de uno a otro (el de arriba sería el\nnormal que hicimos con el campo money y el de abajo sería el nuevo).\nPara hacer la prueba vamos a cambiarle el nombre a Batman por un párrafo de\ntexto como este:\n\n\"Hero can be anyone. Even a man knowing something as simple and reassuring as\nputting a coat around a young boy shoulders to let him know the world hadn't\nended.\"\n\nPara hacerlo, ya sabéis con:\n\ndb.heros.update({_id:ObjectId(\"59e1ff63c5662c1d57baf715\")},{$set: {name:\"Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.\"}})\n\n\nPerfecto, y ahora para buscar en este formato:\n\ndb.collectionName.find({$text: {$search: \"\"}})\n\n\nDentro del habitual find para filtrar tenemos:\n\n * $text: Con esto le indicamos que haga una búsqueda de tipo texto.\n * $search: Con search lo que hacemos es indicarle que busque por algo.\n\nHagamos alguna búsqueda para ver que pasa:\n\ndb.heros.find({$text: {$search: \"coat\"}}).pretty()\n\n\n\n\nComo véis lo encuentra sin problemas. Las búsquedas de este tipo en mongo\nparecen ser bastante inteligentes, ignoran las típicas palabras comodines como\npueden ser en ingles un \"a\" o \"the\" y se centra en el resto, también busca por\nraiz de palabra, es decir, por palabras que contengan la palabra que estamos\nbuscando (OJO tienen que ser palabras en sí y no mezclas de comodines como \nsome..), por ejemplo:\n\ndb.heros.find({$text: {$search: \"put\"}}).pretty()\n\n\n\nUn detalle es que el crea el índice en un idioma específico, por eso puede\nignorar ciertas palabras (están soportados la mayoría de los idiomas) y en el\ncaso de que no se le indicara el idioma en el índice, este seguiría siendo\nfuncional pero no tan efectivo ya que nos metería palabras innecesarias en las\nbúsquedas pero a grandes rasgos funcionaría perfectamente.\n\nComo extra comentar que las búsquedas son caseInsensitive, es decir, ignora si\nla palabra está en mayúsculas o en minúsculas y también ignora los acentos\n(ambas opciones son modificables y lo veremos más abajo)\n\nImportanto datos\nAntes de continuar necesitamos una colección con algo más de información, para\nello nos vamos a descargar una de ejemplo oficial de Mongo desde:\nAQUI\n[https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json] \n(recomiendo botón derecho- guardar como)\n\nAhora vamos a importarla, para ello nos salimos fuera de la shell de mongo y en\nla misma ruta donde hacíamos\n\nbin/mongo\n\n\nEjecutamos lo siguiente\n\n./mongoimport -c collectionTest -d databaseTest ../primer-dataset.json\n\n\nSi no esta en esa ruta, buscar el ejecutable mongoimport, y lo que hacemos es\nmeter los datos dentro de una colección nombre collectionTest que a su vez\nestará dentro de una base de datos llamada databaseTest (lo último es el fichero\nJSON que nos hemos descargado)\n\nVeamos como son los documentos que tiene esta colección, usamos:\n\ndb.collectionTest.findOne()\n\n\nY veremos algo similar a esto:\n\n\n\nTenemos coordenadas, que nos serán útiles cuando trabajemos con los índices\ngeoespaciales, y tenemos varios campos de texto como \"street\", \"name\" o\n\"cuisine\". Con esto lo que vamos a ver es como podemos gestionar nuestros\níndices para que diferencie la importancia de unos campos de texto u otros y así\npoder hacer nuestras búsquedas más eficaces. Para ello tenemos la propiedad\nweights , que mejor que explicarlo creo que es verlo en un ejemplo de uso:\n\ndb.collectionTest.createIndex({name: \"text\",\"address.street\": \"text\",cuisine: \"text\"},{weights:{name: 5, cuisine: 8, \"address.street\": 10}})\n\n\nSi os fijáis hemos creado un índice con los tres campos que he comentado antes,\ny a continuación le he puesto unos pesos específicos a cada uno, cuanto más alto\nmás importante es el campo. OJO para los subdocumentos es necesario poner\ncomillas a los nombres de los campos en este caso sería el campo address:{\nstreet}.\nHe puesto esos números pensando qué a lo hora de buscar un restaurante a no ser\nque busques un restaurante en concreto con el nombre exacto, sueles buscar una\ncalle a ver que tiene, o lo mejor buscas por un tipo de cocina, pero esto es\nsolo un ejemplo podéis usar la lógica que más os guste. En una aplicación en\nproducción esto habrá que pensarlo más detenidamente.\n\nBueno ahora vamos a probar una búsqueda, y para que sea más visual vamos a\nsolicitarle a Mongo que nos añada una puntuación a la búsqueda. Lo más fácil es\nverlo con un ejemplo:\n\ndb.collectionTest.find({$text: {$search: \"irish\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n\n\nVayamos por orden:\n\n * $text:{$search: \"irish\"}: Esto ya lo hemos visto que es la palabra por la que\n   estamos buscando.\n * score: {$meta: \"textScore\"}: Aquí le indicamos que nos genere un campo con la\n   puntuación del texto.\n * name:1, cuisine:1, \"address.street\":1,_id:0: Si os acordáis de esto, le\n   estamos diciendo los campos que queremos ver para que no nos saque todos,\n   name, cuisine y address.street, y ademas que nos quite el _id que nos\n   molesta.\n * sort({score:{$meta: \"textScore\"}}): Por último le decimos que nos ordene los\n   resultados por la puntuación que ha recibido.\n\nAl ejecutarlo obtenemos esto:\n\n\n\nVemos que obtenemos varios resultados (si escribimos it nos saldrán más) y que\nempiezan por 12.55 de puntuación. En este caso la puntuación es debida a que\nviene en cuisine y que ocupa gran parte del campo name si os fijáis va bajando\nla puntuación siempre que el campo name tiene más palabras(y no son comodines\ncomo The o a). Como detalle haceros a la idea de que estamos filtrando unos\n25000 documentos que yo creo que no está nada mal lo que tarda en devolver los\nresultados\n\nBueno supongo que váis viendo un poco como funcionan las búsquedas de texto.\nHabréis visto que en el campo street no tenemos coincidiencias, vamos a buscar\nalgo relacionado con una calle.\n\ndb.collectionTest.find({$text: {$search: \"Jamaica\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n\n\n\n\nVeis que sigue el mismo concepto pero esta vez con la calle y el nombre. Estas\nbúsquedas las podemos hacer tan complicadas como queramos igual que el resto que\nya vimos anteriormente.\n\nComo extra recalcar que podemos:\n\n * Modificar el lenguaje del índice con $language: Idioma, por ejemplo\n\n$languaje: Spanish\n\n\n * Indicarle que sea $caseSensitive:\n\n$caseSensitive: True (default false)\n\n\n * Soportar acentos con $diacriticSensitive:\n\n$diacriticSensitive: True (default false)\n\n\nCreo que con esto es suficiente para que se entienda como funcionan los Full\ntext index y podáis hacer los vuestros según requiera vuestra aplicación. Ahora\nempecemos con los Indices Geoespaciales\n\nGeospatial Index\nEn Mongo tenemos dos tipos de índices Geoespaciales:\n\n * 2d: Basicamente representa una cuadrícula sobre un plano, pensado para\n   superficies pequeñas, por ejemplo un campo de fútbol. También si no tenemos\n   pensado usar geoJSON o nos da igual la curvatura de la tierra.\n   \n   \n * 2dsphere: El caso contrario, es decir, situamos cosas sobre la tierra. Este\n   es el más común realmente. Esta basado en el estandar WGS 84, un estandar que\n   intenta simular en una espera a la tierra.\n   \n   \n\nLas posiciones en cualquier mapa están representadas por unas coordenadas, estas\ncoordenadas están representadas en:\n\n * Latitud: Distancia desde el Ecuador al norte y al sur. De 0 a 90 al norte, de\n   0 a -90 al sur.\n   \n   \n * Longitud: Distancia desde el Meridiano de Greenwich (seían los 0 Grados).\n   Para localizaciones al este sería de 0 a 180 y para localizaciones al oeste\n   de 0 a -180\n   \n   \n\nOJO las coordenadas en MongoDB se guardan Longitud/Latitud y en Google Maps\nLatitud/Longitud\n\nBien ya sabemos un poco de que hablamos, ahora veamos como crear un índice de\neste tipo:\n\ndb.collectionName.createIndex({campo_localización: \"2dsphere\"})\n\n\n(Como véis siempre tiene el mismo estilo la creación de índices) Por si acaso no\nlo imagináis ya, el campo de localización tiene ser unas coordenadas o datos al\nestilo GeoJSON [http://geojson.org/]\n\nVamos a crear un índice con los datos de las coordenadas que tenemos en la\ncolección que usamos antes, para ello basta con crear el índice:\n\ndb.collectionTest.createIndex({\"address.coord\": \"2dsphere\"})\n\n\nYa tenemos nuestro índice creado, ahora vamos a ver como es uno de nuestros\nelementos con coordenadas\n\ndb.collectionTest.findOne()\n\n\n\n\nY por si acaso nos vamos a ir a Google Maps a comprobar los datos, OJO recordad\nque están al revés\n\n\n\nCoincide con nuestra calle ¿no?. Bueno pues ahora vamos a probar a buscar por\ncoordenadas directamente, es decir, que me muestre quien contiene la coordenada\nque pasamos. OJO la búsqueda que vamos a realizar ahora lo que hace es buscar\ndocumentos que contengan esa coordenada, si tuvieramos una base de datos con las\ncoordenadas de los paises enteros podríamos sacar el pais al que pertenece\n\ndb.collectionTest.find(\n    {\"address.coord\":\n        {$geoIntersects:\n            {$geometry:\n                {type: \"Point\", coordinates: [-73.9549067, 40.6971322]}}}},{\"name\":1}).pretty()\n\n\nVeamos que estamos pidiendo aqui:\n\n * address.coord: Esta es fácil le indicamos donde queremos que busque.\n * geoIntersects: Es uno de los operadores para buscar con los índices\n   Geoespaciales (tener en cuenta que todo esto esta más pensado para documentos\n   tipo GeoJSON). En este caso lo que hace es buscar geometrias que se crucen\n   con la coordenada que le indiquemos. Veremos alguno más, tenemos 4 distintos. \n   Geospatial query operators\n   [https://docs.mongodb.com/manual/geospatial-queries/#geospatial-query-operators]\n * geometry: Propiedad para indicarle lo que queremos buscar.\n * type: Dentro de type le indicamos el tipo de coordenadas que le vamos a\n   buscar, siempre pensando en formato GeoJSON. En este caso hemos puesto un\n   tipo \"Punto\". Existen varios distintos, lo mejor es que los veáis en la\n   documentación: GeoJSON Objects\n   [https://docs.mongodb.com/manual/reference/geojson/]\n * coordinates y name: Básicamente son las coordenadas por las que queremos\n   buscar y lo que queremos que nos devuelva.\n\nEn este caso la búsqueda parece que es sobre una ubicación específica porque no\ntenemos coordenadas al estilo \"Polígono\", pero es más que nada para que veamos\nque funciona bien. Al ejecutarlo vemos que nos devuelve el restaurante que\nhabíamos seleccionado\n\n\n\nProbemos ahora algo con algo más de \"chicha\", vamos a buscar restaurantes que\nestén a unos 500 metros del que hemos seleccionado antes. Para ello en lugar de\nusar el operador geoIntersect vamos a usar el operador near\n\ndb.collectionTest.find({\n    \"address.coord\":{\n        $near:{\n            $geometry:{\n                type: \"Point\", \n                coordinates: [-73.9549067, 40.6971322]},\n                $maxDistance: 500\n                }\n              }\n     },{\"name\":1})\n\n\nComo propiedad extra que no habíamos visto antes tenemos $maxDistance, en la\ncual indicamos una distancia máxima en metros.\n\n\n\nHe cogido las coordenadas de los dos primeros restaurantes y si las ponemos en \nGoogle Maps (recordemos que tenemos que invertir las coordenadas ya que google\nlas guarda al revés), y esto es lo que aparece\n\n\n\nComo véis está a menos de 500 metros, por lo que podemos confirmar que realmente\nfunciona.\n\nAhora pensemos en otro escenario, las aplicaciones móviles, en la mayoria de los\ncasos cuando buscamos lo que tenemos alrededor en el mapa lo que queremos ver es\nque se vé en la pantalla, es decir, que hay en la cuadrícula del mapa que estoy\nmostrando. Esto también lo podemos hacer con MongoDB, solo tenemos que indicarle\ncuales son las coordenadas que se están mostrando actualmente.\n\ndb.collectionTest.find({\"address.coord\":{\n        $geoWithin: {\n            $geometry:{\n                type: \"Polygon\", \n                coordinates:[\n                    [[-73,40],\n                    [-75,40],\n                    [-75,42],\n                    [-73,42],\n                    [-73,40]]]}}}},\n                    {\"name\":1,\"address.coord\":1,\"_id\":0})\n\n\nSi os fijáis en la query hemos cambiado la propiedad a geoWithin, es decir, lo\nque esté dentro de esa zona, y le pasamos un polígono, con 5 coordenadas\n(imagináos que es una línea que vamos dibujando, que empieza en un punto y tiene\nque acabar en el mismo punto, por eso son 5 ;) )\nAquí tendríamos una cuadrícula que sería más o menos esta zona\n\n\n\nSi la ejecutamos veremos que nos saca un montón de coincidencias que son las que\nestán dentro de esa zona (que yo diría que son todos jejeje)\n\n\n\nSi por ejemplo contamos los elementos:\n\ndb.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-73,40],[-75,40],[-75,42],[-73,42],[-73,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0}).count()\n\n\nNos salen:\n\n\n\nVamos a probar a cambiar, todas las coordenadas -73 por -74 y así comprobamos\ncomo nos filtra de verdad:\n\ndb.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-74,40],[-75,40],[-75,42],[-74,42],[-74,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0})\n\n\nSi ejecutamos vemos como todos los documentos empiezan a partir de la longitud\n-74\n\n\n\nSi contamos ahora los documentos tenemos\n\n\n\nComo vemos realmente si nos está filtrando por una zona en específico. Esto es\nun ejemplo de algunas cosas típicas que podemos necesitar hacer.\n\nSubiendo de nivel\nBien ahora subamos un poco más el nivel, vamos a ver como podemos programar\ndirectamente en la consola de MongoDB, en este ejemplo que vamos a ver\nseguiremos usando los índices geoespaciales porque son los últimos que hemos\nvisto, pero tener en cuenta que se podría hacer como queráis.\n\nLo que vamos hacer va a ser recorrer todos los restaurantes que tenemos en la\ncolección de test que estamos usando y vamos a ponerles una propiedad nueva\nindicando cual es el primer restaurante que esté a menos 500 mt (si hay alguno\nclaro).\n\nUna cosa muy interesante y util en mongo es que podemos usar variables.....y\nbueno podemos usar un estilo de programación similar al de JavaScript. Entonces\npara este ejemplo vamos a usar el siguiente código (podéis copiar y pegar ;) )\n\nvar restaurants = db.collectionTest.find()\n\nwhile(restaurants.hasNext()){\n\n    var rest = restaurants.next();\n    var coords = rest.address.coord;\n    \n    if (coords != \"\"){\n        var neighbour = db.collectionTest.find({\"address.coord\":{$near:\n            {$geometry:{type: \"Point\", coordinates: coords},$maxDistance: 500}}}).skip(1).limit(1);\n    \n        if (neighbour[0] != undefined){\n            var neigh = neighbour[0];\n\n            db.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n        } \n    \n    }\n}\n\n\nEn general supongo que más o menos se entiende el código (y no está con la\nintención de ser el mejor ni el más bonito solo es un ejemplo) pero por si acaso\nvoy a explicarlo paso a paso.\n\nLo primero almacenamos todos nuestros documentos en una variable, se podría\nhaber limitado la cantidad o cualquier cosa que se os ocurra pero así\ncomprobamos lo que tarda en modificarnos mas de 25000 documentos.\n\nvar restaurants = db.collectionTest.find()\n\n\nY a continuación por ejemplo haremos un bucle while recorriendo los documentos\nque tenemos almacenados en la variable restaurants\n\nwhile(restaurants.hasNext()){\n\n\nAlmacenamos el documento en cuestión y las coordenadas de que tiene ese\ndocumento:\n\nvar rest = restaurants.next();\nvar coords = rest.address.coord;\n\n\nTenemos algunos documentos que tienen la propiedad coord vacía por lo que lo\ncomprobamos\n\nif (coords != \"\"){\n\n\nLo siguiente será buscar cuál es el restaurante más cercano, sin ser el propio\nrestaurante propietario de esas coordenadas, al buscar por coordenadas nos\nidentifica el primero como el propio restaurante, por eso ignoramos el primer\nresultado. Y como solo queremos encontrar uno de \"los vecinos\" limitamos la\nbúsqueda a 1\n\n var neighbour = db.collectionTest.find({\n     \"address.coord\":{\n         $near:{\n             $geometry:{\n                 type: \"Point\",\n                 coordinates: coords}\n                 ,$maxDistance: 500}}}).skip(1).limit(1);\n\n\nComo es posible que no tengamos nungún documento(restaurante) a menos de 500\nmetros tenemos que comprobar antes de hacer nada para que el proceso continue\n\nif (neighbour[0] != undefined){\n\n\nY por último actualizamos el restaurante usando el \"_id\" añadiendole la\npropiedad \"address.neighbour\" con el nombre del restaurante vecino\n\ndb.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n\n\nEl proceso tardará un rato, y una vez terminado, si buscamos algún documento\n\ndb.collectionTest.findOne({},{\"name\":1,\"address\":1,\"_id\":0})\n\n\nVeremos como nos ha añadido una nueva propiedad con el nombre de algún\nrestaurante cercano\n\n\n\nEsto es solo un pequeño ejemplo de lo que podemos hacer con MongoDB, podemos\ncomplicar las búsquedas tanto como queramos (aunque lo suyo es que una parte lo\nhiciera nuestra app no la base de datos sola ;) )\n\nEspero que con este post seais capaces de mejorar vuestros índices y hacer que\nvuestras búsquedas en vuestras bases de datos MongoDB sean mucho más eficientes.\nDe momento vamos a dejar el tema de los índices, lo próximo que veremos será el \nAggregation Framework, si no sabéis lo que es no os preocupeis lo veremos en\ndetalle. Nos veeemoosssss un abrazooorrrrrr","html":"<!--kg-card-begin: markdown--><p>Hablemos más profundamente sobre los índices,</p>\n<h2 id=\"qusonlosndices\">¿Qué son los índices?</h2>\n<p>Los índices son una forma muy eficiente de buscar los datos por un valor específico y nos evita tener que recorrer toda la colección en busca de un dato específico.<br>\nLos índices en las bases de datos tradicionales se basan en <strong>Binary Tree Sort</strong>, y Mongo también.<br>\nVeamos de una forma muy resumida como funcionaría este tipo de algoritmo.</p>\n<h2 id=\"binarytreesort\">Binary Tree Sort</h2>\n<p>Para que nos hagamos una idea, es un tipo específico de ordenación que tiene esta pinta</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-16-a-las-9.04.36.png\" alt=\"Binary Tree Sort\"></p>\n<p>Supongamos entonces que buscamos el número 10, en la búsqueda lo que hace es comprobar los números en la posición en la que está y sigue estos pasos:</p>\n<ul>\n<li>¿El número que busco es menor que 8? No.</li>\n<li>¿Está entre 8 - 12? Sí. Paso la búsqueda por la rama central.</li>\n</ul>\n<p>Básicamente sigue este orden:</p>\n<ul>\n<li>Si es menor que el número más a la izquierda pasamos la búsqueda por la rama que esté más a la izquierda.</li>\n<li>Si está entre números lo mando por la rama que comprenda esos números.</li>\n<li>Si el número es mayor que el número que esta más a la derecha envío la búsqueda por la rama que está más a la derecha.</li>\n</ul>\n<p>Y así con tantos niveles como tenga el árbol. Aunque en conjunto pueda ser algo más complicado que esto, pero esta es la teoría fundamental de este algoritmo de ordenación/búsqueda. Por dar un dato extra la fórmula de lo que tarda en la búsqueda sería:</p>\n<pre><code>O(log(n))\n</code></pre>\n<p>Creo que no tengo la capacidad para explicar bien la fórmula, tenéis un montón de información al respecto por internet. <a href=\"https://es.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation\">Info</a></p>\n<p>Y, ¿que hace la indexación con este algoritmo?...a parte de ordenar los datos de esa manera, intenta que un bloque de números entre en un sector del disco, lo que hace que en una sola pasada sea capaz de leer todos los números de un bloque y así en conjunto se consigue que la búsqueda de elementos sea realmente rápida.</p>\n<p>Y después de comentar sobre BTS (Binary Tree Search) continuemos hablando de los índices.</p>\n<h2 id=\"tiposdendices\">Tipos de índices</h2>\n<p>Ahora viene el cambio de concepto, ya hemos visto en post anteriores como se hacian los índices, digamos, <strong>simples</strong></p>\n<pre><code>db.collectionName.createIndex({nombreDelCampo: Ascendente/descendente})\n\ndb.heros.createIndex({money:1})\n</code></pre>\n<p>Estos son los índices más habituales y son los que usan <strong>BTS</strong> realmente, pero tenemos otros 2 tipos de índices que no usan este mecanismo de ordenación:</p>\n<ul>\n<li><strong>Full text Index</strong>: Indices de texto libre. Nos permite buscar el texto que hay en los documentos, es una búsqueda tipo Google. Al generar este tipo de índice crea una base de datos grande con todos los documentos de tipo texto (según los criterios que indiquemos) y a la hora de buscar nos muestras los elementos por relevancia (cuanto más aparezca la palabra que buscamos en el documento, más relevante se vuelve)</li>\n<li><strong>Geospatial Index</strong>: Indices de búsqueda geoespacial, que nos permiten manejar datos geográficos, latitudes y longitudes pero no solo puntos si no, nos permiten hacer búsquedas por zonas (en plan datos a mi alrededor o a X Km o si tengo por ejemplo una línea de las de Google maps ruta/origen/destino podríamos buscar lo que está cerca de la línea). Esto se vuelve muy útil para aplicaciones móviles por ejemplo.</li>\n</ul>\n<h2 id=\"fulltextindex\">Full text Index</h2>\n<p>Primero veamos como crear este tipo de índice:</p>\n<pre><code>db.nameCollection.createIndex({&quot;fieldName&quot;: &quot;text&quot;})\n\ndb.heros.createIndex({ name: &quot;text&quot;})\n</code></pre>\n<p>Si os fijáis un poco, se crean de la misma forma que habitualmente, solo que en lugar de indicarle la dirección del índice(ascendente/descendente con +/-1) lo que hacemos es indicarle que es de tipo <strong>text</strong>.<br>\nEsto nos crea una especie de índice invertido, en el que en lugar de indexar al estilo &quot;esta palabra está en todos estos documentos&quot;, lo que hace es darle la vuelta, es decir, este documento tiene estas palabras.<br>\nSi hacemos la prueba con el campo name de nuestra colección (sé que no tiene sentido es un campo muy pequeño pero para hacer las pruebas nos vale) y mostramos los índices:</p>\n<pre><code>db.heros.getIndexes()\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-8.45.23.png\" alt=\"full text index example\"></p>\n<p>Vemos como cambia bastante la configuración de uno a otro (el de arriba sería el normal que hicimos con el campo money y el de abajo sería el nuevo).<br>\nPara hacer la prueba vamos a cambiarle el nombre a Batman por un párrafo de texto como este:</p>\n<p><em>&quot;Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.&quot;</em></p>\n<p>Para hacerlo, ya sabéis con:</p>\n<pre><code>db.heros.update({_id:ObjectId(&quot;59e1ff63c5662c1d57baf715&quot;)},{$set: {name:&quot;Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.&quot;}})\n</code></pre>\n<p>Perfecto, y ahora para buscar en este formato:</p>\n<pre><code>db.collectionName.find({$text: {$search: &quot;&quot;}})\n</code></pre>\n<p>Dentro del habitual find para filtrar tenemos:</p>\n<ul>\n<li><strong>$text</strong>: Con esto le indicamos que haga una búsqueda de tipo texto.</li>\n<li><strong>$search</strong>: Con search lo que hacemos es indicarle que busque por algo.</li>\n</ul>\n<p>Hagamos alguna búsqueda para ver que pasa:</p>\n<pre><code>db.heros.find({$text: {$search: &quot;coat&quot;}}).pretty()\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.02.28.png\" alt=\"full text index example2\"></p>\n<p>Como véis lo encuentra sin problemas. Las búsquedas de este tipo en mongo parecen ser bastante inteligentes, ignoran las típicas palabras comodines como pueden ser en ingles un <em>&quot;a&quot;</em> o <em>&quot;the&quot;</em> y se centra en el resto, también busca por raiz de palabra, es decir, por palabras que contengan la palabra que estamos buscando (OJO tienen que ser palabras en sí y no mezclas de comodines como <em>some..</em>), por ejemplo:</p>\n<p>db.heros.find({$text: {$search: &quot;put&quot;}}).pretty()</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.07.04.png\" alt=\"full text index example3\"></p>\n<p>Un detalle es que el crea el índice en un idioma específico, por eso puede ignorar ciertas palabras (están soportados la mayoría de los idiomas) y en el caso de que no se le indicara el idioma en el índice, este seguiría siendo funcional pero no tan efectivo ya que nos metería palabras innecesarias en las búsquedas pero a grandes rasgos funcionaría perfectamente.</p>\n<p>Como extra comentar que las búsquedas son <strong>caseInsensitive</strong>, es decir, ignora si la palabra está en mayúsculas o en minúsculas y también ignora los acentos (ambas opciones son modificables y lo veremos más abajo)</p>\n<h3 id=\"importantodatos\">Importanto datos</h3>\n<p>Antes de continuar necesitamos una colección con algo más de información, para ello nos vamos a descargar una de ejemplo oficial de Mongo desde:<br>\n<a href=\"https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json\">AQUI</a> (recomiendo botón derecho- guardar como)</p>\n<p>Ahora vamos a importarla, para ello nos salimos fuera de la shell de mongo y en la misma ruta donde hacíamos</p>\n<pre><code>bin/mongo\n</code></pre>\n<p>Ejecutamos lo siguiente</p>\n<pre><code>./mongoimport -c collectionTest -d databaseTest ../primer-dataset.json\n</code></pre>\n<p>Si no esta en esa ruta, buscar el ejecutable <strong>mongoimport</strong>, y lo que hacemos es meter los datos dentro de una colección nombre <em>collectionTest</em> que a su vez estará dentro de una base de datos llamada <em>databaseTest</em> (lo último es el fichero JSON que nos hemos descargado)</p>\n<p>Veamos como son los documentos que tiene esta colección, usamos:</p>\n<pre><code>db.collectionTest.findOne()\n</code></pre>\n<p>Y veremos algo similar a esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-21.59.54.png\" alt=\"mongoImport\"></p>\n<p>Tenemos coordenadas, que nos serán útiles cuando trabajemos con los índices geoespaciales, y tenemos varios campos de texto como &quot;street&quot;, &quot;name&quot; o &quot;cuisine&quot;. Con esto lo que vamos a ver es como podemos gestionar nuestros índices para que diferencie la importancia de unos campos de texto u otros y así poder hacer nuestras búsquedas más eficaces. Para ello tenemos la propiedad weights , que mejor que explicarlo creo que es verlo en un ejemplo de uso:</p>\n<pre><code>db.collectionTest.createIndex({name: &quot;text&quot;,&quot;address.street&quot;: &quot;text&quot;,cuisine: &quot;text&quot;},{weights:{name: 5, cuisine: 8, &quot;address.street&quot;: 10}})\n</code></pre>\n<p>Si os fijáis hemos creado un índice con los tres campos que he comentado antes, y a continuación le he puesto unos pesos específicos a cada uno, cuanto más alto más importante es el campo. <strong>OJO para los subdocumentos es necesario poner comillas a los nombres de los campos en este caso sería el campo address:{ street}.</strong><br>\nHe puesto esos números pensando qué a lo hora de buscar un restaurante a no ser que busques un restaurante en concreto con el nombre exacto, sueles buscar una calle a ver que tiene, o lo mejor buscas por un tipo de cocina, pero esto es solo un ejemplo podéis usar la lógica que más os guste. En una aplicación en producción esto habrá que pensarlo más detenidamente.</p>\n<p>Bueno ahora vamos a probar una búsqueda, y para que sea más visual vamos a solicitarle a Mongo que nos añada una puntuación a la búsqueda. Lo más fácil es verlo con un ejemplo:</p>\n<pre><code>db.collectionTest.find({$text: {$search: &quot;irish&quot;}},{score: {$meta: &quot;textScore&quot;}, name:1, cuisine:1, &quot;address.street&quot;:1,_id:0}).sort({score:{$meta: &quot;textScore&quot;}})\n</code></pre>\n<p>Vayamos por orden:</p>\n<ul>\n<li><strong>$text:{$search: &quot;irish&quot;}</strong>: Esto ya lo hemos visto que es la palabra por la que estamos buscando.</li>\n<li><strong>score: {$meta: &quot;textScore&quot;}</strong>: Aquí le indicamos que nos genere un campo con la puntuación del texto.</li>\n<li><strong>name:1, cuisine:1, &quot;address.street&quot;:1,_id:0</strong>: Si os acordáis de esto, le estamos diciendo los campos que queremos ver para que no nos saque todos, name, cuisine y address.street, y ademas que nos quite el _id que nos molesta.</li>\n<li><strong>sort({score:{$meta: &quot;textScore&quot;}})</strong>: Por último le decimos que nos ordene los resultados por la puntuación que ha recibido.</li>\n</ul>\n<p>Al ejecutarlo obtenemos esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.26.25.png\" alt=\"Example textScore\"></p>\n<p>Vemos que obtenemos varios resultados (si escribimos it nos saldrán más) y que empiezan por 12.55 de puntuación. En este caso la puntuación es debida a que viene en cuisine y que ocupa gran parte del campo name si os fijáis va bajando la puntuación siempre que el campo name tiene más palabras(y no son comodines como The o a). Como detalle haceros a la idea de que estamos filtrando unos 25000 documentos que yo creo que no está nada mal lo que tarda en devolver los resultados</p>\n<p>Bueno supongo que váis viendo un poco como funcionan las búsquedas de texto. Habréis visto que en el campo street no tenemos coincidiencias, vamos a buscar algo relacionado con una calle.</p>\n<pre><code>db.collectionTest.find({$text: {$search: &quot;Jamaica&quot;}},{score: {$meta: &quot;textScore&quot;}, name:1, cuisine:1, &quot;address.street&quot;:1,_id:0}).sort({score:{$meta: &quot;textScore&quot;}})\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.29.56.png\" alt=\"Example textScore\"></p>\n<p>Veis que sigue el mismo concepto pero esta vez con la calle y el nombre. Estas búsquedas las podemos hacer tan complicadas como queramos igual que el resto que ya vimos anteriormente.</p>\n<p>Como extra recalcar que podemos:</p>\n<ul>\n<li>Modificar el lenguaje del índice con <strong>$language: Idioma</strong>, por ejemplo</li>\n</ul>\n<pre><code>$languaje: Spanish\n</code></pre>\n<ul>\n<li>Indicarle que sea <strong>$caseSensitive</strong>:</li>\n</ul>\n<pre><code>$caseSensitive: True (default false)\n</code></pre>\n<ul>\n<li>Soportar acentos con <strong>$diacriticSensitive</strong>:</li>\n</ul>\n<pre><code>$diacriticSensitive: True (default false)\n</code></pre>\n<p>Creo que con esto es suficiente para que se entienda como funcionan los <em><strong>Full text index</strong></em> y podáis hacer los vuestros según requiera vuestra aplicación. Ahora empecemos con los <em><strong>Indices Geoespaciales</strong></em></p>\n<h2 id=\"geospatialindex\">Geospatial Index</h2>\n<p>En Mongo tenemos dos tipos de índices <em>Geoespaciales</em>:</p>\n<ul>\n<li>\n<p><strong>2d</strong>: Basicamente representa una cuadrícula sobre un plano, pensado para superficies pequeñas, por ejemplo un campo de fútbol. También si no tenemos pensado usar geoJSON o nos da igual la curvatura de la tierra.</p>\n</li>\n<li>\n<p><strong>2dsphere</strong>: El caso contrario, es decir, situamos cosas sobre la tierra. Este es el más común realmente. Esta basado en el estandar <em>WGS 84</em>, un estandar que intenta simular en una espera a la tierra.</p>\n</li>\n</ul>\n<p>Las posiciones en cualquier mapa están representadas por unas <em><strong>coordenadas</strong></em>, estas coordenadas están representadas en:</p>\n<ul>\n<li>\n<p><strong>Latitud</strong>: Distancia desde el Ecuador al norte y al sur. De 0 a 90 al norte, de 0 a -90 al sur.</p>\n</li>\n<li>\n<p><strong>Longitud</strong>: Distancia desde el <em><strong>Meridiano de Greenwich</strong></em> (seían los 0 Grados). Para localizaciones al este sería de 0 a 180 y para localizaciones al oeste de 0 a -180</p>\n</li>\n</ul>\n<p><strong>OJO las coordenadas en MongoDB se guardan Longitud/Latitud y en Google Maps Latitud/Longitud</strong></p>\n<p>Bien ya sabemos un poco de que hablamos, ahora veamos como crear un índice de este tipo:</p>\n<pre><code>db.collectionName.createIndex({campo_localización: &quot;2dsphere&quot;})\n</code></pre>\n<p>(Como véis siempre tiene el mismo estilo la creación de índices) Por si acaso no lo imagináis ya, el campo de localización tiene ser unas <strong>coordenadas</strong> o datos al estilo <strong><a href=\"http://geojson.org/\">GeoJSON</a></strong></p>\n<p>Vamos a crear un índice con los datos de las coordenadas que tenemos en la colección que usamos antes, para ello basta con crear el índice:</p>\n<pre><code>db.collectionTest.createIndex({&quot;address.coord&quot;: &quot;2dsphere&quot;})\n</code></pre>\n<p>Ya tenemos nuestro índice creado, ahora vamos a ver como es uno de nuestros elementos con coordenadas</p>\n<pre><code>db.collectionTest.findOne()\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.22.08.png\" alt=\"Document Example\"></p>\n<p>Y por si acaso nos vamos a ir a Google Maps a comprobar los datos, <strong>OJO recordad que están al revés</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.23.32.png\" alt=\"Google Maps Check\"></p>\n<p>Coincide con nuestra calle ¿no?. Bueno pues ahora vamos a probar a buscar por coordenadas directamente, es decir, que me muestre quien contiene la coordenada que pasamos. <strong>OJO la búsqueda que vamos a realizar ahora lo que hace es buscar documentos que contengan esa coordenada, si tuvieramos una base de datos con las coordenadas de los paises enteros podríamos sacar el pais al que pertenece</strong></p>\n<pre><code>db.collectionTest.find(\n    {&quot;address.coord&quot;:\n        {$geoIntersects:\n            {$geometry:\n                {type: &quot;Point&quot;, coordinates: [-73.9549067, 40.6971322]}}}},{&quot;name&quot;:1}).pretty()\n</code></pre>\n<p>Veamos que estamos pidiendo aqui:</p>\n<ul>\n<li><strong>address.coord</strong>: Esta es fácil le indicamos donde queremos que busque.</li>\n<li><strong>geoIntersects</strong>: Es uno de los operadores para buscar con los índices Geoespaciales (tener en cuenta que todo esto esta más pensado para documentos tipo <em>GeoJSON</em>). En este caso lo que hace es buscar geometrias que se crucen con la coordenada que le indiquemos. Veremos alguno más, tenemos 4 distintos. <a href=\"https://docs.mongodb.com/manual/geospatial-queries/#geospatial-query-operators\">Geospatial query operators</a></li>\n<li><strong>geometry</strong>: Propiedad para indicarle lo que queremos buscar.</li>\n<li><strong>type</strong>: Dentro de type le indicamos el tipo de coordenadas que le vamos a buscar, siempre pensando en formato GeoJSON. En este caso hemos puesto un tipo &quot;Punto&quot;. Existen varios distintos, lo mejor es que los veáis en la documentación: <a href=\"https://docs.mongodb.com/manual/reference/geojson/\">GeoJSON Objects</a></li>\n<li><strong>coordinates y name</strong>: Básicamente son las coordenadas por las que queremos buscar y lo que queremos que nos devuelva.</li>\n</ul>\n<p>En este caso la búsqueda parece que es sobre una ubicación específica porque no tenemos coordenadas al estilo <em>&quot;Polígono&quot;</em>, pero es más que nada para que veamos que funciona bien. Al ejecutarlo vemos que nos devuelve el restaurante que habíamos seleccionado</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.33.48.png\" alt=\"Search Example\"></p>\n<p>Probemos ahora algo con algo más de &quot;chicha&quot;, vamos a buscar restaurantes que estén a unos 500 metros del que hemos seleccionado antes. Para ello en lugar de usar el operador <em>geoIntersect</em> vamos a usar el operador <em>near</em></p>\n<pre><code>db.collectionTest.find({\n    &quot;address.coord&quot;:{\n        $near:{\n            $geometry:{\n                type: &quot;Point&quot;, \n                coordinates: [-73.9549067, 40.6971322]},\n                $maxDistance: 500\n                }\n              }\n     },{&quot;name&quot;:1})\n</code></pre>\n<p>Como propiedad extra que no habíamos visto antes tenemos <strong>$maxDistance</strong>, en la cual indicamos una distancia máxima en metros.</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.34.27.png\" alt=\"Search Example with Metres\"></p>\n<p>He cogido las coordenadas de los dos primeros restaurantes y si las ponemos en <strong>Google Maps</strong> (recordemos que tenemos que invertir las coordenadas ya que google las guarda al revés), y esto es lo que aparece</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-9.21.20.png\" alt=\"Google Maps 500 mt example\"></p>\n<p>Como véis está a menos de 500 metros, por lo que podemos confirmar que realmente funciona.</p>\n<p>Ahora pensemos en otro escenario, las aplicaciones móviles, en la mayoria de los casos cuando buscamos lo que tenemos alrededor en el mapa lo que queremos ver es que se vé en la pantalla, es decir, que hay en la cuadrícula del mapa que estoy mostrando. Esto también lo podemos hacer con MongoDB, solo tenemos que indicarle cuales son las coordenadas que se están mostrando actualmente.</p>\n<pre><code>db.collectionTest.find({&quot;address.coord&quot;:{\n        $geoWithin: {\n            $geometry:{\n                type: &quot;Polygon&quot;, \n                coordinates:[\n                    [[-73,40],\n                    [-75,40],\n                    [-75,42],\n                    [-73,42],\n                    [-73,40]]]}}}},\n                    {&quot;name&quot;:1,&quot;address.coord&quot;:1,&quot;_id&quot;:0})\n</code></pre>\n<p>Si os fijáis en la query hemos cambiado la propiedad a <strong>geoWithin</strong>, es decir, lo que esté dentro de esa zona, y le pasamos un polígono, con 5 coordenadas (imagináos que es una línea que vamos dibujando, que empieza en un punto y tiene que acabar en el mismo punto, por eso son 5 ;) )<br>\nAquí tendríamos una cuadrícula que sería más o menos esta zona</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.02.34.png\" alt=\"Polygon Google Maps\"></p>\n<p>Si la ejecutamos veremos que nos saca un montón de coincidencias que son las que están dentro de esa zona (que yo diría que son todos jejeje)</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.06.42.png\" alt=\"Polygon Example Query\"></p>\n<p>Si por ejemplo contamos los elementos:</p>\n<pre><code>db.collectionTest.find({&quot;address.coord&quot;:{$geoWithin: {$geometry:{type: &quot;Polygon&quot;, coordinates:[[[-73,40],[-75,40],[-75,42],[-73,42],[-73,40]]]}}}},{&quot;name&quot;:1,&quot;address.coord&quot;:1,&quot;_id&quot;:0}).count()\n</code></pre>\n<p>Nos salen:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.09.53.png\" alt=\"Count Query\"></p>\n<p>Vamos a probar a cambiar, todas las coordenadas -73 por -74 y así comprobamos como nos filtra de verdad:</p>\n<pre><code>db.collectionTest.find({&quot;address.coord&quot;:{$geoWithin: {$geometry:{type: &quot;Polygon&quot;, coordinates:[[[-74,40],[-75,40],[-75,42],[-74,42],[-74,40]]]}}}},{&quot;name&quot;:1,&quot;address.coord&quot;:1,&quot;_id&quot;:0})\n</code></pre>\n<p>Si ejecutamos vemos como todos los documentos empiezan a partir de la longitud -74</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.11.24.png\" alt=\"Query with long -74\"></p>\n<p>Si contamos ahora los documentos tenemos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.12.48.png\" alt=\"Query -74 count\"></p>\n<p>Como vemos realmente si nos está filtrando por una zona en específico. Esto es un ejemplo de algunas cosas típicas que podemos necesitar hacer.</p>\n<h2 id=\"subiendodenivel\">Subiendo de nivel</h2>\n<p>Bien ahora subamos un poco más el nivel, vamos a ver como podemos programar directamente en la consola de MongoDB, en este ejemplo que vamos a ver seguiremos usando los índices <em>geoespaciales</em> porque son los últimos que hemos visto, pero tener en cuenta que se podría hacer como queráis.</p>\n<p>Lo que vamos hacer va a ser recorrer todos los restaurantes que tenemos en la colección de test que estamos usando y vamos a ponerles una propiedad nueva indicando cual es el primer restaurante que esté a menos 500 mt (si hay alguno claro).</p>\n<p>Una cosa muy interesante y util en mongo es que podemos usar variables.....y bueno podemos usar un estilo de programación similar al de <em>JavaScript</em>. Entonces para este ejemplo vamos a usar el siguiente código (podéis copiar y pegar ;) )</p>\n<pre><code>var restaurants = db.collectionTest.find()\n\nwhile(restaurants.hasNext()){\n\n    var rest = restaurants.next();\n    var coords = rest.address.coord;\n    \n    if (coords != &quot;&quot;){\n        var neighbour = db.collectionTest.find({&quot;address.coord&quot;:{$near:\n            {$geometry:{type: &quot;Point&quot;, coordinates: coords},$maxDistance: 500}}}).skip(1).limit(1);\n    \n        if (neighbour[0] != undefined){\n            var neigh = neighbour[0];\n\n            db.collectionTest.update({&quot;_id&quot;: rest._id},\n                {$set: {\n                    &quot;address.neighbour&quot;: neigh.name \n                }}\n            );\n        } \n    \n    }\n}\n</code></pre>\n<p>En general supongo que más o menos se entiende el código (y no está con la intención de ser el mejor ni el más bonito solo es un ejemplo) pero por si acaso voy a explicarlo paso a paso.</p>\n<p>Lo primero almacenamos todos nuestros documentos en una variable, se podría haber limitado la cantidad o cualquier cosa que se os ocurra pero así comprobamos lo que tarda en modificarnos mas de 25000 documentos.</p>\n<pre><code>var restaurants = db.collectionTest.find()\n</code></pre>\n<p>Y a continuación por ejemplo haremos un bucle while recorriendo los documentos que tenemos almacenados en la variable <em>restaurants</em></p>\n<pre><code>while(restaurants.hasNext()){\n</code></pre>\n<p>Almacenamos el documento en cuestión y las coordenadas de que tiene ese documento:</p>\n<pre><code>var rest = restaurants.next();\nvar coords = rest.address.coord;\n</code></pre>\n<p>Tenemos algunos documentos que tienen la propiedad <em>coord</em> vacía por lo que lo comprobamos</p>\n<pre><code>if (coords != &quot;&quot;){\n</code></pre>\n<p>Lo siguiente será buscar cuál es el restaurante más cercano, sin ser el propio restaurante propietario de esas coordenadas, al buscar por coordenadas nos identifica el primero como el propio restaurante, por eso ignoramos el primer resultado. Y como solo queremos encontrar uno de <em>&quot;los vecinos&quot;</em> limitamos la búsqueda a 1</p>\n<pre><code> var neighbour = db.collectionTest.find({\n     &quot;address.coord&quot;:{\n         $near:{\n             $geometry:{\n                 type: &quot;Point&quot;,\n                 coordinates: coords}\n                 ,$maxDistance: 500}}}).skip(1).limit(1);\n</code></pre>\n<p>Como es posible que no tengamos nungún documento(restaurante) a menos de 500 metros tenemos que comprobar antes de hacer nada para que el proceso continue</p>\n<pre><code>if (neighbour[0] != undefined){\n</code></pre>\n<p>Y por último actualizamos el restaurante usando el <em>&quot;_id&quot;</em> añadiendole la propiedad <em>&quot;address.neighbour&quot;</em> con el nombre del restaurante vecino</p>\n<pre><code>db.collectionTest.update({&quot;_id&quot;: rest._id},\n                {$set: {\n                    &quot;address.neighbour&quot;: neigh.name \n                }}\n            );\n</code></pre>\n<p>El proceso tardará un rato, y una vez terminado, si buscamos algún documento</p>\n<pre><code>db.collectionTest.findOne({},{&quot;name&quot;:1,&quot;address&quot;:1,&quot;_id&quot;:0})\n</code></pre>\n<p>Veremos como nos ha añadido una nueva propiedad con el nombre de algún restaurante cercano</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-28-a-las-17.49.58.png\" alt=\"Neighbour restaurant's\"></p>\n<p>Esto es solo un pequeño ejemplo de lo que podemos hacer con MongoDB, podemos complicar las búsquedas tanto como queramos (aunque lo suyo es que una parte lo hiciera nuestra app no la base de datos sola ;) )</p>\n<p>Espero que con este post seais capaces de mejorar vuestros índices y hacer que vuestras búsquedas en vuestras bases de datos MongoDB sean mucho más eficientes. De momento vamos a dejar el tema de los índices, lo próximo que veremos será el <strong>Aggregation Framework</strong>, si no sabéis lo que es no os preocupeis lo veremos en detalle. Nos veeemoosssss un abrazooorrrrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-iv-index-ninja/","canonical_url":null,"uuid":"45e90e60-7350-484d-8e27-36d2cb4cf334","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"5a3a19cf84f3c8302096922d","reading_time":14,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Hablemos más profundamente sobre los índices,</p>\n<h2 id=\"qusonlosndices\">¿Qué son los índices?</h2>\n<p>Los índices son una forma muy eficiente de buscar los datos por un valor específico y nos evita tener que recorrer toda la colección en busca de un dato específico.<br>\nLos índices en las bases de datos tradicionales se basan en <strong>Binary Tree Sort</strong>, y Mongo también.<br>\nVeamos de una forma muy resumida como funcionaría este tipo de algoritmo.</p>\n<h2 id=\"binarytreesort\">Binary Tree Sort</h2>\n<p>Para que nos hagamos una idea, es un tipo específico de ordenación que tiene esta pinta</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-16-a-las-9.04.36.png\" alt=\"Binary Tree Sort\"></p>\n<p>Supongamos entonces que buscamos el número 10, en la búsqueda lo que hace es comprobar los números en la posición en la que está y sigue estos pasos:</p>\n<ul>\n<li>¿El número que busco es menor que 8? No.</li>\n<li>¿Está entre 8 - 12? Sí. Paso la búsqueda por la rama central.</li>\n</ul>\n<p>Básicamente sigue este orden:</p>\n<ul>\n<li>Si es menor que el número más a la izquierda pasamos la búsqueda por la rama que esté más a la izquierda.</li>\n<li>Si está entre números lo mando por la rama que comprenda esos números.</li>\n<li>Si el número es mayor que el número que esta más a la derecha envío la búsqueda por la rama que está más a la derecha.</li>\n</ul>\n<p>Y así con tantos niveles como tenga el árbol. Aunque en conjunto pueda ser algo más complicado que esto, pero esta es la teoría fundamental de este algoritmo de ordenación/búsqueda. Por dar un dato extra la fórmula de lo que tarda en la búsqueda sería:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">O(log(n))\n</code></pre></div>\n<p>Creo que no tengo la capacidad para explicar bien la fórmula, tenéis un montón de información al respecto por internet. <a href=\"https://es.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation\">Info</a></p>\n<p>Y, ¿que hace la indexación con este algoritmo?...a parte de ordenar los datos de esa manera, intenta que un bloque de números entre en un sector del disco, lo que hace que en una sola pasada sea capaz de leer todos los números de un bloque y así en conjunto se consigue que la búsqueda de elementos sea realmente rápida.</p>\n<p>Y después de comentar sobre BTS (Binary Tree Search) continuemos hablando de los índices.</p>\n<h2 id=\"tiposdendices\">Tipos de índices</h2>\n<p>Ahora viene el cambio de concepto, ya hemos visto en post anteriores como se hacian los índices, digamos, <strong>simples</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionName.createIndex({nombreDelCampo: Ascendente/descendente})\n\ndb.heros.createIndex({money:1})\n</code></pre></div>\n<p>Estos son los índices más habituales y son los que usan <strong>BTS</strong> realmente, pero tenemos otros 2 tipos de índices que no usan este mecanismo de ordenación:</p>\n<ul>\n<li><strong>Full text Index</strong>: Indices de texto libre. Nos permite buscar el texto que hay en los documentos, es una búsqueda tipo Google. Al generar este tipo de índice crea una base de datos grande con todos los documentos de tipo texto (según los criterios que indiquemos) y a la hora de buscar nos muestras los elementos por relevancia (cuanto más aparezca la palabra que buscamos en el documento, más relevante se vuelve)</li>\n<li><strong>Geospatial Index</strong>: Indices de búsqueda geoespacial, que nos permiten manejar datos geográficos, latitudes y longitudes pero no solo puntos si no, nos permiten hacer búsquedas por zonas (en plan datos a mi alrededor o a X Km o si tengo por ejemplo una línea de las de Google maps ruta/origen/destino podríamos buscar lo que está cerca de la línea). Esto se vuelve muy útil para aplicaciones móviles por ejemplo.</li>\n</ul>\n<h2 id=\"fulltextindex\">Full text Index</h2>\n<p>Primero veamos como crear este tipo de índice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.nameCollection.createIndex({\"fieldName\": \"text\"})\n\ndb.heros.createIndex({ name: \"text\"})\n</code></pre></div>\n<p>Si os fijáis un poco, se crean de la misma forma que habitualmente, solo que en lugar de indicarle la dirección del índice(ascendente/descendente con +/-1) lo que hacemos es indicarle que es de tipo <strong>text</strong>.<br>\nEsto nos crea una especie de índice invertido, en el que en lugar de indexar al estilo \"esta palabra está en todos estos documentos\", lo que hace es darle la vuelta, es decir, este documento tiene estas palabras.<br>\nSi hacemos la prueba con el campo name de nuestra colección (sé que no tiene sentido es un campo muy pequeño pero para hacer las pruebas nos vale) y mostramos los índices:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.getIndexes()\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-8.45.23.png\" alt=\"full text index example\"></p>\n<p>Vemos como cambia bastante la configuración de uno a otro (el de arriba sería el normal que hicimos con el campo money y el de abajo sería el nuevo).<br>\nPara hacer la prueba vamos a cambiarle el nombre a Batman por un párrafo de texto como este:</p>\n<p><em>\"Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.\"</em></p>\n<p>Para hacerlo, ya sabéis con:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.update({_id:ObjectId(\"59e1ff63c5662c1d57baf715\")},{$set: {name:\"Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.\"}})\n</code></pre></div>\n<p>Perfecto, y ahora para buscar en este formato:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionName.find({$text: {$search: \"\"}})\n</code></pre></div>\n<p>Dentro del habitual find para filtrar tenemos:</p>\n<ul>\n<li><strong>$text</strong>: Con esto le indicamos que haga una búsqueda de tipo texto.</li>\n<li><strong>$search</strong>: Con search lo que hacemos es indicarle que busque por algo.</li>\n</ul>\n<p>Hagamos alguna búsqueda para ver que pasa:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.find({$text: {$search: \"coat\"}}).pretty()\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.02.28.png\" alt=\"full text index example2\"></p>\n<p>Como véis lo encuentra sin problemas. Las búsquedas de este tipo en mongo parecen ser bastante inteligentes, ignoran las típicas palabras comodines como pueden ser en ingles un <em>\"a\"</em> o <em>\"the\"</em> y se centra en el resto, también busca por raiz de palabra, es decir, por palabras que contengan la palabra que estamos buscando (OJO tienen que ser palabras en sí y no mezclas de comodines como <em>some..</em>), por ejemplo:</p>\n<p>db.heros.find({$text: {$search: \"put\"}}).pretty()</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.07.04.png\" alt=\"full text index example3\"></p>\n<p>Un detalle es que el crea el índice en un idioma específico, por eso puede ignorar ciertas palabras (están soportados la mayoría de los idiomas) y en el caso de que no se le indicara el idioma en el índice, este seguiría siendo funcional pero no tan efectivo ya que nos metería palabras innecesarias en las búsquedas pero a grandes rasgos funcionaría perfectamente.</p>\n<p>Como extra comentar que las búsquedas son <strong>caseInsensitive</strong>, es decir, ignora si la palabra está en mayúsculas o en minúsculas y también ignora los acentos (ambas opciones son modificables y lo veremos más abajo)</p>\n<h3 id=\"importantodatos\">Importanto datos</h3>\n<p>Antes de continuar necesitamos una colección con algo más de información, para ello nos vamos a descargar una de ejemplo oficial de Mongo desde:<br>\n<a href=\"https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json\">AQUI</a> (recomiendo botón derecho- guardar como)</p>\n<p>Ahora vamos a importarla, para ello nos salimos fuera de la shell de mongo y en la misma ruta donde hacíamos</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">bin/mongo\n</code></pre></div>\n<p>Ejecutamos lo siguiente</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">./mongoimport -c collectionTest -d databaseTest ../primer-dataset.json\n</code></pre></div>\n<p>Si no esta en esa ruta, buscar el ejecutable <strong>mongoimport</strong>, y lo que hacemos es meter los datos dentro de una colección nombre <em>collectionTest</em> que a su vez estará dentro de una base de datos llamada <em>databaseTest</em> (lo último es el fichero JSON que nos hemos descargado)</p>\n<p>Veamos como son los documentos que tiene esta colección, usamos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.findOne()\n</code></pre></div>\n<p>Y veremos algo similar a esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-21.59.54.png\" alt=\"mongoImport\"></p>\n<p>Tenemos coordenadas, que nos serán útiles cuando trabajemos con los índices geoespaciales, y tenemos varios campos de texto como \"street\", \"name\" o \"cuisine\". Con esto lo que vamos a ver es como podemos gestionar nuestros índices para que diferencie la importancia de unos campos de texto u otros y así poder hacer nuestras búsquedas más eficaces. Para ello tenemos la propiedad weights , que mejor que explicarlo creo que es verlo en un ejemplo de uso:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.createIndex({name: \"text\",\"address.street\": \"text\",cuisine: \"text\"},{weights:{name: 5, cuisine: 8, \"address.street\": 10}})\n</code></pre></div>\n<p>Si os fijáis hemos creado un índice con los tres campos que he comentado antes, y a continuación le he puesto unos pesos específicos a cada uno, cuanto más alto más importante es el campo. <strong>OJO para los subdocumentos es necesario poner comillas a los nombres de los campos en este caso sería el campo address:{ street}.</strong><br>\nHe puesto esos números pensando qué a lo hora de buscar un restaurante a no ser que busques un restaurante en concreto con el nombre exacto, sueles buscar una calle a ver que tiene, o lo mejor buscas por un tipo de cocina, pero esto es solo un ejemplo podéis usar la lógica que más os guste. En una aplicación en producción esto habrá que pensarlo más detenidamente.</p>\n<p>Bueno ahora vamos a probar una búsqueda, y para que sea más visual vamos a solicitarle a Mongo que nos añada una puntuación a la búsqueda. Lo más fácil es verlo con un ejemplo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({$text: {$search: \"irish\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n</code></pre></div>\n<p>Vayamos por orden:</p>\n<ul>\n<li><strong>$text:{$search: \"irish\"}</strong>: Esto ya lo hemos visto que es la palabra por la que estamos buscando.</li>\n<li><strong>score: {$meta: \"textScore\"}</strong>: Aquí le indicamos que nos genere un campo con la puntuación del texto.</li>\n<li><strong>name:1, cuisine:1, \"address.street\":1,_id:0</strong>: Si os acordáis de esto, le estamos diciendo los campos que queremos ver para que no nos saque todos, name, cuisine y address.street, y ademas que nos quite el _id que nos molesta.</li>\n<li><strong>sort({score:{$meta: \"textScore\"}})</strong>: Por último le decimos que nos ordene los resultados por la puntuación que ha recibido.</li>\n</ul>\n<p>Al ejecutarlo obtenemos esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.26.25.png\" alt=\"Example textScore\"></p>\n<p>Vemos que obtenemos varios resultados (si escribimos it nos saldrán más) y que empiezan por 12.55 de puntuación. En este caso la puntuación es debida a que viene en cuisine y que ocupa gran parte del campo name si os fijáis va bajando la puntuación siempre que el campo name tiene más palabras(y no son comodines como The o a). Como detalle haceros a la idea de que estamos filtrando unos 25000 documentos que yo creo que no está nada mal lo que tarda en devolver los resultados</p>\n<p>Bueno supongo que váis viendo un poco como funcionan las búsquedas de texto. Habréis visto que en el campo street no tenemos coincidiencias, vamos a buscar algo relacionado con una calle.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({$text: {$search: \"Jamaica\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.29.56.png\" alt=\"Example textScore\"></p>\n<p>Veis que sigue el mismo concepto pero esta vez con la calle y el nombre. Estas búsquedas las podemos hacer tan complicadas como queramos igual que el resto que ya vimos anteriormente.</p>\n<p>Como extra recalcar que podemos:</p>\n<ul>\n<li>Modificar el lenguaje del índice con <strong>$language: Idioma</strong>, por ejemplo</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$languaje: Spanish\n</code></pre></div>\n<ul>\n<li>Indicarle que sea <strong>$caseSensitive</strong>:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$caseSensitive: True (default false)\n</code></pre></div>\n<ul>\n<li>Soportar acentos con <strong>$diacriticSensitive</strong>:</li>\n</ul>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$diacriticSensitive: True (default false)\n</code></pre></div>\n<p>Creo que con esto es suficiente para que se entienda como funcionan los <em><strong>Full text index</strong></em> y podáis hacer los vuestros según requiera vuestra aplicación. Ahora empecemos con los <em><strong>Indices Geoespaciales</strong></em></p>\n<h2 id=\"geospatialindex\">Geospatial Index</h2>\n<p>En Mongo tenemos dos tipos de índices <em>Geoespaciales</em>:</p>\n<ul>\n<li>\n<p><strong>2d</strong>: Basicamente representa una cuadrícula sobre un plano, pensado para superficies pequeñas, por ejemplo un campo de fútbol. También si no tenemos pensado usar geoJSON o nos da igual la curvatura de la tierra.</p>\n</li>\n<li>\n<p><strong>2dsphere</strong>: El caso contrario, es decir, situamos cosas sobre la tierra. Este es el más común realmente. Esta basado en el estandar <em>WGS 84</em>, un estandar que intenta simular en una espera a la tierra.</p>\n</li>\n</ul>\n<p>Las posiciones en cualquier mapa están representadas por unas <em><strong>coordenadas</strong></em>, estas coordenadas están representadas en:</p>\n<ul>\n<li>\n<p><strong>Latitud</strong>: Distancia desde el Ecuador al norte y al sur. De 0 a 90 al norte, de 0 a -90 al sur.</p>\n</li>\n<li>\n<p><strong>Longitud</strong>: Distancia desde el <em><strong>Meridiano de Greenwich</strong></em> (seían los 0 Grados). Para localizaciones al este sería de 0 a 180 y para localizaciones al oeste de 0 a -180</p>\n</li>\n</ul>\n<p><strong>OJO las coordenadas en MongoDB se guardan Longitud/Latitud y en Google Maps Latitud/Longitud</strong></p>\n<p>Bien ya sabemos un poco de que hablamos, ahora veamos como crear un índice de este tipo:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionName.createIndex({campo_localización: \"2dsphere\"})\n</code></pre></div>\n<p>(Como véis siempre tiene el mismo estilo la creación de índices) Por si acaso no lo imagináis ya, el campo de localización tiene ser unas <strong>coordenadas</strong> o datos al estilo <strong><a href=\"http://geojson.org/\">GeoJSON</a></strong></p>\n<p>Vamos a crear un índice con los datos de las coordenadas que tenemos en la colección que usamos antes, para ello basta con crear el índice:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.createIndex({\"address.coord\": \"2dsphere\"})\n</code></pre></div>\n<p>Ya tenemos nuestro índice creado, ahora vamos a ver como es uno de nuestros elementos con coordenadas</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.findOne()\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.22.08.png\" alt=\"Document Example\"></p>\n<p>Y por si acaso nos vamos a ir a Google Maps a comprobar los datos, <strong>OJO recordad que están al revés</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.23.32.png\" alt=\"Google Maps Check\"></p>\n<p>Coincide con nuestra calle ¿no?. Bueno pues ahora vamos a probar a buscar por coordenadas directamente, es decir, que me muestre quien contiene la coordenada que pasamos. <strong>OJO la búsqueda que vamos a realizar ahora lo que hace es buscar documentos que contengan esa coordenada, si tuvieramos una base de datos con las coordenadas de los paises enteros podríamos sacar el pais al que pertenece</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find(\n    {\"address.coord\":\n        {$geoIntersects:\n            {$geometry:\n                {type: \"Point\", coordinates: [-73.9549067, 40.6971322]}}}},{\"name\":1}).pretty()\n</code></pre></div>\n<p>Veamos que estamos pidiendo aqui:</p>\n<ul>\n<li><strong>address.coord</strong>: Esta es fácil le indicamos donde queremos que busque.</li>\n<li><strong>geoIntersects</strong>: Es uno de los operadores para buscar con los índices Geoespaciales (tener en cuenta que todo esto esta más pensado para documentos tipo <em>GeoJSON</em>). En este caso lo que hace es buscar geometrias que se crucen con la coordenada que le indiquemos. Veremos alguno más, tenemos 4 distintos. <a href=\"https://docs.mongodb.com/manual/geospatial-queries/#geospatial-query-operators\">Geospatial query operators</a></li>\n<li><strong>geometry</strong>: Propiedad para indicarle lo que queremos buscar.</li>\n<li><strong>type</strong>: Dentro de type le indicamos el tipo de coordenadas que le vamos a buscar, siempre pensando en formato GeoJSON. En este caso hemos puesto un tipo \"Punto\". Existen varios distintos, lo mejor es que los veáis en la documentación: <a href=\"https://docs.mongodb.com/manual/reference/geojson/\">GeoJSON Objects</a></li>\n<li><strong>coordinates y name</strong>: Básicamente son las coordenadas por las que queremos buscar y lo que queremos que nos devuelva.</li>\n</ul>\n<p>En este caso la búsqueda parece que es sobre una ubicación específica porque no tenemos coordenadas al estilo <em>\"Polígono\"</em>, pero es más que nada para que veamos que funciona bien. Al ejecutarlo vemos que nos devuelve el restaurante que habíamos seleccionado</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.33.48.png\" alt=\"Search Example\"></p>\n<p>Probemos ahora algo con algo más de \"chicha\", vamos a buscar restaurantes que estén a unos 500 metros del que hemos seleccionado antes. Para ello en lugar de usar el operador <em>geoIntersect</em> vamos a usar el operador <em>near</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({\n    \"address.coord\":{\n        $near:{\n            $geometry:{\n                type: \"Point\", \n                coordinates: [-73.9549067, 40.6971322]},\n                $maxDistance: 500\n                }\n              }\n     },{\"name\":1})\n</code></pre></div>\n<p>Como propiedad extra que no habíamos visto antes tenemos <strong>$maxDistance</strong>, en la cual indicamos una distancia máxima en metros.</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.34.27.png\" alt=\"Search Example with Metres\"></p>\n<p>He cogido las coordenadas de los dos primeros restaurantes y si las ponemos en <strong>Google Maps</strong> (recordemos que tenemos que invertir las coordenadas ya que google las guarda al revés), y esto es lo que aparece</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-9.21.20.png\" alt=\"Google Maps 500 mt example\"></p>\n<p>Como véis está a menos de 500 metros, por lo que podemos confirmar que realmente funciona.</p>\n<p>Ahora pensemos en otro escenario, las aplicaciones móviles, en la mayoria de los casos cuando buscamos lo que tenemos alrededor en el mapa lo que queremos ver es que se vé en la pantalla, es decir, que hay en la cuadrícula del mapa que estoy mostrando. Esto también lo podemos hacer con MongoDB, solo tenemos que indicarle cuales son las coordenadas que se están mostrando actualmente.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({\"address.coord\":{\n        $geoWithin: {\n            $geometry:{\n                type: \"Polygon\", \n                coordinates:[\n                    [[-73,40],\n                    [-75,40],\n                    [-75,42],\n                    [-73,42],\n                    [-73,40]]]}}}},\n                    {\"name\":1,\"address.coord\":1,\"_id\":0})\n</code></pre></div>\n<p>Si os fijáis en la query hemos cambiado la propiedad a <strong>geoWithin</strong>, es decir, lo que esté dentro de esa zona, y le pasamos un polígono, con 5 coordenadas (imagináos que es una línea que vamos dibujando, que empieza en un punto y tiene que acabar en el mismo punto, por eso son 5 ;) )<br>\nAquí tendríamos una cuadrícula que sería más o menos esta zona</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.02.34.png\" alt=\"Polygon Google Maps\"></p>\n<p>Si la ejecutamos veremos que nos saca un montón de coincidencias que son las que están dentro de esa zona (que yo diría que son todos jejeje)</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.06.42.png\" alt=\"Polygon Example Query\"></p>\n<p>Si por ejemplo contamos los elementos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-73,40],[-75,40],[-75,42],[-73,42],[-73,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0}).count()\n</code></pre></div>\n<p>Nos salen:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.09.53.png\" alt=\"Count Query\"></p>\n<p>Vamos a probar a cambiar, todas las coordenadas -73 por -74 y así comprobamos como nos filtra de verdad:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-74,40],[-75,40],[-75,42],[-74,42],[-74,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0})\n</code></pre></div>\n<p>Si ejecutamos vemos como todos los documentos empiezan a partir de la longitud -74</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.11.24.png\" alt=\"Query with long -74\"></p>\n<p>Si contamos ahora los documentos tenemos</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.12.48.png\" alt=\"Query -74 count\"></p>\n<p>Como vemos realmente si nos está filtrando por una zona en específico. Esto es un ejemplo de algunas cosas típicas que podemos necesitar hacer.</p>\n<h2 id=\"subiendodenivel\">Subiendo de nivel</h2>\n<p>Bien ahora subamos un poco más el nivel, vamos a ver como podemos programar directamente en la consola de MongoDB, en este ejemplo que vamos a ver seguiremos usando los índices <em>geoespaciales</em> porque son los últimos que hemos visto, pero tener en cuenta que se podría hacer como queráis.</p>\n<p>Lo que vamos hacer va a ser recorrer todos los restaurantes que tenemos en la colección de test que estamos usando y vamos a ponerles una propiedad nueva indicando cual es el primer restaurante que esté a menos 500 mt (si hay alguno claro).</p>\n<p>Una cosa muy interesante y util en mongo es que podemos usar variables.....y bueno podemos usar un estilo de programación similar al de <em>JavaScript</em>. Entonces para este ejemplo vamos a usar el siguiente código (podéis copiar y pegar ;) )</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var restaurants = db.collectionTest.find()\n\nwhile(restaurants.hasNext()){\n\n    var rest = restaurants.next();\n    var coords = rest.address.coord;\n    \n    if (coords != \"\"){\n        var neighbour = db.collectionTest.find({\"address.coord\":{$near:\n            {$geometry:{type: \"Point\", coordinates: coords},$maxDistance: 500}}}).skip(1).limit(1);\n    \n        if (neighbour[0] != undefined){\n            var neigh = neighbour[0];\n\n            db.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n        } \n    \n    }\n}\n</code></pre></div>\n<p>En general supongo que más o menos se entiende el código (y no está con la intención de ser el mejor ni el más bonito solo es un ejemplo) pero por si acaso voy a explicarlo paso a paso.</p>\n<p>Lo primero almacenamos todos nuestros documentos en una variable, se podría haber limitado la cantidad o cualquier cosa que se os ocurra pero así comprobamos lo que tarda en modificarnos mas de 25000 documentos.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var restaurants = db.collectionTest.find()\n</code></pre></div>\n<p>Y a continuación por ejemplo haremos un bucle while recorriendo los documentos que tenemos almacenados en la variable <em>restaurants</em></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">while(restaurants.hasNext()){\n</code></pre></div>\n<p>Almacenamos el documento en cuestión y las coordenadas de que tiene ese documento:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var rest = restaurants.next();\nvar coords = rest.address.coord;\n</code></pre></div>\n<p>Tenemos algunos documentos que tienen la propiedad <em>coord</em> vacía por lo que lo comprobamos</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">if (coords != \"\"){\n</code></pre></div>\n<p>Lo siguiente será buscar cuál es el restaurante más cercano, sin ser el propio restaurante propietario de esas coordenadas, al buscar por coordenadas nos identifica el primero como el propio restaurante, por eso ignoramos el primer resultado. Y como solo queremos encontrar uno de <em>\"los vecinos\"</em> limitamos la búsqueda a 1</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> var neighbour = db.collectionTest.find({\n     \"address.coord\":{\n         $near:{\n             $geometry:{\n                 type: \"Point\",\n                 coordinates: coords}\n                 ,$maxDistance: 500}}}).skip(1).limit(1);\n</code></pre></div>\n<p>Como es posible que no tengamos nungún documento(restaurante) a menos de 500 metros tenemos que comprobar antes de hacer nada para que el proceso continue</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">if (neighbour[0] != undefined){\n</code></pre></div>\n<p>Y por último actualizamos el restaurante usando el <em>\"_id\"</em> añadiendole la propiedad <em>\"address.neighbour\"</em> con el nombre del restaurante vecino</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n</code></pre></div>\n<p>El proceso tardará un rato, y una vez terminado, si buscamos algún documento</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.collectionTest.findOne({},{\"name\":1,\"address\":1,\"_id\":0})\n</code></pre></div>\n<p>Veremos como nos ha añadido una nueva propiedad con el nombre de algún restaurante cercano</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-28-a-las-17.49.58.png\" alt=\"Neighbour restaurant&#x27;s\"></p>\n<p>Esto es solo un pequeño ejemplo de lo que podemos hacer con MongoDB, podemos complicar las búsquedas tanto como queramos (aunque lo suyo es que una parte lo hiciera nuestra app no la base de datos sola ;) )</p>\n<p>Espero que con este post seais capaces de mejorar vuestros índices y hacer que vuestras búsquedas en vuestras bases de datos MongoDB sean mucho más eficientes. De momento vamos a dejar el tema de los índices, lo próximo que veremos será el <strong>Aggregation Framework</strong>, si no sabéis lo que es no os preocupeis lo veremos en detalle. Nos veeemoosssss un abrazooorrrrrr</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":"Hablemos más profundamente sobre los índices,"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"qusonlosndices"},"children":[{"type":"text","value":"¿Qué son los índices?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Los índices son una forma muy eficiente de buscar los datos por un valor específico y nos evita tener que recorrer toda la colección en busca de un dato específico."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLos índices en las bases de datos tradicionales se basan en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Binary Tree Sort"}]},{"type":"text","value":", y Mongo también."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVeamos de una forma muy resumida como funcionaría este tipo de algoritmo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"binarytreesort"},"children":[{"type":"text","value":"Binary Tree Sort"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para que nos hagamos una idea, es un tipo específico de ordenación que tiene esta pinta"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-16-a-las-9.04.36.png","alt":"Binary Tree Sort"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Supongamos entonces que buscamos el número 10, en la búsqueda lo que hace es comprobar los números en la posición en la que está y sigue estos pasos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"¿El número que busco es menor que 8? No."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"¿Está entre 8 - 12? Sí. Paso la búsqueda por la rama central."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Básicamente sigue este orden:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si es menor que el número más a la izquierda pasamos la búsqueda por la rama que esté más a la izquierda."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si está entre números lo mando por la rama que comprenda esos números."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Si el número es mayor que el número que esta más a la derecha envío la búsqueda por la rama que está más a la derecha."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y así con tantos niveles como tenga el árbol. Aunque en conjunto pueda ser algo más complicado que esto, pero esta es la teoría fundamental de este algoritmo de ordenación/búsqueda. Por dar un dato extra la fórmula de lo que tarda en la búsqueda sería:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"O(log(n))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que no tengo la capacidad para explicar bien la fórmula, tenéis un montón de información al respecto por internet. "},{"type":"element","tagName":"a","properties":{"href":"https://es.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation"},"children":[{"type":"text","value":"Info"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y, ¿que hace la indexación con este algoritmo?...a parte de ordenar los datos de esa manera, intenta que un bloque de números entre en un sector del disco, lo que hace que en una sola pasada sea capaz de leer todos los números de un bloque y así en conjunto se consigue que la búsqueda de elementos sea realmente rápida."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y después de comentar sobre BTS (Binary Tree Search) continuemos hablando de los índices."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"tiposdendices"},"children":[{"type":"text","value":"Tipos de índices"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora viene el cambio de concepto, ya hemos visto en post anteriores como se hacian los índices, digamos, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"simples"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionName.createIndex({nombreDelCampo: Ascendente/descendente})\n\ndb.heros.createIndex({money:1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estos son los índices más habituales y son los que usan "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"BTS"}]},{"type":"text","value":" realmente, pero tenemos otros 2 tipos de índices que no usan este mecanismo de ordenació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":"Full text Index"}]},{"type":"text","value":": Indices de texto libre. Nos permite buscar el texto que hay en los documentos, es una búsqueda tipo Google. Al generar este tipo de índice crea una base de datos grande con todos los documentos de tipo texto (según los criterios que indiquemos) y a la hora de buscar nos muestras los elementos por relevancia (cuanto más aparezca la palabra que buscamos en el documento, más relevante se vuelve)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Geospatial Index"}]},{"type":"text","value":": Indices de búsqueda geoespacial, que nos permiten manejar datos geográficos, latitudes y longitudes pero no solo puntos si no, nos permiten hacer búsquedas por zonas (en plan datos a mi alrededor o a X Km o si tengo por ejemplo una línea de las de Google maps ruta/origen/destino podríamos buscar lo que está cerca de la línea). Esto se vuelve muy útil para aplicaciones móviles por ejemplo."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"fulltextindex"},"children":[{"type":"text","value":"Full text Index"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Primero veamos como crear este tipo de índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.nameCollection.createIndex({\"fieldName\": \"text\"})\n\ndb.heros.createIndex({ name: \"text\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis un poco, se crean de la misma forma que habitualmente, solo que en lugar de indicarle la dirección del índice(ascendente/descendente con +/-1) lo que hacemos es indicarle que es de tipo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"text"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEsto nos crea una especie de índice invertido, en el que en lugar de indexar al estilo \"esta palabra está en todos estos documentos\", lo que hace es darle la vuelta, es decir, este documento tiene estas palabras."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi hacemos la prueba con el campo name de nuestra colección (sé que no tiene sentido es un campo muy pequeño pero para hacer las pruebas nos vale) y mostramos los índices:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.getIndexes()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-8.45.23.png","alt":"full text index example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos como cambia bastante la configuración de uno a otro (el de arriba sería el normal que hicimos con el campo money y el de abajo sería el nuevo)."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPara hacer la prueba vamos a cambiarle el nombre a Batman por un párrafo de texto como este:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.\""}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para hacerlo, ya sabéis con:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.update({_id:ObjectId(\"59e1ff63c5662c1d57baf715\")},{$set: {name:\"Hero can be anyone. Even a man knowing something as simple and reassuring as putting a coat around a young boy shoulders to let him know the world hadn't ended.\"}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Perfecto, y ahora para buscar en este formato:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionName.find({$text: {$search: \"\"}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Dentro del habitual find para filtrar tenemos:"}]},{"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":"$text"}]},{"type":"text","value":": Con esto le indicamos que haga una búsqueda de tipo texto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$search"}]},{"type":"text","value":": Con search lo que hacemos es indicarle que busque por algo."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hagamos alguna búsqueda para ver que pasa:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.find({$text: {$search: \"coat\"}}).pretty()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.02.28.png","alt":"full text index example2"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis lo encuentra sin problemas. Las búsquedas de este tipo en mongo parecen ser bastante inteligentes, ignoran las típicas palabras comodines como pueden ser en ingles un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"a\""}]},{"type":"text","value":" o "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"the\""}]},{"type":"text","value":" y se centra en el resto, también busca por raiz de palabra, es decir, por palabras que contengan la palabra que estamos buscando (OJO tienen que ser palabras en sí y no mezclas de comodines como "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"some.."}]},{"type":"text","value":"), por ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"db.heros.find({$text: {$search: \"put\"}}).pretty()"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-9.07.04.png","alt":"full text index example3"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un detalle es que el crea el índice en un idioma específico, por eso puede ignorar ciertas palabras (están soportados la mayoría de los idiomas) y en el caso de que no se le indicara el idioma en el índice, este seguiría siendo funcional pero no tan efectivo ya que nos metería palabras innecesarias en las búsquedas pero a grandes rasgos funcionaría perfectamente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como extra comentar que las búsquedas son "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"caseInsensitive"}]},{"type":"text","value":", es decir, ignora si la palabra está en mayúsculas o en minúsculas y también ignora los acentos (ambas opciones son modificables y lo veremos más abajo)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"importantodatos"},"children":[{"type":"text","value":"Importanto datos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Antes de continuar necesitamos una colección con algo más de información, para ello nos vamos a descargar una de ejemplo oficial de Mongo desde:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"a","properties":{"href":"https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json"},"children":[{"type":"text","value":"AQUI"}]},{"type":"text","value":" (recomiendo botón derecho- guardar como)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora vamos a importarla, para ello nos salimos fuera de la shell de mongo y en la misma ruta donde hacíamos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"bin/mongo\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ejecutamos lo siguiente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"./mongoimport -c collectionTest -d databaseTest ../primer-dataset.json\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si no esta en esa ruta, buscar el ejecutable "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mongoimport"}]},{"type":"text","value":", y lo que hacemos es meter los datos dentro de una colección nombre "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"collectionTest"}]},{"type":"text","value":" que a su vez estará dentro de una base de datos llamada "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"databaseTest"}]},{"type":"text","value":" (lo último es el fichero JSON que nos hemos descargado)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos como son los documentos que tiene esta colección, usamos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.findOne()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y veremos algo similar a esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-17-a-las-21.59.54.png","alt":"mongoImport"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos coordenadas, que nos serán útiles cuando trabajemos con los índices geoespaciales, y tenemos varios campos de texto como \"street\", \"name\" o \"cuisine\". Con esto lo que vamos a ver es como podemos gestionar nuestros índices para que diferencie la importancia de unos campos de texto u otros y así poder hacer nuestras búsquedas más eficaces. Para ello tenemos la propiedad weights , que mejor que explicarlo creo que es verlo en un ejemplo de uso:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.createIndex({name: \"text\",\"address.street\": \"text\",cuisine: \"text\"},{weights:{name: 5, cuisine: 8, \"address.street\": 10}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis hemos creado un índice con los tres campos que he comentado antes, y a continuación le he puesto unos pesos específicos a cada uno, cuanto más alto más importante es el campo. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO para los subdocumentos es necesario poner comillas a los nombres de los campos en este caso sería el campo address:{ street}."}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nHe puesto esos números pensando qué a lo hora de buscar un restaurante a no ser que busques un restaurante en concreto con el nombre exacto, sueles buscar una calle a ver que tiene, o lo mejor buscas por un tipo de cocina, pero esto es solo un ejemplo podéis usar la lógica que más os guste. En una aplicación en producción esto habrá que pensarlo más detenidamente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno ahora vamos a probar una búsqueda, y para que sea más visual vamos a solicitarle a Mongo que nos añada una puntuación a la búsqueda. Lo más fácil es verlo con un ejemplo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({$text: {$search: \"irish\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vayamos por orden:"}]},{"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":"$text:{$search: \"irish\"}"}]},{"type":"text","value":": Esto ya lo hemos visto que es la palabra por la que estamos buscando."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"score: {$meta: \"textScore\"}"}]},{"type":"text","value":": Aquí le indicamos que nos genere un campo con la puntuación del texto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"name:1, cuisine:1, \"address.street\":1,_id:0"}]},{"type":"text","value":": Si os acordáis de esto, le estamos diciendo los campos que queremos ver para que no nos saque todos, name, cuisine y address.street, y ademas que nos quite el _id que nos molesta."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sort({score:{$meta: \"textScore\"}})"}]},{"type":"text","value":": Por último le decimos que nos ordene los resultados por la puntuación que ha recibido."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Al ejecutarlo obtenemos esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.26.25.png","alt":"Example textScore"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos que obtenemos varios resultados (si escribimos it nos saldrán más) y que empiezan por 12.55 de puntuación. En este caso la puntuación es debida a que viene en cuisine y que ocupa gran parte del campo name si os fijáis va bajando la puntuación siempre que el campo name tiene más palabras(y no son comodines como The o a). Como detalle haceros a la idea de que estamos filtrando unos 25000 documentos que yo creo que no está nada mal lo que tarda en devolver los resultados"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno supongo que váis viendo un poco como funcionan las búsquedas de texto. Habréis visto que en el campo street no tenemos coincidiencias, vamos a buscar algo relacionado con una calle."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({$text: {$search: \"Jamaica\"}},{score: {$meta: \"textScore\"}, name:1, cuisine:1, \"address.street\":1,_id:0}).sort({score:{$meta: \"textScore\"}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-20-a-las-9.29.56.png","alt":"Example textScore"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veis que sigue el mismo concepto pero esta vez con la calle y el nombre. Estas búsquedas las podemos hacer tan complicadas como queramos igual que el resto que ya vimos anteriormente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como extra recalcar que podemos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Modificar el lenguaje del índice con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$language: Idioma"}]},{"type":"text","value":", por ejemplo"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$languaje: Spanish\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Indicarle que sea "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$caseSensitive"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$caseSensitive: True (default false)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Soportar acentos con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$diacriticSensitive"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"$diacriticSensitive: True (default false)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que con esto es suficiente para que se entienda como funcionan los "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Full text index"}]}]},{"type":"text","value":" y podáis hacer los vuestros según requiera vuestra aplicación. Ahora empecemos con los "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Indices Geoespaciales"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"geospatialindex"},"children":[{"type":"text","value":"Geospatial Index"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En Mongo tenemos dos tipos de índices "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Geoespaciales"}]},{"type":"text","value":":"}]},{"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":"2d"}]},{"type":"text","value":": Basicamente representa una cuadrícula sobre un plano, pensado para superficies pequeñas, por ejemplo un campo de fútbol. También si no tenemos pensado usar geoJSON o nos da igual la curvatura de la tierra."}]},{"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":"2dsphere"}]},{"type":"text","value":": El caso contrario, es decir, situamos cosas sobre la tierra. Este es el más común realmente. Esta basado en el estandar "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"WGS 84"}]},{"type":"text","value":", un estandar que intenta simular en una espera a la tierra."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Las posiciones en cualquier mapa están representadas por unas "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"coordenadas"}]}]},{"type":"text","value":", estas coordenadas están representadas en:"}]},{"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":"Latitud"}]},{"type":"text","value":": Distancia desde el Ecuador al norte y al sur. De 0 a 90 al norte, de 0 a -90 al sur."}]},{"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":"Longitud"}]},{"type":"text","value":": Distancia desde el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Meridiano de Greenwich"}]}]},{"type":"text","value":" (seían los 0 Grados). Para localizaciones al este sería de 0 a 180 y para localizaciones al oeste de 0 a -180"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO las coordenadas en MongoDB se guardan Longitud/Latitud y en Google Maps Latitud/Longitud"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien ya sabemos un poco de que hablamos, ahora veamos como crear un índice de este tipo:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionName.createIndex({campo_localización: \"2dsphere\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"(Como véis siempre tiene el mismo estilo la creación de índices) Por si acaso no lo imagináis ya, el campo de localización tiene ser unas "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"coordenadas"}]},{"type":"text","value":" o datos al estilo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"element","tagName":"a","properties":{"href":"http://geojson.org/"},"children":[{"type":"text","value":"GeoJSON"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a crear un índice con los datos de las coordenadas que tenemos en la colección que usamos antes, para ello basta con crear el índice:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.createIndex({\"address.coord\": \"2dsphere\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tenemos nuestro índice creado, ahora vamos a ver como es uno de nuestros elementos con coordenadas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.findOne()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.22.08.png","alt":"Document Example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y por si acaso nos vamos a ir a Google Maps a comprobar los datos, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO recordad que están al revés"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-22-a-las-21.23.32.png","alt":"Google Maps Check"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Coincide con nuestra calle ¿no?. Bueno pues ahora vamos a probar a buscar por coordenadas directamente, es decir, que me muestre quien contiene la coordenada que pasamos. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"OJO la búsqueda que vamos a realizar ahora lo que hace es buscar documentos que contengan esa coordenada, si tuvieramos una base de datos con las coordenadas de los paises enteros podríamos sacar el pais al que pertenece"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find(\n    {\"address.coord\":\n        {$geoIntersects:\n            {$geometry:\n                {type: \"Point\", coordinates: [-73.9549067, 40.6971322]}}}},{\"name\":1}).pretty()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos que estamos pidiendo aqui:"}]},{"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":"address.coord"}]},{"type":"text","value":": Esta es fácil le indicamos donde queremos que busque."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geoIntersects"}]},{"type":"text","value":": Es uno de los operadores para buscar con los índices Geoespaciales (tener en cuenta que todo esto esta más pensado para documentos tipo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"GeoJSON"}]},{"type":"text","value":"). En este caso lo que hace es buscar geometrias que se crucen con la coordenada que le indiquemos. Veremos alguno más, tenemos 4 distintos. "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/geospatial-queries/#geospatial-query-operators"},"children":[{"type":"text","value":"Geospatial query operators"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geometry"}]},{"type":"text","value":": Propiedad para indicarle lo que queremos buscar."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"type"}]},{"type":"text","value":": Dentro de type le indicamos el tipo de coordenadas que le vamos a buscar, siempre pensando en formato GeoJSON. En este caso hemos puesto un tipo \"Punto\". Existen varios distintos, lo mejor es que los veáis en la documentación: "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/geojson/"},"children":[{"type":"text","value":"GeoJSON Objects"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"coordinates y name"}]},{"type":"text","value":": Básicamente son las coordenadas por las que queremos buscar y lo que queremos que nos devuelva."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este caso la búsqueda parece que es sobre una ubicación específica porque no tenemos coordenadas al estilo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"Polígono\""}]},{"type":"text","value":", pero es más que nada para que veamos que funciona bien. Al ejecutarlo vemos que nos devuelve el restaurante que habíamos seleccionado"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.33.48.png","alt":"Search Example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Probemos ahora algo con algo más de \"chicha\", vamos a buscar restaurantes que estén a unos 500 metros del que hemos seleccionado antes. Para ello en lugar de usar el operador "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"geoIntersect"}]},{"type":"text","value":" vamos a usar el operador "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"near"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({\n    \"address.coord\":{\n        $near:{\n            $geometry:{\n                type: \"Point\", \n                coordinates: [-73.9549067, 40.6971322]},\n                $maxDistance: 500\n                }\n              }\n     },{\"name\":1})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como propiedad extra que no habíamos visto antes tenemos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"$maxDistance"}]},{"type":"text","value":", en la cual indicamos una distancia máxima en metros."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-24-a-las-9.34.27.png","alt":"Search Example with Metres"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"He cogido las coordenadas de los dos primeros restaurantes y si las ponemos en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Google Maps"}]},{"type":"text","value":" (recordemos que tenemos que invertir las coordenadas ya que google las guarda al revés), y esto es lo que aparece"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-9.21.20.png","alt":"Google Maps 500 mt example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis está a menos de 500 metros, por lo que podemos confirmar que realmente funciona."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora pensemos en otro escenario, las aplicaciones móviles, en la mayoria de los casos cuando buscamos lo que tenemos alrededor en el mapa lo que queremos ver es que se vé en la pantalla, es decir, que hay en la cuadrícula del mapa que estoy mostrando. Esto también lo podemos hacer con MongoDB, solo tenemos que indicarle cuales son las coordenadas que se están mostrando actualmente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({\"address.coord\":{\n        $geoWithin: {\n            $geometry:{\n                type: \"Polygon\", \n                coordinates:[\n                    [[-73,40],\n                    [-75,40],\n                    [-75,42],\n                    [-73,42],\n                    [-73,40]]]}}}},\n                    {\"name\":1,\"address.coord\":1,\"_id\":0})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis en la query hemos cambiado la propiedad a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geoWithin"}]},{"type":"text","value":", es decir, lo que esté dentro de esa zona, y le pasamos un polígono, con 5 coordenadas (imagináos que es una línea que vamos dibujando, que empieza en un punto y tiene que acabar en el mismo punto, por eso son 5 ;) )"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAquí tendríamos una cuadrícula que sería más o menos esta zona"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.02.34.png","alt":"Polygon Google Maps"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si la ejecutamos veremos que nos saca un montón de coincidencias que son las que están dentro de esa zona (que yo diría que son todos jejeje)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.06.42.png","alt":"Polygon Example Query"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si por ejemplo contamos los elementos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-73,40],[-75,40],[-75,42],[-73,42],[-73,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0}).count()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos salen:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.09.53.png","alt":"Count Query"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a probar a cambiar, todas las coordenadas -73 por -74 y así comprobamos como nos filtra de verdad:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.find({\"address.coord\":{$geoWithin: {$geometry:{type: \"Polygon\", coordinates:[[[-74,40],[-75,40],[-75,42],[-74,42],[-74,40]]]}}}},{\"name\":1,\"address.coord\":1,\"_id\":0})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ejecutamos vemos como todos los documentos empiezan a partir de la longitud -74"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.11.24.png","alt":"Query with long -74"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si contamos ahora los documentos tenemos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-25-a-las-10.12.48.png","alt":"Query -74 count"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos realmente si nos está filtrando por una zona en específico. Esto es un ejemplo de algunas cosas típicas que podemos necesitar hacer."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"subiendodenivel"},"children":[{"type":"text","value":"Subiendo de nivel"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien ahora subamos un poco más el nivel, vamos a ver como podemos programar directamente en la consola de MongoDB, en este ejemplo que vamos a ver seguiremos usando los índices "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"geoespaciales"}]},{"type":"text","value":" porque son los últimos que hemos visto, pero tener en cuenta que se podría hacer como queráis."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo que vamos hacer va a ser recorrer todos los restaurantes que tenemos en la colección de test que estamos usando y vamos a ponerles una propiedad nueva indicando cual es el primer restaurante que esté a menos 500 mt (si hay alguno claro)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una cosa muy interesante y util en mongo es que podemos usar variables.....y bueno podemos usar un estilo de programación similar al de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"JavaScript"}]},{"type":"text","value":". Entonces para este ejemplo vamos a usar el siguiente código (podéis copiar y pegar ;) )"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var restaurants = db.collectionTest.find()\n\nwhile(restaurants.hasNext()){\n\n    var rest = restaurants.next();\n    var coords = rest.address.coord;\n    \n    if (coords != \"\"){\n        var neighbour = db.collectionTest.find({\"address.coord\":{$near:\n            {$geometry:{type: \"Point\", coordinates: coords},$maxDistance: 500}}}).skip(1).limit(1);\n    \n        if (neighbour[0] != undefined){\n            var neigh = neighbour[0];\n\n            db.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n        } \n    \n    }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En general supongo que más o menos se entiende el código (y no está con la intención de ser el mejor ni el más bonito solo es un ejemplo) pero por si acaso voy a explicarlo paso a paso."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo primero almacenamos todos nuestros documentos en una variable, se podría haber limitado la cantidad o cualquier cosa que se os ocurra pero así comprobamos lo que tarda en modificarnos mas de 25000 documentos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var restaurants = db.collectionTest.find()\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y a continuación por ejemplo haremos un bucle while recorriendo los documentos que tenemos almacenados en la variable "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"restaurants"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"while(restaurants.hasNext()){\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Almacenamos el documento en cuestión y las coordenadas de que tiene ese documento:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"var rest = restaurants.next();\nvar coords = rest.address.coord;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos algunos documentos que tienen la propiedad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"coord"}]},{"type":"text","value":" vacía por lo que lo comprobamos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if (coords != \"\"){\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo siguiente será buscar cuál es el restaurante más cercano, sin ser el propio restaurante propietario de esas coordenadas, al buscar por coordenadas nos identifica el primero como el propio restaurante, por eso ignoramos el primer resultado. Y como solo queremos encontrar uno de "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"los vecinos\""}]},{"type":"text","value":" limitamos la búsqueda a 1"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":" var neighbour = db.collectionTest.find({\n     \"address.coord\":{\n         $near:{\n             $geometry:{\n                 type: \"Point\",\n                 coordinates: coords}\n                 ,$maxDistance: 500}}}).skip(1).limit(1);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como es posible que no tengamos nungún documento(restaurante) a menos de 500 metros tenemos que comprobar antes de hacer nada para que el proceso continue"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"if (neighbour[0] != undefined){\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y por último actualizamos el restaurante usando el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"_id\""}]},{"type":"text","value":" añadiendole la propiedad "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"\"address.neighbour\""}]},{"type":"text","value":" con el nombre del restaurante vecino"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.update({\"_id\": rest._id},\n                {$set: {\n                    \"address.neighbour\": neigh.name \n                }}\n            );\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"El proceso tardará un rato, y una vez terminado, si buscamos algún documento"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.collectionTest.findOne({},{\"name\":1,\"address\":1,\"_id\":0})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veremos como nos ha añadido una nueva propiedad con el nombre de algún restaurante cercano"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-28-a-las-17.49.58.png","alt":"Neighbour restaurant's"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto es solo un pequeño ejemplo de lo que podemos hacer con MongoDB, podemos complicar las búsquedas tanto como queramos (aunque lo suyo es que una parte lo hiciera nuestra app no la base de datos sola ;) )"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Espero que con este post seais capaces de mejorar vuestros índices y hacer que vuestras búsquedas en vuestras bases de datos MongoDB sean mucho más eficientes. De momento vamos a dejar el tema de los índices, lo próximo que veremos será el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Aggregation Framework"}]},{"type":"text","value":", si no sabéis lo que es no os preocupeis lo veremos en detalle. Nos veeemoosssss un abrazooorrrrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"qusonlosndices","heading":"¿Qué son los índices?"},{"id":"binarytreesort","heading":"Binary Tree Sort"},{"id":"tiposdendices","heading":"Tipos de índices"},{"id":"fulltextindex","heading":"Full text Index","items":[{"id":"importantodatos","heading":"Importanto datos"}]},{"id":"geospatialindex","heading":"Geospatial Index"},{"id":"subiendodenivel","heading":"Subiendo de nivel"}]},"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"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f43","title":"MongoDB Ninja(III): Sin Scheme","slug":"mongodb-ninja-iii","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/MongoBanner-2.png","excerpt":"Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno\n(y aprovechando que este post es más corto lo meto aquí), ¿qué es el journal?.\nPara el que no sepa de que hablo si miramos en el filesystem donde se está\nalmacenando nuestra base de datos tenemos una carpeta journal\n\n\n\nEsta carpeta es una colección especial de Mongo en la que se almacenan los datos\ntemporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un\nmecanismo de salvaguarda en caso de que nues","custom_excerpt":null,"visibility":"public","created_at_pretty":"15 Oct 2017","published_at_pretty":"29 Oct 2017","updated_at_pretty":"18 Jan 2018","created_at":"2017-10-15T13:16:29.000+02:00","published_at":"2017-10-29T21:46:00.000+01:00","updated_at":"2018-01-18T15:04:52.000+01:00","meta_title":"MongoDB Ninja(III): Sin Scheme","meta_description":"Hablemos sobre el \"esquema\"(scheme) en MongoDB, que es lo que tenemos que tener en cuenta para usar de la mejor manera posible esta base de datos","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 voy a comentar sobre una duda que surgió hace poco en mi entorno\n(y aprovechando que este post es más corto lo meto aquí), ¿qué es el journal?.\nPara el que no sepa de que hablo si miramos en el filesystem donde se está\nalmacenando nuestra base de datos tenemos una carpeta journal\n\n\n\nEsta carpeta es una colección especial de Mongo en la que se almacenan los datos\ntemporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un\nmecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de\nalgo. Es decir, mongo tiene un proceso que por defecto cada 60 segundos o cada \n2GB de journal pasa los datos al disco si no han sido pasados antes.\nEsto se puede ver cuando arrancamos mongo\n\n\n\nSi os fijáis en esa línea, entre otras cosas nos aparece esta línea\n\nlog=(enabled=true,archive=true,path=journal,compressor=snappy)\n\n\nDonde indica donde mete los datos de log (que sería el journal), y también\ntenemos esta otra\n\ncheckpoint=(wait=60,log_size=2GB)\n\n\nQue nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha\nescrito o cuando el log llegue a 2GB), pues el journal sería una colección muy\nligera que esta guardando los datos cada 100 ms, por lo que en el caso de que\nnuestro servidor se caiga entre checkpoints y no tuvieramos los últimos cambios\nen el disco, si los tendríamos en el journal.\n\nDocumentos en MongoDB\nHemos comentado que Mongo es una base de datos orientada a documentos (ya lo\ncomentamos por encima jejeje), estos documentos realmente son objetos JSON.\nEstos se almacenan codificados en un formato específico conocido como BSON \n(Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear\nlos documentos, simplemente trabajamos con ellos en su propio formato. Por eso\nes tan eficiente en las búsquedas.\n\nScheme\nEmpecemos a comentar cosas sobre el scheme, en Mongo no tenemos un esquema \ndefinido pero aún así es algo que tenemos que pensar antes de empezar a trabajar\nMongo. Todo se basa siempre en lo mismo: tiempos de lectura, es decir tenemos\nque intentar que para obtener los datos, imaginemos que de este mismo blog, de\nuna de las páginas lo podamos hacer en una única query, ya que en Mongo esto es\nlo que haría realmente eficiente nuestro esquema. Ya hemos visto lo que tarda\nrealmente en hacer búsquedas de muchos elementos en una sola query (como el\nejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una\nbúsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en\nmostrar una página sería bastante más alto.\n\nY pensando en esto es como tenemos que definir nuestros scheme ficticio, ¿que\ninformación voy a necesitar en cada momento?. Para explicar esto lo voy a poner\ncon ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un\npost de un blog normalmente tiene estos elementos:\n\n * Titulo\n * Autor\n * Fecha de publicación\n * Texto del post\n * A lo mejor tiene tags\n * Comentarios\n\nMás o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría\nde los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de \ncada documento tiene que tener toda su información para poder traerla en una\nquery un ejemplo de post sería este:\n\n{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n\n\nMás o menos podría tener sentido, ¿no? pero claro....el tema de los\ncomentarios.......al final según el post podríamos tener un documento gigante y\npara recorrerlo en busca de algo.....o supongamos que tenemos un montón de\ncomentarios en todos los posts......uffff.....demasiado para que la gestión sea\nrealmente eficiente, planteemonos lo siguiente ¿qué es lo que mostramos\nrealmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente\ntenemos un límite de los que mostramos y luego si el usuario quiere ya pide\nmás?.... realmente el escenario normalmente es este último ¿verdad?...bien, pero\n¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es \nlinkarlos, es decir, establecer algún tipo de relación con alguna propiedad.\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que\nmostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que\nteniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con\ncódigo realmente, es decir depende del cliente...pero y si ya tiene 5, ¿qué\nhacemos?...alguno pensará que tenemos que hacer una query para eliminar y otra\npara añadir.....pero realmente no es necesario, tal como es el lenguaje podemos\nhacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda\n\ndb.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n\n\nCon $pop [https://docs.mongodb.com/manual/reference/operator/update/pop/] \neliminamos o el último o el primero según queramos y como ya hemos visto con \n$push [https://docs.mongodb.com/manual/reference/operator/update/push/] añadimos\nnuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener\nun precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos\ngestionar los documentos de post de una forma bastante eficiente.\n\nAhora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es\ntenerlos en otra colección donde hagamos referencia al post en cuestión, por\nejemplo\n\n{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n\n\nCuando el usuario pida más comentarios solo tenemos que buscar por el post_id y\nlisto, ya tendríamos todos los comentarios que necesitamos y si os fijáis al\nsepararlo de esta manera tenemos la posibilidad de añadirle más información a\nlos comentarios por si la necesitamos.\n\nEsto es solo un ejemplo de como podemos establecer relaciones en nuestras bases\nde datos simplemente teniendo una propiedad que relacione ambas, esto se puede\ncomplicar tanto como sea necesario, lo único siempre pensar en como se va a\ntrabajar realmente en nuestra aplicación, cuales van a ser las querys que se van\na realizar o cuales son las que necesitamos para que sea lo más eficiente\nposible.\n\nA parte de esto tenemos que ver la posibilidad de gestionar un poco el no scheme\n, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier\ncosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí\ntenemos dos entornos que podemos gestionar el de la aplicación cliente y el\npropio de MongoDB.\n\nEn cuanto a la aplicación cliente poco que decir, más que realmente la\nresponsabilidad del modelo de los documentos tenía que estar en el cliente ya\nsea controlándolo a mano o con modeladores de objetos específicos de cada\nlenguaje, como puede ser Mongoose [http://mongoosejs.com/] en NodeJS (lo\nusaremos más adelante).\n\nMongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de\n2015 (si no me equivoco) su propio validador de documentos. Básicamente nos\npermite controlar qué se inserta o se actualiza en nuestra base de datos,\nhagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es\nque miréis la documentación oficial\n[https://docs.mongodb.com/manual/core/document-validation/] para ver todo lo que\npodemos hacer con esto. Comentar también que esto debería ser como una segunda\ncomprobación, que exista esta opción no hace que no sea necesaria la opción de\ncontrolar los objetos en las aplicaciones cliente.\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar\nnúmeros, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo\nstring sin problemas\n\ndb.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n\n\nSi ahora buscamos a Deadpool y a Black Panther vemos como cada uno tiene un\ncampo money distinto:\n\n\n\nPara evitar creamos un validator de los datos de una colección ya existente de\nesta forma:\n\ndb.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n\n\nEn collMod le estamos indicando la colección que queremos modificar y como\nvalidador le indicamos que el campo money tiene que ser de tipo number.\nAhora si intentamos insertar un documento nuevo con el campo money como string\n\ndb.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n\n\nObtenemos este resultado\n\n\nTenemos, si o si, que pasarle los datos en el formato que los solicita\n\ndb.heros.insert({name: \"Wolverine\", money: 200})\n\n\nPara que realmente los inserte en la base de datos\n\n\nEstas reglas de validación las podemos hacer tan complejas como queramos,\npodemos usar expresiones regulares, dar opciones de datos específicas.......lo\nque he comentado mirar la documentación oficial\n[https://docs.mongodb.com/manual/core/document-validation/] sobre el tema y\nvereis que podéis hacer.\n\nComentar que podemos crear las reglas de validación junto con la creación de la\ncolección\n\ndb.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n\n\nY ya de paso si cremos así la colección nos aparece directamente sin insertar\nningún dato, y tenemos también nuestra regla de validación desde el principio.\n\nBueno hasta aquí el post sobre vivir con no scheme, como véis no tenemos un\nmodelado de esquemas al estilo relacional pero creo que entre el poder linkar\ncolecciones usando algun campo como referencia y con los validators podemos\ntrabajar casi en cualquier entorno que queramos con esta base de datos.\n\nEn el próximo post veremos como hacer algunos índices mas complejos como las de \ngeolocalicación.\n\nNos vemos en el siguienteeee un abrazooorrrrrr","html":"<!--kg-card-begin: markdown--><p>Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), <strong>¿qué es el journal?</strong>. Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta <strong>journal</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png\" alt=\"Journal folder\"></p>\n<p>Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada <strong>60 segundos</strong> o cada <strong>2GB</strong> de journal pasa los datos al disco si no han sido pasados antes.<br>\nEsto se puede ver cuando arrancamos <em>mongo</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png\" alt=\"Journal init\"></p>\n<p>Si os fijáis en esa línea, entre otras cosas nos aparece esta línea</p>\n<pre><code>log=(enabled=true,archive=true,path=journal,compressor=snappy)\n</code></pre>\n<p>Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra</p>\n<pre><code>checkpoint=(wait=60,log_size=2GB)\n</code></pre>\n<p>Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues <strong>el journal sería una colección muy ligera que esta guardando los datos cada 100 ms</strong>, por lo que en el caso de que nuestro servidor se caiga entre <em>checkpoints</em> y no tuvieramos los últimos cambios en el disco, si los tendríamos en el <em>journal</em>.</p>\n<h3 id=\"documentosenmongodb\">Documentos en MongoDB</h3>\n<p>Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son <strong>objetos JSON</strong>. Estos se almacenan codificados en un formato específico conocido como <strong>BSON</strong> (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas.</p>\n<h3 id=\"scheme\">Scheme</h3>\n<p>Empecemos a comentar cosas sobre el <em>scheme</em>, en Mongo no tenemos un <em>esquema</em> definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: <strong>tiempos de lectura</strong>, es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro <em>esquema</em>. Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto.</p>\n<p>Y pensando en esto es como tenemos que definir nuestros <em>scheme</em> ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:</p>\n<ul>\n<li>Titulo</li>\n<li>Autor</li>\n<li>Fecha de publicación</li>\n<li>Texto del post</li>\n<li>A lo mejor tiene tags</li>\n<li>Comentarios</li>\n</ul>\n<p>Más o menos esos son los elementos que podríamos decir &quot;básicos&quot; en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de <strong>cada documento tiene que tener toda su información para poder traerla en una query</strong> un ejemplo de post sería este:</p>\n<pre><code>{\n&quot;post_id&quot;: 12334,\n&quot;post_title&quot;: &quot;Titulo de Post&quot;,\n&quot;author&quot;: &quot;Juan Luis Garcia&quot;,\n&quot;publish_date&quot;: &quot;11-11-1111&quot;,\n&quot;post_text&quot;: &quot;Un montón de palabras juntas contando algo&quot;,\n&quot;tags&quot;:[&quot;tag1&quot;,&quot;tag2&quot;,&quot;tag3&quot;],\n&quot;comments&quot;:[{\n    &quot;comment_author&quot;: &quot;Superman&quot;,\n    &quot;comment_date&quot;: &quot;12-12-1212&quot;,\n    &quot;comment_text&quot;: &quot;Esto es un supercomentario&quot;\n  },{\n    &quot;comment_author&quot;: &quot;Batman&quot;,\n    &quot;comment_date&quot;: &quot;13-13-1313&quot;,\n    &quot;comment_text&quot;: &quot;¡¡Soy Batman!!&quot;\n  },\n  {...},{...},{...}]\n}\n</code></pre>\n<p>Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente <em>¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?....</em> realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es <em>linkarlos</em>, es decir, establecer algún tipo de relación con alguna propiedad.<br>\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y <em>si ya tiene 5, ¿qué hacemos?</em>...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda</p>\n<pre><code>db.blog.update({post_title: &quot;Algo&quot;},{$pop:{comments:1},$push:{comment:.....}})\n</code></pre>\n<p>Con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/pop/\">$pop</a> eliminamos o el último o el primero según queramos y como ya hemos visto con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/push/\">$push</a> añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente.</p>\n<p>Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo</p>\n<pre><code>{\n    &quot;comment_id&quot;: 41325,\n    &quot;post_id&quot;: 12334,\n    &quot;comment_author&quot;: &quot;Superman&quot;,\n    &quot;comment_author_email&quot;: &quot;superman@correo.com&quot;,\n    &quot;comment_date&quot;: &quot;12-12-1212&quot;,\n    &quot;comment_text&quot;: &quot;Esto es un supercomentario&quot;\n},\n{\n    &quot;comment_id&quot;: 41326,\n    &quot;post_id&quot;: 12334,\n    &quot;comment_author&quot;: &quot;Batman&quot;,\n    &quot;comment_author_email&quot;: &quot;batman@correo.com&quot;,\n    &quot;comment_date&quot;: &quot;13-13-1313&quot;,\n    &quot;comment_text&quot;: &quot;¡¡¡Soy Batman!!!&quot;\n}\n</code></pre>\n<p>Cuando el usuario pida más comentarios solo tenemos que buscar por el <strong>post_id</strong> y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos.</p>\n<p>Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible.</p>\n<p>A parte de esto tenemos que ver la posibilidad de gestionar un poco <strong>el no scheme</strong>, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB.</p>\n<p>En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser <a href=\"http://mongoosejs.com/\"><strong>Mongoose</strong></a> en NodeJS (lo usaremos más adelante).</p>\n<p>MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio <em>validador</em> de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente.<br>\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas</p>\n<pre><code>db.heros.insert({name: &quot;Deadpool&quot;, money: &quot;one hundred&quot;})\n</code></pre>\n<p>Si ahora buscamos a <em>Deadpool</em> y a <em>Black Panther</em> vemos como cada uno tiene un campo <em>money</em> distinto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png\" alt=\"Deadpool insert\"></p>\n<p>Para evitar creamos un <em>validator</em> de los datos de una colección ya existente de esta forma:</p>\n<pre><code>db.runCommand({collMod: &quot;heros&quot;,validator: {money: { $type: &quot;number&quot;}}})\n</code></pre>\n<p>En <strong>collMod</strong> le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo <strong>money</strong> tiene que ser de tipo <em>number</em>.<br>\nAhora si intentamos insertar un documento nuevo con el campo money como string</p>\n<pre><code>db.heros.insert({name: &quot;Wolverine&quot;, money: &quot;two hundreds&quot;})\n</code></pre>\n<p>Obtenemos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png\" alt=\"Failed validation example\"></p>\n<p>Tenemos, si o si, que pasarle los datos en el formato que los solicita</p>\n<pre><code>db.heros.insert({name: &quot;Wolverine&quot;, money: 200})\n</code></pre>\n<p>Para que realmente los inserte en la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png\" alt=\"Validation pass example\"></p>\n<p>Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> sobre el tema y vereis que podéis hacer.</p>\n<p>Comentar que podemos crear las reglas de validación junto con la creación de la colección</p>\n<pre><code>db.createCollection(&quot;heros2&quot;,{validator: {money: { $type: &quot;number&quot;}}})\n</code></pre>\n<p>Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio.</p>\n<p>Bueno hasta aquí el post sobre vivir con <strong>no scheme</strong>, como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder <strong>linkar colecciones</strong> usando algun campo como referencia y con los <strong>validators</strong> podemos trabajar casi en cualquier entorno que queramos con esta base de datos.</p>\n<p>En el próximo post veremos como hacer algunos índices mas complejos como las de <strong>geolocalicación</strong>.</p>\n<p>Nos vemos en el siguienteeee un abrazooorrrrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/mongodb-ninja-iii/","canonical_url":null,"uuid":"345cafab-6c06-4c6f-aad6-0e0f9011cc35","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59e3438d58177700014ca3da","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), <strong>¿qué es el journal?</strong>. Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta <strong>journal</strong></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png\" alt=\"Journal folder\"></p>\n<p>Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada <strong>60 segundos</strong> o cada <strong>2GB</strong> de journal pasa los datos al disco si no han sido pasados antes.<br>\nEsto se puede ver cuando arrancamos <em>mongo</em></p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png\" alt=\"Journal init\"></p>\n<p>Si os fijáis en esa línea, entre otras cosas nos aparece esta línea</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">log=(enabled=true,archive=true,path=journal,compressor=snappy)\n</code></pre></div>\n<p>Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">checkpoint=(wait=60,log_size=2GB)\n</code></pre></div>\n<p>Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues <strong>el journal sería una colección muy ligera que esta guardando los datos cada 100 ms</strong>, por lo que en el caso de que nuestro servidor se caiga entre <em>checkpoints</em> y no tuvieramos los últimos cambios en el disco, si los tendríamos en el <em>journal</em>.</p>\n<h3 id=\"documentosenmongodb\">Documentos en MongoDB</h3>\n<p>Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son <strong>objetos JSON</strong>. Estos se almacenan codificados en un formato específico conocido como <strong>BSON</strong> (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas.</p>\n<h3 id=\"scheme\">Scheme</h3>\n<p>Empecemos a comentar cosas sobre el <em>scheme</em>, en Mongo no tenemos un <em>esquema</em> definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: <strong>tiempos de lectura</strong>, es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro <em>esquema</em>. Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto.</p>\n<p>Y pensando en esto es como tenemos que definir nuestros <em>scheme</em> ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:</p>\n<ul>\n<li>Titulo</li>\n<li>Autor</li>\n<li>Fecha de publicación</li>\n<li>Texto del post</li>\n<li>A lo mejor tiene tags</li>\n<li>Comentarios</li>\n</ul>\n<p>Más o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de <strong>cada documento tiene que tener toda su información para poder traerla en una query</strong> un ejemplo de post sería este:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n</code></pre></div>\n<p>Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente <em>¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?....</em> realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es <em>linkarlos</em>, es decir, establecer algún tipo de relación con alguna propiedad.<br>\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y <em>si ya tiene 5, ¿qué hacemos?</em>...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n</code></pre></div>\n<p>Con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/pop/\">$pop</a> eliminamos o el último o el primero según queramos y como ya hemos visto con <a href=\"https://docs.mongodb.com/manual/reference/operator/update/push/\">$push</a> añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente.</p>\n<p>Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n</code></pre></div>\n<p>Cuando el usuario pida más comentarios solo tenemos que buscar por el <strong>post_id</strong> y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos.</p>\n<p>Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible.</p>\n<p>A parte de esto tenemos que ver la posibilidad de gestionar un poco <strong>el no scheme</strong>, es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB.</p>\n<p>En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser <a href=\"http://mongoosejs.com/\"><strong>Mongoose</strong></a> en NodeJS (lo usaremos más adelante).</p>\n<p>MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio <em>validador</em> de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente.<br>\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n</code></pre></div>\n<p>Si ahora buscamos a <em>Deadpool</em> y a <em>Black Panther</em> vemos como cada uno tiene un campo <em>money</em> distinto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png\" alt=\"Deadpool insert\"></p>\n<p>Para evitar creamos un <em>validator</em> de los datos de una colección ya existente de esta forma:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n</code></pre></div>\n<p>En <strong>collMod</strong> le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo <strong>money</strong> tiene que ser de tipo <em>number</em>.<br>\nAhora si intentamos insertar un documento nuevo con el campo money como string</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n</code></pre></div>\n<p>Obtenemos este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png\" alt=\"Failed validation example\"></p>\n<p>Tenemos, si o si, que pasarle los datos en el formato que los solicita</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.heros.insert({name: \"Wolverine\", money: 200})\n</code></pre></div>\n<p>Para que realmente los inserte en la base de datos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png\" alt=\"Validation pass example\"></p>\n<p>Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la <a href=\"https://docs.mongodb.com/manual/core/document-validation/\">documentación oficial</a> sobre el tema y vereis que podéis hacer.</p>\n<p>Comentar que podemos crear las reglas de validación junto con la creación de la colección</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">db.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n</code></pre></div>\n<p>Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio.</p>\n<p>Bueno hasta aquí el post sobre vivir con <strong>no scheme</strong>, como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder <strong>linkar colecciones</strong> usando algun campo como referencia y con los <strong>validators</strong> podemos trabajar casi en cualquier entorno que queramos con esta base de datos.</p>\n<p>En el próximo post veremos como hacer algunos índices mas complejos como las de <strong>geolocalicación</strong>.</p>\n<p>Nos vemos en el siguienteeee un abrazooorrrrrr</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":"Antes de nada voy a comentar sobre una duda que surgió hace poco en mi entorno (y aprovechando que este post es más corto lo meto aquí), "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"¿qué es el journal?"}]},{"type":"text","value":". Para el que no sepa de que hablo si miramos en el filesystem donde se está almacenando nuestra base de datos tenemos una carpeta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"journal"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.21.05.png","alt":"Journal folder"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta carpeta es una colección especial de Mongo en la que se almacenan los datos temporalmente antes de pasar a nuestro disco duro de forma definitiva. Es un mecanismo de salvaguarda en caso de que nuestro proceso se caiga en medio de algo. Es decir, mongo tiene un proceso que por defecto cada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"60 segundos"}]},{"type":"text","value":" o cada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"2GB"}]},{"type":"text","value":" de journal pasa los datos al disco si no han sido pasados antes."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEsto se puede ver cuando arrancamos "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"mongo"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-13.27.10.png","alt":"Journal init"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis en esa línea, entre otras cosas nos aparece esta línea"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"log=(enabled=true,archive=true,path=journal,compressor=snappy)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Donde indica donde mete los datos de log (que sería el journal), y también tenemos esta otra"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"checkpoint=(wait=60,log_size=2GB)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Que nos índica cada cuanto hace un guardado en disco (cada 60 segundos si no ha escrito o cuando el log llegue a 2GB), pues "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"el journal sería una colección muy ligera que esta guardando los datos cada 100 ms"}]},{"type":"text","value":", por lo que en el caso de que nuestro servidor se caiga entre "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"checkpoints"}]},{"type":"text","value":" y no tuvieramos los últimos cambios en el disco, si los tendríamos en el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"journal"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"documentosenmongodb"},"children":[{"type":"text","value":"Documentos en MongoDB"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hemos comentado que Mongo es una base de datos orientada a documentos (ya lo comentamos por encima jejeje), estos documentos realmente son "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"objetos JSON"}]},{"type":"text","value":". Estos se almacenan codificados en un formato específico conocido como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"BSON"}]},{"type":"text","value":" (Binary JSON), los almacena de forma eficiente y nos evita el tener que parsear los documentos, simplemente trabajamos con ellos en su propio formato. Por eso es tan eficiente en las búsquedas."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"scheme"},"children":[{"type":"text","value":"Scheme"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empecemos a comentar cosas sobre el "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scheme"}]},{"type":"text","value":", en Mongo no tenemos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"esquema"}]},{"type":"text","value":" definido pero aún así es algo que tenemos que pensar antes de empezar a trabajar Mongo. Todo se basa siempre en lo mismo: "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"tiempos de lectura"}]},{"type":"text","value":", es decir tenemos que intentar que para obtener los datos, imaginemos que de este mismo blog, de una de las páginas lo podamos hacer en una única query, ya que en Mongo esto es lo que haría realmente eficiente nuestro "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"esquema"}]},{"type":"text","value":". Ya hemos visto lo que tarda realmente en hacer búsquedas de muchos elementos en una sola query (como el ejemplo de los 1000000 elementos del post anterior), si en lugar de hacer una búsqueda única tenemos que mezclar varias querys el tiempo que tardaríamos en mostrar una página sería bastante más alto."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y pensando en esto es como tenemos que definir nuestros "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"scheme"}]},{"type":"text","value":" ficticio, ¿que información voy a necesitar en cada momento?. Para explicar esto lo voy a poner con ejemplos similares a los que yo lo aprendí, pensemos otra vez en un blog. Un post de un blog normalmente tiene estos elementos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Titulo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Autor"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Fecha de publicación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Texto del post"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"A lo mejor tiene tags"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Comentarios"}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más o menos esos son los elementos que podríamos decir \"básicos\" en la mayoría de los post del mundo. Entonces siguiendo la teoría de lo que hemos dicho de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"cada documento tiene que tener toda su información para poder traerla en una query"}]},{"type":"text","value":" un ejemplo de post sería este:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{\n\"post_id\": 12334,\n\"post_title\": \"Titulo de Post\",\n\"author\": \"Juan Luis Garcia\",\n\"publish_date\": \"11-11-1111\",\n\"post_text\": \"Un montón de palabras juntas contando algo\",\n\"tags\":[\"tag1\",\"tag2\",\"tag3\"],\n\"comments\":[{\n    \"comment_author\": \"Superman\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n  },{\n    \"comment_author\": \"Batman\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡Soy Batman!!\"\n  },\n  {...},{...},{...}]\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Más o menos podría tener sentido, ¿no? pero claro....el tema de los comentarios.......al final según el post podríamos tener un documento gigante y para recorrerlo en busca de algo.....o supongamos que tenemos un montón de comentarios en todos los posts......uffff.....demasiado para que la gestión sea realmente eficiente, planteemonos lo siguiente "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"¿qué es lo que mostramos realmente en el post? ¿mostramos todos los comentarios que tenemos? ¿O realmente tenemos un límite de los que mostramos y luego si el usuario quiere ya pide más?...."}]},{"type":"text","value":" realmente el escenario normalmente es este último ¿verdad?...bien, pero ¿qué hacemos con el resto de nuestros comentarios?...fácil lo que hacemos es "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"linkarlos"}]},{"type":"text","value":", es decir, establecer algún tipo de relación con alguna propiedad."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos paso a paso, primero hemos dicho que tenemos un límite de los post que mostramos inicialmente...supongamos que mostramos 5, entonces no cambia lo que teniamos antes, simplemente que controlamos que tenga 5. Eso lo hacemos con código realmente, es decir depende del cliente...pero y "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"si ya tiene 5, ¿qué hacemos?"}]},{"type":"text","value":"...alguno pensará que tenemos que hacer una query para eliminar y otra para añadir.....pero realmente no es necesario, tal como es el lenguaje podemos hacer las 2 operaciones en la misma query aprovechandonos de la misma búsqueda"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.blog.update({post_title: \"Algo\"},{$pop:{comments:1},$push:{comment:.....}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/operator/update/pop/"},"children":[{"type":"text","value":"$pop"}]},{"type":"text","value":" eliminamos o el último o el primero según queramos y como ya hemos visto con "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/reference/operator/update/push/"},"children":[{"type":"text","value":"$push"}]},{"type":"text","value":" añadimos nuevos elementos. Como vemos esta operación realmente puede ser ínfima o tener un precio mínimo, perfecto...y teniendo un límite de 5 comentarios podemos gestionar los documentos de post de una forma bastante eficiente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora lo siguiente, ¿que hacemos con el resto de los post?, bien lo ideal es tenerlos en otra colección donde hagamos referencia al post en cuestión, por ejemplo"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"{\n    \"comment_id\": 41325,\n    \"post_id\": 12334,\n    \"comment_author\": \"Superman\",\n    \"comment_author_email\": \"superman@correo.com\",\n    \"comment_date\": \"12-12-1212\",\n    \"comment_text\": \"Esto es un supercomentario\"\n},\n{\n    \"comment_id\": 41326,\n    \"post_id\": 12334,\n    \"comment_author\": \"Batman\",\n    \"comment_author_email\": \"batman@correo.com\",\n    \"comment_date\": \"13-13-1313\",\n    \"comment_text\": \"¡¡¡Soy Batman!!!\"\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Cuando el usuario pida más comentarios solo tenemos que buscar por el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"post_id"}]},{"type":"text","value":" y listo, ya tendríamos todos los comentarios que necesitamos y si os fijáis al separarlo de esta manera tenemos la posibilidad de añadirle más información a los comentarios por si la necesitamos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto es solo un ejemplo de como podemos establecer relaciones en nuestras bases de datos simplemente teniendo una propiedad que relacione ambas, esto se puede complicar tanto como sea necesario, lo único siempre pensar en como se va a trabajar realmente en nuestra aplicación, cuales van a ser las querys que se van a realizar o cuales son las que necesitamos para que sea lo más eficiente posible."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A parte de esto tenemos que ver la posibilidad de gestionar un poco "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"el no scheme"}]},{"type":"text","value":", es decir, ¿como evitamos que se cambie el esquema si Mongo acepta cualquier cosa que le pasemos mientras tenga un formato JSON correcto?....bueno aquí tenemos dos entornos que podemos gestionar el de la aplicación cliente y el propio de MongoDB."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En cuanto a la aplicación cliente poco que decir, más que realmente la responsabilidad del modelo de los documentos tenía que estar en el cliente ya sea controlándolo a mano o con modeladores de objetos específicos de cada lenguaje, como puede ser "},{"type":"element","tagName":"a","properties":{"href":"http://mongoosejs.com/"},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mongoose"}]}]},{"type":"text","value":" en NodeJS (lo usaremos más adelante)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"MongoDB con el tiempo, debido a peticiones de la comunidad añadió a finales de 2015 (si no me equivoco) su propio "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validador"}]},{"type":"text","value":" de documentos. Básicamente nos permite controlar qué se inserta o se actualiza en nuestra base de datos, hagamos un ejemplo sencillo solo para que veais un poco funcionaría lo ideal es que miréis la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/core/document-validation/"},"children":[{"type":"text","value":"documentación oficial"}]},{"type":"text","value":" para ver todo lo que podemos hacer con esto. Comentar también que esto debería ser como una segunda comprobación, que exista esta opción no hace que no sea necesaria la opción de controlar los objetos en las aplicaciones cliente."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos a comprobar por ejemplo que en nuestro campo money solo podamos insertar números, ahora mismo tal como lo teniamos podemos insertar propiedades de tipo string sin problemas"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Deadpool\", money: \"one hundred\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora buscamos a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Deadpool"}]},{"type":"text","value":" y a "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"Black Panther"}]},{"type":"text","value":" vemos como cada uno tiene un campo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"money"}]},{"type":"text","value":" distinto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.21.31.png","alt":"Deadpool insert"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para evitar creamos un "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"validator"}]},{"type":"text","value":" de los datos de una colección ya existente de esta forma:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.runCommand({collMod: \"heros\",validator: {money: { $type: \"number\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"collMod"}]},{"type":"text","value":" le estamos indicando la colección que queremos modificar y como validador le indicamos que el campo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"money"}]},{"type":"text","value":" tiene que ser de tipo "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAhora si intentamos insertar un documento nuevo con el campo money como string"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Wolverine\", money: \"two hundreds\"})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Obtenemos este resultado"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.30.10.png","alt":"Failed validation example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos, si o si, que pasarle los datos en el formato que los solicita"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.heros.insert({name: \"Wolverine\", money: 200})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para que realmente los inserte en la base de datos"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/10/Captura-de-pantalla-2017-10-15-a-las-21.31.58.png","alt":"Validation pass example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Estas reglas de validación las podemos hacer tan complejas como queramos, podemos usar expresiones regulares, dar opciones de datos específicas.......lo que he comentado mirar la "},{"type":"element","tagName":"a","properties":{"href":"https://docs.mongodb.com/manual/core/document-validation/"},"children":[{"type":"text","value":"documentación oficial"}]},{"type":"text","value":" sobre el tema y vereis que podéis hacer."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Comentar que podemos crear las reglas de validación junto con la creación de la colección"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"db.createCollection(\"heros2\",{validator: {money: { $type: \"number\"}}})\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y ya de paso si cremos así la colección nos aparece directamente sin insertar ningún dato, y tenemos también nuestra regla de validación desde el principio."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno hasta aquí el post sobre vivir con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"no scheme"}]},{"type":"text","value":", como véis no tenemos un modelado de esquemas al estilo relacional pero creo que entre el poder "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"linkar colecciones"}]},{"type":"text","value":" usando algun campo como referencia y con los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"validators"}]},{"type":"text","value":" podemos trabajar casi en cualquier entorno que queramos con esta base de datos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el próximo post veremos como hacer algunos índices mas complejos como las de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"geolocalicación"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos vemos en el siguienteeee un abrazooorrrrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"documentosenmongodb","heading":"Documentos en MongoDB"},{"id":"scheme","heading":"Scheme"}]},"featureImageSharp":{"base":"MongoBanner-2.png","publicURL":"/static/e2d851a4e8d17762251ac236e48b5140/MongoBanner-2.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-2.png","srcSet":"/static/e2d851a4e8d17762251ac236e48b5140/847ef/MongoBanner-2.png 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/91cba/MongoBanner-2.png 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/8d82d/MongoBanner-2.png 510w","srcWebp":"/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-2.webp","srcSetWebp":"/static/e2d851a4e8d17762251ac236e48b5140/9fca7/MongoBanner-2.webp 175w,\n/static/e2d851a4e8d17762251ac236e48b5140/37a4e/MongoBanner-2.webp 350w,\n/static/e2d851a4e8d17762251ac236e48b5140/23d6c/MongoBanner-2.webp 510w","sizes":"(max-width: 510px) 100vw, 510px"}}}}}]}},"pageContext":{"slug":"mongodb-ninja-ii-queries","prev":"mongodb-ninja-iii","next":"mongodb-ninja-i","tag":"mongodb","limit":3,"skip":0,"primaryTagCount":5,"collectionPaths":{}}},
    "staticQueryHashes": ["1272700106","1676991999","2138873178","2546165603","2681841279","2938721187","293880488","3052966952","4156497161"]}