{"id":57437,"date":"2022-09-19T10:34:51","date_gmt":"2022-09-19T08:34:51","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=57437&#038;preview=true&#038;preview_id=57437"},"modified":"2025-01-17T14:52:16","modified_gmt":"2025-01-17T13:52:16","slug":"operadores-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/","title":{"rendered":"9 Tipos de Operadores de Mongodb que Debes Conocer"},"content":{"rendered":"<p>En cualquier negocio, los datos son tu mayor activo. Al analizar los datos, puedes tomar decisiones sobre las tendencias de los clientes y la predicci\u00f3n de su comportamiento. Esto aumenta la rentabilidad del negocio y la eficacia en la toma de decisiones.<\/p>\n<p>Sin <a href=\"https:\/\/kinsta.com\/es\/blog\/bases-de-datos-de-codigo-abierto\/\">un software de base de datos<\/a>, una tarea sencilla como encontrar la media de todos los valores de un sistema lleno de registros ser\u00eda tediosa. Por suerte, las bases de datos han facilitado y agilizado el an\u00e1lisis de los datos con funciones y operadores.<\/p>\n\n<p>Este art\u00edculo arrojar\u00e1 algo de luz sobre los operadores utilizados en el software de base de datos MongoDB.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>\u00bfQu\u00e9 Son los Operadores de MongoDB?<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-mongodb\/\">MongoDB<\/a> es un software de base de datos NoSQL que gestiona informaci\u00f3n orientada a documentos.<\/p>\n<p>Una de las caracter\u00edsticas clave de MongoDB es su velocidad. Para devolver las consultas m\u00e1s r\u00e1pidamente, MongoDB puede utilizar operadores para realizar funciones espec\u00edficas.<\/p>\n<p>Los operadores son s\u00edmbolos especiales que ayudan a los compiladores a realizar tareas matem\u00e1ticas o l\u00f3gicas. MongoDB ofrece varios tipos de operadores para interactuar con la base de datos.<\/p>\n<h2>Tipos de Operadores de MongoDB<\/h2>\n<p>Hay nueve tipos de operadores, cada uno de los cuales recibe el nombre de su funci\u00f3n. Por ejemplo, los operadores l\u00f3gicos utilizan operaciones l\u00f3gicas. Para ejecutarlos, tienes que utilizar una palabra clave espec\u00edfica y seguir la sintaxis. Sin embargo, \u00a1son bastante f\u00e1ciles de seguir!<\/p>\n<p>Al final del art\u00edculo, podr\u00e1s aprender lo b\u00e1sico de cada operador y sus funciones.<\/p>\n<h3>Operadores l\u00f3gicos<\/h3>\n<p>Los operadores l\u00f3gicos se utilizan a menudo para filtrar datos en funci\u00f3n de las condiciones dadas. Tambi\u00e9n permiten la evaluaci\u00f3n de muchas condiciones, de las que hablaremos con m\u00e1s detalle.<\/p>\n<p>A continuaci\u00f3n te presentamos algunos operadores l\u00f3gicos que puedes utilizar:<\/p>\n<h4 id=\"and\" class=\"has-anchor-hash\">$and<\/h4>\n<p>Una condici\u00f3n \u00aband\u00bb realiza una operaci\u00f3n l\u00f3gica \u00aband\u00bb en una matriz de dos o m\u00e1s expresiones. Selecciona los documentos en los que se cumplen <em>todas <\/em>las condiciones de las expresiones.<\/p>\n<p>Esta es la sintaxis est\u00e1ndar de la expresi\u00f3n <code>$and<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $and: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<pre><code class=\"language-php\">db.inventory.find( { $and: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<h4>$or<\/h4>\n<p>Una condici\u00f3n \u00abor\u00bb realiza una operaci\u00f3n l\u00f3gica \u00abor\u00bb en una matriz de dos o m\u00e1s expresiones. Selecciona los documentos en los que al menos una de las expresiones es verdadera.<\/p>\n<p>Esta es la sintaxis est\u00e1ndar de la expresi\u00f3n <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Por ejemplo, si queremos seleccionar los documentos en los que el precio es de 10 d\u00f3lares o la cantidad es inferior a 15, podemos introducir la siguiente consulta<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>No tenemos que limitar la expresi\u00f3n a dos criterios, podemos a\u00f1adir m\u00e1s. Por ejemplo, la siguiente consulta selecciona aquellos documentos cuyo precio es igual a 10 d\u00f3lares, la cantidad es inferior a 15, o la etiqueta es estacionaria:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>Al ejecutar estas cl\u00e1usulas, MongoDB realiza una exploraci\u00f3n de la colecci\u00f3n o una exploraci\u00f3n del \u00edndice. Si todos los \u00edndices admiten las cl\u00e1usulas, entonces MongoDB utiliza los \u00edndices para comprobar una expresi\u00f3n <code>$or<\/code>. En caso contrario, utiliza un escaneo de la colecci\u00f3n en su lugar.<\/p>\n<p>Pero si quieres comprobar los criterios en el mismo campo, es posible que quieras utilizar el operador <code>$in<\/code> en lugar del operador <code>$or<\/code>. Por ejemplo, si quieres una colecci\u00f3n de documentos en la que la cantidad sea 10 o 20, tendr\u00e1s que ejecutar la siguiente consulta <code>$in<\/code> en su lugar:<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>M\u00e1s adelante hablaremos del operador <code>$in<\/code>.<\/p>\n<h4>$nor<\/h4>\n<p>Este operador realiza una operaci\u00f3n l\u00f3gica \u00abnor\u00bb en una matriz utilizando una o varias expresiones. A continuaci\u00f3n, selecciona los documentos que no cumplen las expresiones de la consulta. En t\u00e9rminos m\u00e1s sencillos, hace lo contrario de la condici\u00f3n <code>$or<\/code>.<\/p>\n<p>Esta es la sintaxis general:<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>Consideremos la siguiente consulta:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Esta consulta selecciona los documentos que contienen:<\/p>\n<ul>\n<li>un valor del campo de precio que no sea igual a 3,99 d\u00f3lares y un valor de venta que no sea verdadero; o<\/li>\n<li>un valor de campo de precio no igual a 3,99 d\u00f3lares, y un campo de venta vac\u00edo o ausente; o<\/li>\n<li>no hay campo de precio y el campo de venta no es verdadero; o<\/li>\n<li>ni campo de precio ni campo de venta poblados o presentes<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Este operador realiza una operaci\u00f3n l\u00f3gica de \u00abnot\u00bb en una matriz para la expresi\u00f3n especificada. A continuaci\u00f3n, selecciona los documentos que no coinciden con las expresiones de la consulta. Esto incluye los documentos que no contienen el campo.<\/p>\n<p>Esta es la sintaxis general:<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Por ejemplo, toma la siguiente consulta:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Esta consulta seleccionar\u00eda los documentos que contengan<\/p>\n<ul>\n<li>un campo de precio cuyo valor es mayor o igual a 3,99 d\u00f3lares; y<\/li>\n<li>un campo de precio no est\u00e1 poblado o no existe.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><code>{ $not: { $lt: 3.99 } }<\/code> es diferente del operador <code>$gte<\/code>. <code>{ $gte: 3.99 }<\/code> devuelve s\u00f3lo los documentos en los que existe el campo precio y su valor es mayor o igual que 3.99 $ (el operador <code>$not<\/code> devuelve incluso aquellos documentos en los que no existe el campo precio).<\/p>\n<\/aside>\n\n<h3>Operadores de comparaci\u00f3n<\/h3>\n<p>Los operadores de comparaci\u00f3n pueden utilizarse para comparar valores en uno o m\u00e1s documentos.<\/p>\n<p>A continuaci\u00f3n se muestra un c\u00f3digo de ejemplo de una simple colecci\u00f3n de inventario para una tienda de supermercado:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] },\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] },\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] },\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] },\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] },\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<p>Utilizaremos este ejemplo mientras detallamos cada operador de comparaci\u00f3n a continuaci\u00f3n.<\/p>\n<h4>Igual a ($eq)<\/h4>\n<p>Este operador coincide con los valores que son iguales al valor dado:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Por ejemplo, si queremos recuperar un documento concreto de la colecci\u00f3n de inventario que tenga el valor exacto de cantidad \u00ab20\u00bb, introducir\u00edamos el siguiente comando:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>La consulta devolver\u00eda lo siguiente:<\/p>\n<pre><code class=\"language-php\">{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }, \n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Mayor que ($gt)<\/h4>\n<p>Este operador coincide si los valores son mayores que el valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>En este ejemplo, recuperamos los documentos en los que la cantidad es mayor que 15:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>La consulta devolver\u00eda lo siguiente:<\/p>\n<pre><code class=\"language-php\">{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Menor que ($lt)<\/h4>\n<p>Este operador coincide si los valores son menores que el valor proporcionado:<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Busquemos los documentos con una cantidad inferior a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>La consulta devolver\u00eda lo siguiente:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Mayor o igual que ($gte)<\/h4>\n<p>Este operador coincide cuando los valores son mayores o iguales que el valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>En este ejemplo, recuperamos los documentos cuya cantidad es mayor o igual a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Esta consulta devolver\u00eda lo siguiente:<\/p>\n<pre><code class=\"language-php\">{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }<\/code><\/pre>\n<h4>Menor o igual que ($lte)<\/h4>\n<p>Este operador s\u00f3lo coincide si los valores son menores o iguales que el valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Busquemos los documentos con una cantidad menor o igual a 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Podemos esperar que esta consulta devuelva lo siguiente:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>En ($en)<\/h4>\n<p>Este operador devuelve los documentos que coinciden con los valores especificados:<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>El valor de un campo es igual a cualquier valor de la matriz especificada. Para recuperar los documentos con los valores \u00ab30\u00bb y \u00ab15\u00bb en la colecci\u00f3n de inventario, por ejemplo, har\u00edas lo siguiente:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>El resultado ser\u00eda:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }<\/code><\/pre>\n<h4>No en ($nin)<\/h4>\n<p>Este operador devuelve los documentos que no coinciden con los valores dados. Esta es la sintaxis b\u00e1sica del operador <code>$nin<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $nin: [ &lt;value1&gt;, &lt;value2&gt; ... &lt;valueN&gt; ]<\/code><\/pre>\n<p><code>$nin<\/code> selecciona los documentos donde:<\/p>\n<ul>\n<li>el valor del campo no est\u00e1 en la matriz especificada; o<\/li>\n<li>el campo no existe.<\/li>\n<\/ul>\n<p>Si el campo contiene matrices, seleccionar\u00e1 las matrices en las que no est\u00e9 presente ning\u00fan elemento especificado en la secci\u00f3n de valores. Por ejemplo, queremos seleccionar aquellos documentos en los que la cantidad no sea ni 20 ni 15.<\/p>\n<p>Adem\u00e1s, tambi\u00e9n coincide con los documentos que no tienen un campo de cantidad:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>El resultado ser\u00eda:<\/p>\n<pre><code class=\"language-php\">{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<h4>No es igual ($ne)<\/h4>\n<p>El operador <code>$ne<\/code> devuelve los documentos en los que el valor especificado no es igual:<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Por ejemplo, digamos que queremos seleccionar todos los documentos en los que la cantidad no es igual a 20:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>El resultado ser\u00eda:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<p>Del resultado anterior, podemos ver que la consulta seleccionar\u00e1 los documentos que no tengan un campo de cantidad.<\/p>\n<h3>Operadores de elementos<\/h3>\n<p>Los operadores de consulta de elementos pueden identificar los documentos utilizando los campos del documento. Los operadores de elementos consisten en <code>$exist<\/code> y <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Este operador coincide con los documentos que tienen un campo especificado. Este operador tiene un valor booleano que puede ser <code>true<\/code> o <code>false<\/code>.<\/p>\n<p>Si se especifica que es <code>true<\/code>, coincide con los documentos que contienen ese campo, incluidos los documentos en los que el valor del campo es nulo. Si &lt;boolean&gt; es <code>false<\/code>, la consulta s\u00f3lo devuelve los documentos que no contienen el campo.<\/p>\n<p>Esta es la sintaxis est\u00e1ndar:<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } } )<\/code><\/pre>\n<p>Tomemos un ejemplo en el que tenemos una colecci\u00f3n de datos para un array llamado \u00abbagofmarbles\u00bb, en el que cada bolsa contiene canicas de diferentes colores:<\/p>\n<pre><code class=\"language-php\">{ red: 5, green: 5, blue: null }\n{ red: 3, green: null, blue: 8 }\n{ red: null, green: 3, blue: 9 }\n{ red: 1, green: 2, blue: 3 }\n{ red: 2, blue: 5 }\n{ red: 3, green: 2 }\n{ red: 4 }\n{ green: 2, blue: 4 }\n{ green: 2 }\n{ blue: 6 }<\/code><\/pre>\n<p>Digamos que queremos una consulta que nos devuelva s\u00f3lo las bolsas en las que existen canicas rojas. Esto significa que tendr\u00edamos que introducir el valor booleano como <code>true<\/code>. Echemos un vistazo:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>Los resultados consistir\u00edan en aquellos documentos que contengan el campo \u00abrojo\u00bb, aunque el valor fuera <code>null<\/code>. Sin embargo, no consistir\u00edan en los documentos en los que el campo \u00abrojo\u00bb ni siquiera existiera:<\/p>\n<pre><code class=\"language-php\">{ red: 5, green: 5, blue: null }\n{ red: 3, green: null, blue: 8 }\n{ red: null, green: 3, blue: 9 }\n{ red: 1, green: 2, blue: 3 }\n{ red: 2, blue: 5 }\n{ red: 3, green: 2 }\n{ red: 4 }<\/code><\/pre>\n<p>Si s\u00f3lo quisi\u00e9ramos las bolsas en las que las canicas rojas ni siquiera existen como campo, podemos introducir la siguiente consulta:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>Los resultados consistir\u00edan en aquellos documentos que no contienen el campo \u00abrojo\u00bb:<\/p>\n<pre><code class=\"language-php\">{ green: 2, blue: 4 }\n{ green: 2 }\n{ blue: 6 }<\/code><\/pre>\n<h4>$type<\/h4>\n<p>Este operador hace coincidir los documentos seg\u00fan el tipo de campo especificado. Es \u00fatil cuando tienes datos muy desestructurados, o cuando los tipos de datos no son predecibles. Estos tipos de campo son tipos BSON especificados y pueden definirse por n\u00famero de tipo o por alias.<\/p>\n<p>Esta es la sintaxis general de <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>Supongamos que tenemos una libreta de direcciones que contiene los siguientes documentos<\/p>\n<pre><code class=\"language-php\">db={\n  addressBook: [\n    {\n      \"_id\": 1,\n      address: \"2100 Jupiter Spot\",\n      zipCode: \"9036325\"\n    },\n    {\n      \"_id\": 2,\n      address: \"25 Moon Place\",\n      zipCode: 26237\n    },\n    {\n      \"_id\": 3,\n      address: \"2324 Neptune Ring\",\n      zipCode: NumberLong(77622222)\n    },\n    {\n      \"_id\": 4,\n      address: \"33 Saturns Moon\",\n      zipCode: NumberInt(117)\n    },\n    {\n      \"_id\": 5,\n      address: \"1044 Venus Lane\",\n      zipCode: [\n        \"99883637232\",\n        \"73488976234\"\n      ]\n    }\n  ]\n}<\/code><\/pre>\n<p>Al observar los documentos anteriores, el c\u00f3digo postal tiene diferentes tipos de datos. Esto incluye valores largos, dobles, enteros y de cadena.<\/p>\n<p>Si s\u00f3lo queremos los documentos que tienen un tipo de datos espec\u00edfico como c\u00f3digo postal \u2013 tomemos la cadena para este caso \u2013 tendr\u00edamos que introducir la siguiente consulta en el compilador:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Esto nos devolver\u00eda los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">[\n  {\n    \"_id\": 1,\n    \"address\": \"2100 Jupiter Spot\",\n    \"zipCode\": \"9036325\"\n  },\n  {\n    \"_id\": 5,\n    \"address\": \"1044 Venus Lane\",\n    \"zipCode\": [\n      \"99883637232\",\n      \"73488976234\"\n    ]\n  }\n]<\/code><\/pre>\n<p>Adem\u00e1s, existe un tipo \u00abn\u00famero\u00bb, que incluye todos los valores largos, enteros o dobles como una matriz que contiene un elemento de los tipos especificados:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Resultado:<\/p>\n<pre><code class=\"language-php\">[\n{\n      \"_id\": 2,\n      address: \"25 Moon Place\",\n      zipCode: 26237\n    },\n    {\n      \"_id\": 3,\n      address: \"2324 Neptune Ring\",\n      zipCode: NumberLong(77622222)\n    },\n    {\n      \"_id\": 4,\n      address: \"33 Saturns Moon\",\n      zipCode: NumberInt(117)\n    }\n]<\/code><\/pre>\n<p>Si los documentos tienen un tipo de campo de matriz, el operador <code>$type<\/code> devuelve los documentos en los que al menos un elemento de la matriz coincide con el tipo pasado al operador.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>A partir de MongoDB 3.6, la consulta de <code>$type: \"array\"<\/code> devuelve los documentos en los que el propio campo es un array. Sin embargo, al utilizar la misma consulta, las versiones anteriores sol\u00edan devolver documentos en los que el campo es una matriz, y al menos un elemento era del tipo de datos matriz.<\/p>\n<\/aside>\n\n<h3>Operadores de matrices<\/h3>\n<p>MongoDB tambi\u00e9n dispone de operadores de matrices o arrays, para consultar documentos que contienen matrices.<\/p>\n<p>Hay tres operadores principales: <code>$all<\/code>, <code>$elemMatch<\/code> y <code>$size<\/code>. A continuaci\u00f3n hablaremos de cada uno de ellos en detalle.<\/p>\n<h4>$all<\/h4>\n<p>El operador <code>$all<\/code> elige los documentos en los que el valor de un campo es una matriz que contiene los elementos especificados:<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>Por ejemplo, supongamos que tenemos una colecci\u00f3n de documentos de una tienda de ropa, con lo siguiente en el inventario.<\/p>\n<pre><code class=\"language-php\">{\n   _id: ObjectId(\"5234cc89687ea597eabee675\"),\n   code: \"shirt\",\n   tags: [ \"sale\", \"shirt\", \"button\", \"y2k\", \"casual\" ],\n   qty: [\n          { size: \"S\", num: 10, color: \"blue\" },\n          { size: \"M\", num: 45, color: \"blue\" },\n          { size: \"L\", num: 100, color: \"green\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"5234cc8a687ea597eabee676\"),\n   code: \"pant\",\n   tags: [ \"y2k\", \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"6\", num: 100, color: \"green\" },\n          { size: \"6\", num: 50, color: \"blue\" },\n          { size: \"8\", num: 100, color: \"brown\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"5234ccb7687ea597eabee677\"),\n   code: \"pant2\",\n   tags: [ \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"S\", num: 10, color: \"blue\" },\n          { size: \"M\", num: 100, color: \"blue\" },\n          { size: \"L\", num: 100, color: \"green\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"52350353b2eff1353b349de9\"),\n   code: \"shirt2\",\n   tags: [ \"y2k\", \"trendy\" ],\n   qty: [\n          { size: \"M\", num: 100, color: \"green\" }\n        ]\n}<\/code><\/pre>\n<p>Querr\u00edamos recuperar cualquier documento (en este caso, la ropa) del inventario que est\u00e9 vinculado con las etiquetas \u00abtrendy\u00bb y \u00aby2k\u00bb. La siguiente consulta utiliza el operador <code>$all<\/code>, donde el valor del campo etiquetas es una matriz cuyos elementos incluyen \u00aby2k\u00bb y \u00abtrendy\u00bb:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>La consulta anterior devuelve lo siguiente:<\/p>\n<pre><code class=\"language-php\">{\n   _id: ObjectId(\"5234cc8a687ea597eabee676\"),\n   code: \"pant\",\n   tags: [ \"y2k\", \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"6\", num: 100, color: \"green\" },\n          { size: \"6\", num: 50, color: \"blue\" },\n          { size: \"8\", num: 100, color: \"brown\" }\n        ]\n}\n\n{\n   _id: ObjectId(\"52350353b2eff1353b349de9\"),\n   code: \"shirt2\",\n   tags: [ \"y2k\", \"trendy\" ],\n   qty: [\n          { size: \"M\", num: 100, color: \"green\" }\n        ]\n}<\/code><\/pre>\n<p>En el ejemplo anterior, tambi\u00e9n encontramos que el operador <code>$all<\/code> simplemente realiza la misma funci\u00f3n que la operaci\u00f3n <code>$and<\/code>.<\/p>\n<p>Como alternativa, podr\u00edamos utilizar la siguiente consulta, que dar\u00eda un resultado similar al anterior:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\n  $and: [\n    {\n      tags: \"y2k\"\n    },\n    {\n      tags: \"trendy\"\n    }\n  ]\n})<\/code><\/pre>\n<h4>$elemMatch<\/h4>\n<p>El operador <code>$elemMatch<\/code> coincide con los documentos que contienen un campo de matriz con al menos un elemento que coincide con todos los criterios de consulta especificados:<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Aunque podemos utilizar operadores de comparaci\u00f3n como <code>$lte<\/code> y <code>$gte<\/code>, si s\u00f3lo especificamos una \u00fanica condici\u00f3n de consulta dentro de <code>$elemMatch<\/code>, y no utilizamos los operadores <code>$not<\/code> o <code>$ne<\/code>, se puede omitir la utilizaci\u00f3n de <code>$elemMatch<\/code>, ya que esencialmente estar\u00eda realizando la misma funci\u00f3n.<\/p>\n<p>Hay algunas cosas m\u00e1s que hay que tener en cuenta al utilizar este operador, principalmente:<\/p>\n<ul>\n<li>No puedes especificar una expresi\u00f3n <code>$where<\/code> en una operaci\u00f3n <code>$elemMatch<\/code>.<\/li>\n<li>No puedes especificar una expresi\u00f3n de consulta <code>$text<\/code> en una operaci\u00f3n <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>Por ejemplo, tenemos los siguientes documentos en la colecci\u00f3n de resultados de estudiantes:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, results: [ 92, 89, 98 ] }\n{ _id: 2, results: [ 85, 99, 99 ] }<\/code><\/pre>\n<p>La siguiente consulta s\u00f3lo coincide con los documentos en los que la matriz de resultados contiene al menos un elemento que es mayor o igual que 90 y es menor que 95:<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>Nuestra consulta devuelve el siguiente documento, ya que el elemento 92 es a la vez mayor o igual que 90 y menor que 95:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>El operador <code>$size<\/code> devuelve aquellos documentos en los que el tama\u00f1o de la matriz coincide con el n\u00famero de elementos especificado en el argumento:<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>Aqu\u00ed tienes un ejemplo:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Esto devolver\u00eda todos los documentos de la colecci\u00f3n especificada en la que el campo es una matriz con 2 elementos: <code>{ field: [ orange, apple] }<\/code> y <code>{ field: [ blue, red] }<\/code>, pero no <code>{ field: blue}<\/code> ni <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Sin embargo, aunque podemos introducir el valor concreto como tama\u00f1o, no podemos especificar rangos de valores como tama\u00f1o.<\/p>\n<h3>Operadores geoespaciales<\/h3>\n<p>MongoDB te permite almacenar datos geoespaciales en forma de tipos GeoJSON. GeoJSON es un formato de est\u00e1ndar abierto basado en la notaci\u00f3n de objetos de JavaScript que puede representar caracter\u00edsticas geogr\u00e1ficas y admitir atributos no espaciales. Hay dos tipos de operadores geoespaciales de los que hablaremos en este art\u00edculo: los especificadores de geometr\u00eda y los selectores de consulta.<\/p>\n<h4>$geometry<\/h4>\n<p>Este operador menciona la geometr\u00eda GeoJSON para su uso con los siguientes operadores de consulta geoespacial: <code>$geoIntersects<\/code>, <code>$geoWithin<\/code>,<code>$nearSphere<\/code>, y <code>$near<\/code>. <code>$geometry<\/code> aprovecha EPSG:4326 como sistema de referencia de coordenadas (CRS) por defecto.<\/p>\n<p>Para mencionar objetos GeoJSON con el CRS por defecto, puedes aprovechar el siguiente fragmento para <code>$geometry<\/code>:<\/p>\n<pre><code class=\"language-php\">$geometry: {\n   type: \"&lt;GeoJSON object type&gt;\",\n   coordinates: [ &lt;coordinates&gt; ]\n}<\/code><\/pre>\n<p>Para mencionar un pol\u00edgono GeoJSON de un solo anillo con un CRS de MongoDB adaptado, puedes utilizar el siguiente fragmento (s\u00f3lo puedes utilizarlo para <code>$geoWithin<\/code> y <code>$geoIntersects<\/code>):<\/p>\n<pre><code class=\"language-php\">$geometry: {\n   type: \"Polygon\",\n   coordinates: [ &lt;coordinates&gt; ],\n   crs: {\n      type: \"name\",\n      properties: { name: \"urn:x-mongodb:crs:strictwinding:EPSG:4326\" }\n   }\n}<\/code><\/pre>\n<h4>$polygon<\/h4>\n<p>El operador <code>$polygon<\/code> puede utilizarse para especificar un pol\u00edgono para una consulta geoespacial <code>$geoWithin<\/code> sobre pares de coordenadas heredados. Esta consulta devolver\u00e1 los pares que est\u00e9n dentro de los l\u00edmites del pol\u00edgono. Sin embargo,<code> $polygon<\/code> no consultar\u00e1 ning\u00fan objeto GeoJSON. Para definir un pol\u00edgono, debes especificar una matriz de puntos de coordenadas como se indica a continuaci\u00f3n:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $polygon: [ [ &lt;x1&gt; , &lt;y1&gt; ], [ &lt;x2&gt; , &lt;y2&gt; ], [ &lt;x3&gt; , &lt;y3&gt; ], ... ]\n      }\n   }\n}<\/code><\/pre>\n<p>Aqu\u00ed, el \u00faltimo punto est\u00e1 impl\u00edcitamente conectado al primero. Puedes mencionar tantos puntos o lados como quieras.<\/p>\n<p>Por ejemplo, la siguiente consulta devolver\u00e1 todos los documentos que tienen coordenadas que existen dentro del pol\u00edgono definido por [0,0], [1,5] y [3,3]:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n  {\n     loc: {\n       $geoWithin: { $polygon: [ [ 0 , 0 ], [ 1 , 5 ], [ 3 , 3 ] ] }\n     }\n  }\n)<\/code><\/pre>\n<h4>$geoWithin<\/h4>\n<p>Este operador se puede utilizar para elegir documentos con datos geoespaciales que est\u00e9n completamente contenidos en una forma espec\u00edfica. La forma especificada puede ser un multipol\u00edgono GeoJSON, un pol\u00edgono GeoJSON (de anillos m\u00faltiples o de anillos simples), o una forma que puede ser definida por pares de coordenadas heredadas.<\/p>\n<p>El operador <code>$geoWithin<\/code> aprovechar\u00e1 el operador <code>$geometry<\/code> para mencionar el objeto GeoJSON.<\/p>\n<p>Para mencionar los multipol\u00edgonos o pol\u00edgonos GeoJSON a trav\u00e9s del Sistema de Referencia de Coordenadas (SRC) por defecto, puedes utilizar la sintaxis mencionada a continuaci\u00f3n:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $geometry: {\n            type: &lt;\"Polygon\" or \"MultiPolygon\"&gt; ,\n            coordinates: [ &lt;coordinates&gt; ]\n         }\n      }\n   }\n}<\/code><\/pre>\n<p>Para las consultas de <code>$geoWithin<\/code> que mencionan las geometr\u00edas GeoJSON con \u00e1reas mayores que un solo hemisferio, el uso del CRS por defecto llevar\u00eda a consultas de las geometr\u00edas complementarias.<\/p>\n<p>Para mencionar un pol\u00edgono GeoJSON de un solo anillo con un CRS personalizado de MongoDB, puedes aprovechar el prototipo mencionado a continuaci\u00f3n en la expresi\u00f3n <code>$geometry<\/code>:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $geometry: {\n           type: \"Polygon\" ,\n           coordinates: [ &lt;coordinates&gt; ],\n           crs: {\n              type: \"name\",\n              properties: { name: \"urn:x-mongodb:crs:strictwinding:EPSG:4326\" }\n           }\n         }\n      }\n   }\n}<\/code><\/pre>\n<p>El siguiente ejemplo recoge todos los datos de localizaci\u00f3n que existen completamente dentro de un pol\u00edgono GeoJSON, siendo el \u00e1rea del pol\u00edgono menor que el \u00e1rea de un solo hemisferio:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     loc: {\n       $geoWithin: {\n          $geometry: {\n             type : \"Polygon\" ,\n             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ]\n          }\n       }\n     }\n   }\n)<\/code><\/pre>\n<h4>$box<\/h4>\n<p>Puedes utilizar <code>$box<\/code> para especificar un rect\u00e1ngulo para que una consulta geoespacial <code>$geoWithin<\/code> te proporcione los documentos que est\u00e1n dentro de los l\u00edmites del rect\u00e1ngulo, seg\u00fan sus datos de localizaci\u00f3n basados en puntos. Cuando utilices <code>$geoWithin<\/code> con el <code>$box<\/code>, obtendr\u00e1s documentos basados en las coordenadas de la consulta. En este escenario, <code>$geoWithin<\/code> no consultar\u00e1 ninguna forma GeoJSON.<\/p>\n<p>Para aprovechar el operador <code>$box<\/code>, tienes que mencionar las esquinas superior derecha e inferior izquierda del rect\u00e1ngulo en un objeto array:<\/p>\n<pre><code class=\"language-php\">{ &lt;location field&gt; : { $geoWithin: { $box: [ [ &lt;bottom left coordinates&gt; ],\n [ &lt;upper right coordinates&gt; ] ] } } }<\/code><\/pre>\n<p>La consulta mencionada calcular\u00e1 la distancia utilizando la geometr\u00eda planar (plana). La siguiente consulta devolver\u00e1 todos los documentos que est\u00e9n dentro de la caja que tenga puntos en: [0,0], [0,30], [30,0], [30,30]:<\/p>\n<pre><code class=\"language-php\">db.places.find ( { \n loc: { $geoWithin: { $box: [ [ 0,0 ], [ 30,30 ] ] } }\n} )<\/code><\/pre>\n<h4>$nearSphere<\/h4>\n<p>Puedes utilizar <code>$nearSphere<\/code> para mencionar un punto para el que una consulta geoespacial devuelva los documentos de m\u00e1s cercano a m\u00e1s lejano.<\/p>\n<p>MongoDB utiliza la geometr\u00eda esf\u00e9rica para calcular las distancias para <code>$nearSphere<\/code>. Necesitar\u00e1 un \u00edndice geoespacial como el siguiente:<\/p>\n<ol>\n<li>\u00edndice 2d para datos de localizaci\u00f3n descritos como pares de coordenadas heredados. Para aprovechar un \u00edndice 2d en puntos GeoJSON, debes generar el \u00edndice en el campo de coordenadas del objeto GeoJSON.<\/li>\n<li>\u00edndice 2dsphere para datos de localizaci\u00f3n descritos como puntos GeoJSON.<\/li>\n<\/ol>\n<p>Para mencionar un punto GeoJSON, puedes aprovechar la siguiente sintaxis:<\/p>\n<pre><code class=\"language-php\">{\n  $nearSphere: {\n     $geometry: {\n        type : \"Point\",\n        coordinates : [ &lt;longitude&gt;, &lt;latitude&gt; ]\n     },\n     $minDistance: &lt;distance in meters&gt;,\n     $maxDistance: &lt;distance in meters&gt; \n  }\n}<\/code><\/pre>\n<p>Aqu\u00ed, <code>$minDistance<\/code> y <code>$maxDistance<\/code> son opcionales. <code>$minDistance<\/code> puede limitar los resultados a aquellos documentos que est\u00e9n al menos a la distancia especificada del centro. Puedes utilizar <code>$maxDistance<\/code> para cualquiera de los dos \u00edndices.<\/p>\n<p>Ahora, considera una colecci\u00f3n de \u00ablugares\u00bb que consiste en documentos con un campo de ubicaci\u00f3n que tiene un \u00edndice 2dsphere. El siguiente ejemplo devolver\u00eda los puntos cuya ubicaci\u00f3n est\u00e1 a un m\u00ednimo de 2.000 metros y un m\u00e1ximo de 6.000 metros del punto que elijas, ordenados de m\u00e1s cercano a m\u00e1s lejano:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     location: {\n        $nearSphere: {\n           $geometry: {\n              type : \"Point\",\n              coordinates : [ -43.9532, 50.32 ]\n           },\n           $minDistance: 2000,\n           $maxDistance: 6000\n        }\n     }\n   }\n)<\/code><\/pre>\n<h4>$geoIntersects<\/h4>\n<p>El operador <code>$geoIntersects<\/code> te permite seleccionar los documentos cuyos datos geoespaciales se intersectan con un objeto GeoJSON concreto (es decir, cuando la convergencia del objeto especificado y los datos no est\u00e1 vac\u00eda). Aprovecha el operador <code>$geometry<\/code> para especificar el objeto GeoJSON.<\/p>\n<p>Para mencionar los multipol\u00edgonos o pol\u00edgonos GeoJSON a trav\u00e9s del sistema de referencia de coordenadas (CRS) por defecto, puedes utilizar la siguiente sintaxis:<\/p>\n<pre><code class=\"language-php\">{ &lt;location field&gt;: {\n     $geoIntersects: {\n        $geometry: {\n           type: \"&lt;GeoJSON object type&gt;\" ,\n           coordinates: [ &lt;coordinates&gt; ]\n        }\n     }\n  }\n}<\/code><\/pre>\n<p>La siguiente instancia utilizar\u00e1 <code>$geoIntersects<\/code> para recoger todos los datos loc que se cruzan con el pol\u00edgono descrito por la matriz de coordenadas:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     loc: {\n       $geoIntersects: {\n          $geometry: {\n             type: \"Polygon\" ,\n             coordinates: [\n               [ [ 0, 0 ], [ 2, 6 ], [ 4, 1 ], [ 0, 0 ] ]\n             ]\n          }\n       }\n     }\n   }\n)<\/code><\/pre>\n<h4>$center<\/h4>\n<p>El operador <code>$center<\/code> menciona un c\u00edrculo para una consulta <code>$geoWithin<\/code> que devuelve los pares de coordenadas heredadas que est\u00e1n dentro de los l\u00edmites del c\u00edrculo.<\/p>\n<p><code>$center<\/code> no devuelve objetos GeoJSON. Para aprovechar el operador <code>$center<\/code>, tienes que especificar un array que contenga:<\/p>\n<ol>\n<li>El radio del c\u00edrculo, medido en las unidades utilizadas por el sistema de coordenadas.<\/li>\n<li>Las coordenadas de la cuadr\u00edcula del punto central del c\u00edrculo.<\/li>\n<\/ol>\n<pre><code class=\"language-php\">{\n  &lt;location field&gt; : {\n      $geoWithin: { $center: [ [ &lt;x&gt; , &lt;y&gt; ] , &lt;radius&gt; ] }\n   }\n}<\/code><\/pre>\n<p>El ejemplo mencionado a continuaci\u00f3n devolver\u00e1 todos los documentos que tengan coordenadas que se encuentren dentro del c\u00edrculo centrado en [2,3] y con un radio de 40:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } }\n)<\/code><\/pre>\n<h3>Operadores de proyecci\u00f3n<\/h3>\n<p>Puedes utilizar operadores de proyecci\u00f3n para mencionar los campos devueltos por una operaci\u00f3n. Los operadores de proyecci\u00f3n de MongoDB permiten utilizar la funci\u00f3n <code>find()<\/code> con argumentos de filtrado de datos. Esto ayuda a los usuarios a extraer s\u00f3lo los campos de datos necesarios de un documento. Por tanto, permite proyectar datos transparentes y concisos sin afectar al rendimiento general de la base de datos.<\/p>\n<h4>$elemMatch (proyecci\u00f3n)<\/h4>\n<p>El operador <code>$elemMatch<\/code> se encarga de limitar el contenido de un campo de los resultados de la consulta para que s\u00f3lo contenga el primer elemento que coincida con la condici\u00f3n <code>$elemMatch<\/code>.<\/p>\n<p>Debes tener en cuenta algunas cosas antes de utilizar <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>A partir de MongoDB 4.4, independientemente del orden de los campos en el documento, la proyecci\u00f3n <code>$elemMatch<\/code> de un campo existente devuelve el campo tras la inclusi\u00f3n de otros campos existentes.<\/li>\n<li>Tanto el operador <code>$elemMatch<\/code> como el <code>$<\/code> proyectan el primer elemento coincidente de una matriz en funci\u00f3n de una condici\u00f3n especificada. El operador <code>$<\/code> proyectar\u00eda el primer elemento coincidente de la matriz de cada documento de una colecci\u00f3n bas\u00e1ndose en alguna condici\u00f3n de la sentencia de consulta, mientras que el operador de proyecci\u00f3n <code>$elemMatch<\/code> toma un argumento de condici\u00f3n expl\u00edcito. Esto te permite proyectar en base a una condici\u00f3n no presente en la consulta, o si necesitas proyectar en base a varios campos de los documentos incrustados en el array.<\/li>\n<\/ul>\n<p>Tambi\u00e9n debes tener en cuenta las siguientes restricciones antes de utilizar el operador <code>$elemMatch<\/code> en tus datos:<\/p>\n<ul>\n<li>No puedes mencionar una expresi\u00f3n de consulta <code>$text<\/code> dentro de un operador <code>$elemMatch<\/code>.<\/li>\n<li><code>db.collection.find()<\/code> las operaciones sobre vistas no admiten el operador de proyecci\u00f3n <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>El siguiente ejemplo sobre el operador de proyecci\u00f3n <code>$elemMatch<\/code> supone una colecci\u00f3n <code>schools<\/code> con los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{\n _id: 1,\n zipcode: \"63108\",\n students: [\n              { name: \"mark\", school: 102, age: 9 },\n              { name: \"geoff\", school: 101, age: 13 },\n              { name: \"frank\", school: 104, age: 12 }\n           ]\n}\n{\n _id: 2,\n zipcode: \"63110\",\n students: [\n              { name: \"harry\", school: 103, age: 14 },\n              { name: \"george\", school: 103, age: 7 },\n           ]\n}\n{\n _id: 3,\n zipcode: \"63108\",\n students: [\n              { name: \"harry\", school: 103, age: 14 },\n              { name: \"george\", school: 103, age: 7 },\n           ]\n}\n{\n _id: 4,\n zipcode: \"63110\",\n students: [\n              { name: \"jim\", school: 103, age: 9 },\n              { name: \"michael\", school: 103, age: 12 },\n           ]\n}<\/code><\/pre>\n<p>En este caso, la operaci\u00f3n <code>find()<\/code> busca todos los documentos en los que el valor del campo c\u00f3digo postal es 63110. La proyecci\u00f3n <code>$elemMatch<\/code> devolver\u00eda s\u00f3lo el primer elemento coincidente de la matriz <code>students<\/code> en el que el campo <code>school<\/code> tenga el valor 103:<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>Este es el resultado:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"students\" : [ { \"name\" : \"harry\", \"school\" : 103, \"age\" : 14 } ] }\n{ \"_id\" : 4, \"students\" : [ { \"name\" : \"jim\", \"school\" : 103, \"age\" : 9 } ] }<\/code><\/pre>\n<h4>$slice (proyecci\u00f3n)<\/h4>\n<p>El operador de proyecci\u00f3n <code>$slice<\/code> puede utilizarse para especificar el n\u00famero de elementos de una matriz que se devolver\u00e1n en el resultado de la consulta:<\/p>\n<pre><code class=\"language-php\">db.collection.find(\n   &lt;query&gt; ,\n   { &lt;arrayField&gt; : { $slice: &lt;number&gt; } }\n);<\/code><\/pre>\n<p>Tambi\u00e9n se puede expresar de esta manera:<\/p>\n<pre><code class=\"language-php\">db.collection.find(\n  &lt;query&gt; ,\n   { &lt;arrayField&gt; : { $slice: [ &lt;number&gt; , &lt;number&gt; ] } }\n);<\/code><\/pre>\n<p>Para demostrarlo, puedes crear una colecci\u00f3n de tuits de ejemplo con los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">db.posts.insertMany([\n   {\n     _id: 1,\n     title: \"Nuts are not blueberries.\",\n     comments: [ { comment: \"0. true\" }, { comment: \"1. blueberries aren't nuts.\"} ]\n   },\n   {\n     _id: 2,\n     title: \"Coffee please.\",\n     comments: [ { comment: \"0. Indubitably\" }, { comment: \"1. Cuppa tea please\" }, { comment: \"2. frappucino\" }, { comment: \"3. Mocha latte\" }, { comment: \"4. whatever\" } ]\n   }\n])<\/code><\/pre>\n<p>La siguiente operaci\u00f3n utilizar\u00eda el operador de proyecci\u00f3n <code>$slice<\/code> en la matriz de tweets para devolver la matriz con sus dos primeros elementos. Si una matriz contiene menos de dos elementos, se devuelven todos los elementos de la matriz:<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Esta operaci\u00f3n devolver\u00eda los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{\n   \"_id\" : 1,\n   \"title\" : \"Nuts are not blueberries.\",\n   \"comments\" : [ { \"comment\" : \"0. true\" }, { \"comment\" : \"1. blueberries aren't nuts.\" } ]\n}\n{\n   \"_id\" : 2,\n   \"title\" : \"Coffee please.\",\n   \"comments\" : [ { \"comment\" : \"0. Indubitably\" }, { \"comment\" : \"1. Cuppa tea please\" } ]\n}<\/code><\/pre>\n<h4>$ (proyecci\u00f3n)<\/h4>\n<p>El operador posicional <code>$<\/code> limita el contenido de un array para devolver el primer elemento que coincida con la condici\u00f3n de consulta de ese array. Puedes utilizar <code>$<\/code> en el documento de proyecci\u00f3n del m\u00e9todo <code>find()<\/code> o del m\u00e9todo <code>findOne()<\/code> cuando s\u00f3lo necesites un elemento concreto de la matriz en los documentos elegidos.<\/p>\n<p>Este es el aspecto de la sintaxis del operador <code>$<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;array&gt;: &lt;condition&gt; ... },\n                    { \"&lt;array&gt;.$\": 1 } )\ndb.collection.find( { &lt;array.field&gt;: &lt;condition&gt; ...},\n                    { \"&lt;array&gt;.$\": 1 } )<\/code><\/pre>\n<p>En este ejemplo, la colecci\u00f3n <code>students<\/code> est\u00e1 formada por los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"semester\" : 2, \"grades\" : [ 75, 67, 93 ] }\n{ \"_id\" : 2, \"semester\" : 2, \"grades\" : [ 60, 68, 72 ] }\n{ \"_id\" : 3, \"semester\" : 2, \"grades\" : [ 95, 82, 67 ] }\n{ \"_id\" : 4, \"semester\" : 3, \"grades\" : [ 89, 95, 70 ] }\n{ \"_id\" : 5, \"semester\" : 3, \"grades\" : [ 68, 98, 82 ] }\n{ \"_id\" : 6, \"semester\" : 3, \"grades\" : [ 65, 70, 76 ] }<\/code><\/pre>\n<p>En la siguiente consulta, la proyecci\u00f3n <code>{ \"grades.$\": 1 }<\/code> devuelve s\u00f3lo el primer elemento mayor o igual que 89 para el campo <code>grades<\/code>:<\/p>\n<pre><code class=\"language-php\">db.students.find( { semester: 2, grades: { $gte: 89 } },\n                  { \"grades.$\": 1 } )<\/code><\/pre>\n<p>Esta operaci\u00f3n devuelve los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Operadores de evaluaci\u00f3n<\/h3>\n<p>Puedes aprovechar los operadores de evaluaci\u00f3n de MongoDB para calibrar la estructura general de datos o un campo individual dentro de un documento.<\/p>\n<p>Veamos algunos operadores de evaluaci\u00f3n comunes de MongoDB.<\/p>\n<h4>$mod<\/h4>\n<p>Puedes utilizar este operador para hacer coincidir los documentos en los que el valor de un campo especificado es igual al resto despu\u00e9s de ser dividido por un valor especificado:<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>Supongamos que tienes una tabla de coches de diferentes marcas que tienes en tu sala de exposiciones. La siguiente consulta te dar\u00eda todas las marcas de coches cuyos n\u00fameros de stock sean m\u00faltiplos de 250.<\/p>\n<pre><code class=\"language-php\">db.cars.find ( { qty: { $mod: [ 250,0 ] } } )<\/code><\/pre>\n<h4>$jsonSchema<\/h4>\n<p>La p\u00e1gina <code>$jsonSchema<\/code> te permite hacer coincidir los documentos que coinciden con el esquema JSON especificado. La implementaci\u00f3n de MongoDB del esquema JSON incluye la adici\u00f3n de la palabra clave <code>bsonType<\/code>, que te permite utilizar todos los tipos BSON dentro del operador <code>$jsonSchema<\/code>.<\/p>\n<p><code>bsonType<\/code> puede aceptar los mismos alias de cadena que usar\u00edas para el operador <code>type<\/code>. Este es el aspecto que tendr\u00eda la sintaxis de <code>$jsonSchema<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>Aqu\u00ed, el objeto del esquema JSON est\u00e1 formateado seg\u00fan el <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">borrador 4 del est\u00e1ndar JSON<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>Aqu\u00ed tienes un ejemplo para demostrar c\u00f3mo funciona <code>$jsonSchema<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: {\n     required: [ \"name\", \"major\", \"gpa\", \"address\" ],\n     properties: {\n        name: {\n           bsonType: \"string\",\n           description: \"must be a string and is required\"\n        },\n        address: {\n           bsonType: \"object\",\n           required: [ \"zipcode\" ],\n           properties: {\n               \"street\": { bsonType: \"string\" },\n               \"zipcode\": { bsonType: \"string\" }\n           }\n        }\n     }\n  }\n}<\/code><\/pre>\n<p>Tambi\u00e9n puedes utilizar <code>$jsonSchema<\/code> en un validador de documentos para hacer cumplir el esquema especificado en las operaciones de actualizaci\u00f3n e inserci\u00f3n:<\/p>\n<pre><code class=\"language-php\">db.createCollection(&lt;collection&gt; , { validator: { $jsonSchema: &lt;schema&gt; } } )\ndb.runCommand( { collMod: &lt;collection&gt;, validator:{ $jsonSchema: &lt;schema&gt; } } )<\/code><\/pre>\n<p>Ten en cuenta que hay varias cosas que no admite el operador <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>El tipo entero. Tienes que aprovechar el tipo BSON long o int con la palabra clave bsonType.<\/li>\n<li>Palabras clave desconocidas.<\/li>\n<li>Las propiedades de enlace y la hipermedia del esquema JSON, junto con el uso de referencias JSON y punteros JSON.<\/li>\n<\/ol>\n<h4>$text<\/h4>\n<p>El operador <code>$text<\/code> buscar\u00eda un texto dentro del contenido del campo especificado, indexado con un \u00edndice de texto:<\/p>\n<pre><code class=\"language-php\">{  \n  $text:  \n    {  \n      $search: &lt;string&gt;,  \n      $language: &lt;string&gt;,  \n      $caseSensitive: &lt;boolean&gt;,  \n      $diacriticSensitive: &lt;boolean&gt;   \n    }  \n}<\/code><\/pre>\n<p>En este caso, el siguiente fragmento de c\u00f3digo examinar\u00e1 la tabla para filtrar los coches que tengan el texto \u00abPorsche\u00bb:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>El operador <code>$regex<\/code> ofrece la posibilidad de utilizar expresiones regulares para hacer coincidir cadenas con patrones en las consultas. MongoDB aprovecha las expresiones regulares que son compatibles con Perl:<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>El siguiente ejemplo ayudar\u00eda a filtrar todos los coches que tengan la cadena \u00ab$78900\u00bb presente en ellos:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>El operador <code>$expr<\/code> te permite aprovechar las expresiones de agregaci\u00f3n dentro del lenguaje de consulta:<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Tambi\u00e9n puedes utilizar <code>$expr<\/code> para construir expresiones de consulta que comparen campos del mismo documento en una etapa <code>$match<\/code>. Si la etapa <code>$match<\/code> forma parte de una etapa <code>$lookup<\/code>, <code>$expr<\/code> puede comparar campos con la ayuda de variables let.<\/p>\n<h4>$where<\/h4>\n<p>Puedes aprovechar el operador <code>$where<\/code> para pasar una cadena que contenga una funci\u00f3n completa de JavaScript o una expresi\u00f3n de JavaScript al sistema de consulta. El operador <code>$where<\/code> proporciona una mayor flexibilidad, pero necesita que la base de datos procese la funci\u00f3n o expresi\u00f3n JavaScript para cada documento de la colecci\u00f3n. Puedes hacer referencia a este documento en la funci\u00f3n o expresi\u00f3n de JavaScript utilizando <code>obj<\/code> o <code>this<\/code>.<\/p>\n<p>Aqu\u00ed tienes un ejemplo de la sintaxis:<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>Hay algunas consideraciones clave que debes tener en cuenta antes de sumergirnos en un ejemplo al utilizar el operador <code>$where<\/code>:<\/p>\n<ul>\n<li>S\u00f3lo debes utilizar el operador de consulta <code>$where<\/code> a documentos de nivel superior. El operador de consulta <code>$where<\/code> no funcionar\u00e1 en un documento anidado, como en una consulta <code>$elemMatch<\/code>.<\/li>\n<li>En general, debes utilizar <code>$where<\/code> s\u00f3lo cuando no puedas expresar tu consulta mediante otro operador. Si tienes que utilizar <code>$where<\/code>, aseg\u00farate de incluir al menos otro operador de consulta est\u00e1ndar para filtrar el conjunto de resultados. El uso de <code>$where<\/code> de forma independiente requiere una exploraci\u00f3n de la colecci\u00f3n para su correcta ejecuci\u00f3n.<\/li>\n<\/ul>\n<p>He aqu\u00ed un ejemplo para ilustrar esto:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Operadores Bitwise<\/h3>\n<p>Los operadores bit a bit devuelven datos en funci\u00f3n de las condiciones de posici\u00f3n de los bits. En pocas palabras, se utilizan para hacer coincidir valores num\u00e9ricos o binarios en los que cualquier bit de un conjunto de posiciones de bits tiene un valor de 1 o 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Este operador coincidir\u00e1 con todos los documentos en los que todas las posiciones de bits proporcionadas por la consulta est\u00e9n establecidas (es decir, 1) en el campo:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: &lt;numeric bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: &lt; BinData bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: [ &lt;position1&gt; , &lt;position2&gt; , ... ] } }<\/code><\/pre>\n<p>El valor del campo debe ser una instancia de BinData o num\u00e9rico para que <code>$bitsAllSet<\/code> coincida con el documento actual.<\/p>\n<p>En el siguiente caso, estamos aprovechando una colecci\u00f3n con los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">db.collection.save({ _id: 1, a: 54, binaryValueofA: \"00110110\" })\ndb.collection.save({ _id: 2, a: 20, binaryValueofA: \"00010100\" })\ndb.collection.save({ _id: 3, a: 20.0, binaryValueofA: \"00010100\" })\ndb.collection.save({ _id: 4, a: BinData(0, \"Zg==\"), binaryValueofA: \"01100110\" })<\/code><\/pre>\n<p>La consulta mencionada a continuaci\u00f3n utilizar\u00e1 el operador <code>$bitsAllSet<\/code> para comprobar si el campo a tiene los bits en la posici\u00f3n 1 y en la posici\u00f3n 5, donde el bit menos significativo estar\u00eda en la posici\u00f3n 0:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } })<\/code><\/pre>\n<p>Esta consulta coincidir\u00eda con los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"a\" : 54, \"binaryValueofA\" : \"00110110\" }\n{ \"_id\" : 4, \"a\" : BinData(0,\"Zg==\"), \"binaryValueofA\" : \"01100110\" }<\/code><\/pre>\n<h4>$bitsAllClear<\/h4>\n<p>El operador <code>$bitsAllClear<\/code> coincidir\u00e1 con los documentos en los que todas las posiciones de bits proporcionadas por la consulta est\u00e9n claras o <code>0<\/code>:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: &lt;numeric bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: &lt; BinData bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: [ &lt;position1&gt; , &lt;position2&gt; , ... ] } }<\/code><\/pre>\n<p>Utilizaremos el ejemplo de <code>$bitsAllSet<\/code> para demostrar el uso de <code>$bitsAllClear<\/code>. La siguiente consulta utilizar\u00eda este operador para comprobar si el campo a tiene los bits libres en las posiciones 1 y 5:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Esta consulta coincidir\u00eda con los siguientes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }\n{ \"_id\" : 3, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }<\/code><\/pre>\n<h3>Meta Operadores<\/h3>\n<p>Hay varios modificadores de consulta que te permiten modificar el comportamiento o la respuesta de una consulta en MongoDB. Las interfaces del controlador pueden proporcionar m\u00e9todos de cursor que los envuelven para su uso.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB ha dejado de utilizar <code>$hint<\/code> desde la versi\u00f3n 3.2. Sin embargo, este operador puede seguir estando disponible para los controladores de MongoDB como Go, Java, Scala, Ruby, Swift, etc. Puede forzar al optimizador de consultas a aprovechar un \u00edndice espec\u00edfico para realizar la consulta, que puede mencionarse por documento o por nombre de \u00edndice.<\/p>\n<p>Tambi\u00e9n puedes utilizar el operador <code>$hint<\/code> para probar las estrategias de indexaci\u00f3n y el rendimiento de la consulta. Por ejemplo, toma la siguiente operaci\u00f3n:<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Esta operaci\u00f3n devolver\u00eda todos los documentos de la colecci\u00f3n llamada <code>users<\/code> aprovechando el \u00edndice del campo <code>age<\/code>.<\/p>\n<p>Tambi\u00e9n puedes mencionar una pista utilizando cualquiera de las siguientes formas:<\/p>\n<pre><code class=\"language-php\">db.users.find()._addSpecial( \"$hint\", { age : 1 } )\ndb.users.find( { $query: {}, $hint: { age : 1 } } )<\/code><\/pre>\n<p>Si existe un filtro de \u00edndice para la forma de la consulta, MongoDB simplemente ignorar\u00eda el <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>El operador <code>$comment<\/code> te permite adjuntar un comentario a una consulta en cualquier contexto en el que pueda aparecer <code>$query<\/code>. Dado que los comentarios se propagan al registro del perfil, a\u00f1adir un comentario puede facilitar la interpretaci\u00f3n y el seguimiento de tu perfil.<\/p>\n<p>Puedes utilizar <code>$comment<\/code> de una de estas tres maneras:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } )._addSpecial( \"$comment\", &lt;comment&gt; )\ndb.collection.find( { &lt;query&gt; } ).comment( &lt;comment&gt; )\ndb.collection.find( { $query: { &lt;query&gt; }, $comment: &lt;comment&gt; } )<\/code><\/pre>\n<p>Si quieres adjuntar comentarios a expresiones de consulta en otros contextos, como con <code>db.collection.update()<\/code>, aprovecha el operador de consulta <code>$comment<\/code> en lugar del metaoperador.<\/p>\n<h4>$max<\/h4>\n<p>Puedes mencionar un valor de <code>$max<\/code> para especificar el l\u00edmite superior exclusivo de un \u00edndice concreto para restringir los resultados de <code>find()<\/code>. Este operador especificar\u00e1 el l\u00edmite superior de todas las claves de un orden concreto en el \u00edndice.<\/p>\n<p>Mongosh te ofrece el siguiente m\u00e9todo envolvente <code>max()<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } ).max( { field1: &lt;max value&gt; , ... fieldN: &lt;max valueN&gt; } )<\/code><\/pre>\n<p>Tambi\u00e9n puedes mencionar <code>$max<\/code> con las dos formas siguientes:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } )._addSpecial( \"$max\", { field1: &lt;max value1&gt; ,\n ... fieldN: &lt;max valueN&gt; } )\ndb.collection.find( { $query: { &lt;query&gt; }, $max: { field1: &lt;max value1&gt; ,\n ... fieldN: &lt;max valueN&gt; } } )<\/code><\/pre>\n<p>Por ejemplo, si quieres especificar el l\u00edmite superior exclusivo, ten en cuenta las siguientes operaciones sobre una colecci\u00f3n llamada colecci\u00f3n que contiene un \u00edndice <code>{ age: 1 }<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } ).max( { age: 100 } ).hint( { age: 1 } )<\/code><\/pre>\n<p>Esta operaci\u00f3n limitar\u00e1 la consulta a aquellos documentos en los que el campo edad sea inferior a 100 y forzar\u00e1 un plan de consulta que explorar\u00e1 el \u00edndice <code>{ age: 1 }<\/code> desde <code>minKey<\/code> hasta 100.<\/p>\n<h4>$explain<\/h4>\n<p>Este operador te dar\u00e1 informaci\u00f3n sobre el plan de consulta. Devuelve un documento que describe los \u00edndices y procesos utilizados para devolver la consulta. Esto puede ser \u00fatil cuando se trata de optimizar una consulta.<\/p>\n<p>Puedes mencionar el operador <code>$explain<\/code> en cualquiera de las siguientes formas:<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>Las Mejores Pr\u00e1cticas para los Operadores de MongoDB<\/h2>\n<p>En esta secci\u00f3n, echaremos un vistazo a algunas de las mejores pr\u00e1cticas para\u00a0utilizar estos operadores de MongoDB.<\/p>\n<h3>Incrustaci\u00f3n y referenciaci\u00f3n<\/h3>\n<p>La incrustaci\u00f3n es una extensi\u00f3n natural del modelado de datos. Te permite evitar las uniones de aplicaciones, lo que puede reducir las actualizaciones y las consultas.<\/p>\n<p>Puedes incrustar datos con una relaci\u00f3n 1:1 dentro de un \u00fanico documento. Dicho esto, los datos con una relaci\u00f3n muchos:1 en la que aparecen \u00abmuchos\u00bb objetos con sus documentos padre tambi\u00e9n pueden ser buenos candidatos.<\/p>\n<p>Almacenar este tipo de datos en el mismo documento parece una opci\u00f3n prudente. Sin embargo, la incrustaci\u00f3n proporciona un mejor rendimiento para las operaciones de lectura con este tipo de localidad de datos.<\/p>\n<p>Los modelos de datos incrustados tambi\u00e9n pueden ayudar a los desarrolladores a actualizar los datos asociados en una sola operaci\u00f3n de escritura. Esto funciona porque las escrituras de un solo documento son transaccionales.<\/p>\n<p>Deber\u00edas considerar el uso de la referenciaci\u00f3n para los siguientes escenarios:<\/p>\n<ul>\n<li>Cuando se actualiza un segmento del documento y \u00e9ste se alarga, mientras que el resto del documento permanece est\u00e1tico.<\/li>\n<li>Cuando se accede a un documento, pero contiene datos que se utilizan raramente. La incrustaci\u00f3n s\u00f3lo aumentar\u00eda los requisitos en memoria, por lo que la referenciaci\u00f3n tiene m\u00e1s sentido.<\/li>\n<li>Cuando el tama\u00f1o del documento supera el l\u00edmite de documentos de 16 MB de MongoDB. Esto puede ocurrir cuando se modelan relaciones muchos:1 (por ejemplo, <em>empleados:departamento<\/em>).<\/li>\n<\/ul>\n<h3>Examinar el perfil y los patrones de consulta<\/h3>\n<p>Para la mayor\u00eda de los desarrolladores, el primer paso para <a href=\"https:\/\/kinsta.com\/es\/blog\/herramientas-pruebas-rendimiento\/\">optimizar el rendimiento<\/a> es comprender los patrones de consulta reales y esperados. Una vez que conozcas bien los patrones de consulta de tu aplicaci\u00f3n, podr\u00e1s elaborar tu modelo de datos y elegir los \u00edndices adecuados.<\/p>\n<p>Los desarrolladores de MongoDB tienen acceso a varias herramientas potentes que les permiten mejorar el rendimiento. Pero eso no significa que se puedan ignorar los perfiles y patrones de consulta.<\/p>\n<p>Por ejemplo, una forma f\u00e1cil de aumentar el rendimiento es analizar tus patrones de consulta y comprender d\u00f3nde puedes incrustar los datos. Otras formas de reforzar el rendimiento de MongoDB tras identificar tus principales patrones de consulta son:<\/p>\n<ul>\n<li>Asegurarte de que tienes \u00edndices en los campos contra los que consultas.<\/li>\n<li>Almacenando los resultados de las subconsultas frecuentes en los documentos para reducir la carga de lectura.<\/li>\n<li>Echar un vistazo a tus registros para ver si hay consultas lentas, y luego comprobar tus \u00edndices.<\/li>\n<\/ul>\n<h3>Revisar la indexaci\u00f3n y el modelado de datos<\/h3>\n<p>Al hacer tu modelo de datos, decidir\u00e1s c\u00f3mo modelar las relaciones entre los datos. Elegir cu\u00e1ndo incrustar un documento en lugar de crear una referencia a trav\u00e9s de documentos separados en diferentes colecciones, por ejemplo, es un ejemplo de consideraci\u00f3n espec\u00edfica de la aplicaci\u00f3n.<\/p>\n<p>Una gran ventaja de los documentos JSON es que permiten a los desarrolladores modelar los datos en funci\u00f3n de los requisitos de la aplicaci\u00f3n. La anidaci\u00f3n de subdocumentos y matrices te ayuda a modelar relaciones complejas entre los datos aprovechando los documentos de texto simple.<\/p>\n<p>Tambi\u00e9n puedes utilizar MongoDB para modelar lo siguiente:<\/p>\n<ul>\n<li>Datos geoespaciales<\/li>\n<li>Estructuras tabulares, planas y en columnas<\/li>\n<li>Pares clave-valor simples<\/li>\n<li>Datos de series temporales<\/li>\n<li>Aristas y nodos de estructuras de datos de gr\u00e1ficos conectados y similares<\/li>\n<\/ul>\n<h3>Supervisar la fragmentaci\u00f3n y la replicaci\u00f3n<\/h3>\n<p>La replicaci\u00f3n puede ser fundamental para mejorar el rendimiento, ya que aumenta la disponibilidad de los datos mediante el escalado horizontal. La replicaci\u00f3n puede conducir a un mejor rendimiento y a una mayor seguridad a trav\u00e9s de la redundancia.<\/p>\n<p>La supervisi\u00f3n del rendimiento puede ser una molestia que requiere recursos y tiempo adicionales para garantizar un buen funcionamiento. Puedes aprovechar las herramientas de supervisi\u00f3n del rendimiento disponibles en el mercado que se adaptan a tus necesidades espec\u00edficas.<\/p>\n<p>Por ejemplo, <a href=\"https:\/\/kinsta.com\/es\/herramienta-apm\/\">Kinsta APM<\/a> puede obtener informaci\u00f3n con marca de tiempo sobre las consultas a la base de datos MySQL de tu sitio de WordPress, los procesos PHP, las llamadas HTTP externas y mucho m\u00e1s. Tambi\u00e9n puedes utilizar esta herramienta gratuita para depurar:<\/p>\n<ul>\n<li>Llamadas largas a la API<\/li>\n<li>Peticiones de URL externas largas<\/li>\n<li>Consultas lentas a bases de datos, por nombrar algunas.<\/li>\n<\/ul>\n<p>En MongoDB, la replicaci\u00f3n puede lograrse mediante conjuntos de r\u00e9plicas que permiten a los desarrolladores copiar los datos de un nodo o servidor primario en varios secundarios. Esto permite que tu replicaci\u00f3n ejecute algunas consultas en los secundarios en lugar de en el primario, evitando la contenci\u00f3n y conduciendo a un mejor equilibrio de la carga.<\/p>\n<p>Los clusters fragmentados en MongoDB son otra forma de mejorar potencialmente el rendimiento. Al igual que la replicaci\u00f3n, la fragmentaci\u00f3n puede utilizarse para distribuir grandes conjuntos de datos entre varios servidores.<\/p>\n<p>Aprovechando una clave de fragmentaci\u00f3n, los desarrolladores pueden copiar fragmentos o piezas de datos en varios servidores. Estos servidores pueden trabajar juntos para utilizar todos los datos.<\/p>\n<p>La fragmentaci\u00f3n tiene sus ventajas, como el escalado horizontal de escrituras\/lecturas, una mayor disponibilidad y una mayor capacidad de almacenamiento.<\/p>\n<h3>Determinar el uso de la memoria<\/h3>\n<p>MongoDB funciona mejor cuando el conjunto de trabajo de una aplicaci\u00f3n (es decir, los datos e \u00edndices a los que se accede con frecuencia) cabe en la memoria sin problemas. Aunque otros factores son fundamentales para el rendimiento, el tama\u00f1o de la RAM es el m\u00e1s importante para el dimensionamiento de la instancia.<\/p>\n<p>Cuando el conjunto de trabajo de una aplicaci\u00f3n cabe en la RAM, la actividad de lectura desde el disco debe ser baja. Pero si tu conjunto de trabajo supera la RAM del servidor de instancias o su tama\u00f1o, la actividad de lectura empezar\u00e1 a dispararse.<\/p>\n<p>Si ves que esto ocurre, podr\u00edas resolver el problema pasando a una instancia m\u00e1s grande que tenga m\u00e1s memoria.<\/p>\n<h3>Coloca los campos de valores m\u00faltiples al final<\/h3>\n<p>Si est\u00e1s indexando un par de campos, y uno de los campos que quieres consultar utiliza uno de esos operadores \u00abmultivalor\u00bb, debes colocarlos al final del \u00edndice. Tienes que ordenar el \u00edndice de forma que los campos consultados por valores exactos vayan primero y los operadores \u00abmultivalor\u00bb aparezcan al final del \u00edndice.<\/p>\n<p>Una excepci\u00f3n a esto ser\u00eda la ordenaci\u00f3n por campos. Col\u00f3calos entre los campos \u00abmultivalor\u00bb y los exactos para reducir la cantidad de ordenaci\u00f3n en memoria necesaria.<\/p>\n<h2>Resumen<\/h2>\n<p>Para MongoDB, la velocidad es el nombre del juego. Para devolver las consultas r\u00e1pidamente, MongoDB aprovecha los operadores para ejecutar tareas matem\u00e1ticas o l\u00f3gicas. En pocas palabras, entender los operadores de MongoDB es la clave para dominar MongoDB.<\/p>\n\n<p>Este art\u00edculo destaca algunos de los operadores clave de MongoDB que puedes utilizar en tus datos, como los operadores de comparaci\u00f3n, los operadores l\u00f3gicos, los meta operadores y los operadores de proyecci\u00f3n, por nombrar algunos. Tambi\u00e9n te ayuda a entender c\u00f3mo puedes utilizar los operadores de MongoDB y las mejores pr\u00e1cticas que te permitir\u00e1n sacarles el m\u00e1ximo partido.<\/p>\n<p>Entre todos los operadores, \u00bfcu\u00e1l o cu\u00e1les utilizas m\u00e1s a menudo y por qu\u00e9? Comp\u00e1rtelos en los comentarios a continuaci\u00f3n: \u00a1nos encantar\u00e1 conocer tu opini\u00f3n!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En cualquier negocio, los datos son tu mayor activo. Al analizar los datos, puedes tomar decisiones sobre las tendencias de los clientes y la predicci\u00f3n de &#8230;<\/p>\n","protected":false},"author":117,"featured_media":57459,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[1160,622,923,856,1067],"topic":[1337],"class_list":["post-57437","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-development","tag-mongodb","topic-herramientas-de-desarrollo-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>9 Tipos de Operadores de Mongodb que Debes Conocer<\/title>\n<meta name=\"description\" content=\"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 Tipos de Operadores de Mongodb que Debes Conocer\" \/>\n<meta property=\"og:description\" content=\"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:34:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-17T13:52:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 Tipos de Operadores de Mongodb que Debes Conocer\",\"datePublished\":\"2022-09-19T08:34:51+00:00\",\"dateModified\":\"2025-01-17T13:52:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\"},\"wordCount\":6165,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"development\",\"MongoDB\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\",\"name\":\"9 Tipos de Operadores de Mongodb que Debes Conocer\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\",\"datePublished\":\"2022-09-19T08:34:51+00:00\",\"dateModified\":\"2025-01-17T13:52:16+00:00\",\"description\":\"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"9 Tipos de Operadores de Mongodb que Debes Conocer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Herramientas de Desarrollo Web\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/herramientas-de-desarrollo-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"9 Tipos de Operadores de Mongodb que Debes Conocer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 Tipos de Operadores de Mongodb que Debes Conocer","description":"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/","og_locale":"es_ES","og_type":"article","og_title":"9 Tipos de Operadores de Mongodb que Debes Conocer","og_description":"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.","og_url":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2022-09-19T08:34:51+00:00","article_modified_time":"2025-01-17T13:52:16+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Salman Ravoof","Tiempo de lectura":"37 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 Tipos de Operadores de Mongodb que Debes Conocer","datePublished":"2022-09-19T08:34:51+00:00","dateModified":"2025-01-17T13:52:16+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/"},"wordCount":6165,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","keywords":["datab","database","databases","development","MongoDB"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/","url":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/","name":"9 Tipos de Operadores de Mongodb que Debes Conocer","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","datePublished":"2022-09-19T08:34:51+00:00","dateModified":"2025-01-17T13:52:16+00:00","description":"Este art\u00edculo destaca algunos de los principales operadores clave de MongoDB que pueden ayudarte a mejorar el rendimiento y te ense\u00f1a a utilizarlos.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/09\/operadores-mongodb.jpeg","width":1460,"height":730,"caption":"9 Tipos de Operadores de Mongodb que Debes Conocer"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/operadores-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Herramientas de Desarrollo Web","item":"https:\/\/kinsta.com\/es\/secciones\/herramientas-de-desarrollo-web\/"},{"@type":"ListItem","position":3,"name":"9 Tipos de Operadores de Mongodb que Debes Conocer"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/57437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=57437"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/57437\/revisions"}],"predecessor-version":[{"id":66905,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/57437\/revisions\/66905"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/translations\/dk"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/57437\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/57459"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=57437"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=57437"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=57437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}