{"id":60075,"date":"2022-09-19T09:36:18","date_gmt":"2022-09-19T08:36:18","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=60075&#038;preview=true&#038;preview_id=60075"},"modified":"2023-04-14T13:57:40","modified_gmt":"2023-04-14T12:57:40","slug":"operatori-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/","title":{"rendered":"9 Tipi di Operatori di Mongodb Da Conoscere"},"content":{"rendered":"<p>In qualsiasi azienda, i dati sono la vostra risorsa pi\u00f9 importante. Analizzando i dati, potete prendere decisioni sulle tendenze e sui comportamenti dei clienti. Questo aumenta la redditivit\u00e0 dell&#8217;azienda e l&#8217;efficacia del processo decisionale.<\/p>\n<p>Senza un <a href=\"https:\/\/kinsta.com\/it\/blog\/open-source-database\/\">software di database<\/a>, un compito semplice come trovare la media di tutti i valori in un sistema pieno di record sarebbe noioso. Per fortuna i database hanno reso l&#8217;analisi dei dati pi\u00f9 semplice e veloce grazie a funzioni e operatori.<\/p>\n\n<p>Questo articolo far\u00e0 luce sugli operatori utilizzati nel database 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>Cosa Sono gli Operatori di MongoDB?<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-mongodb\/\">MongoDB<\/a> \u00e8 un database NoSQL che gestisce informazioni orientate ai documenti.<\/p>\n<p>Una delle caratteristiche principali di MongoDB \u00e8 la sua velocit\u00e0. Per rendere le query pi\u00f9 veloci, MongoDB pu\u00f2 usare degli operatori per eseguire funzioni specifiche.<\/p>\n<p>Gli operatori sono simboli speciali che aiutano i compilatori a eseguire operazioni matematiche o logiche. MongoDB offre diversi tipi di operatori per interagire con il database.<\/p>\n<h2>Tipi di Operatori di MongoDB<\/h2>\n<p>Esistono nove tipi di operatori, ognuno dei quali prende il nome dalla sua funzione. Per esempio, gli operatori logici utilizzano operazioni logiche. Per eseguirli, dovete utilizzare una parola chiave specifica e seguire la sintassi. Tuttavia, sono abbastanza facili da seguire!<\/p>\n<p>Alla fine dell&#8217;articolo, avrete appreso le basi di ogni operatore e le sue funzioni.<\/p>\n<h3>Operatori Logici<\/h3>\n<p>Gli operatori logici sono spesso utilizzati per filtrare i dati in base alle condizioni date. Consentono inoltre di valutare numerose condizioni, di cui parleremo in dettaglio.<\/p>\n<p>Di seguito sono elencati alcuni operatori logici che potete usare:<\/p>\n<h4>$and<\/h4>\n<p>Una condizione &#8220;and&#8221; esegue un&#8217;operazione logica &#8220;and&#8221; su un array di due o pi\u00f9 espressioni. Seleziona i documenti in cui <em>tutte <\/em>le condizioni delle espressioni sono soddisfatte.<\/p>\n<p>Questa \u00e8 la sintassi standard dell&#8217;espressione <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 condizione &#8220;or&#8221; esegue un&#8217;operazione logica &#8220;or&#8221; su un array di due o pi\u00f9 espressioni. Seleziona i documenti in cui almeno una delle espressioni \u00e8 vera.<\/p>\n<p>Questa \u00e8 la sintassi standard dell&#8217;espressione <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Per esempio, se vogliamo selezionare i documenti in cui il prezzo \u00e8 di 10 dollari o la quantit\u00e0 \u00e8 inferiore a 15, possiamo inserire la seguente query:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>Non \u00e8 necessario limitare l&#8217;espressione a due criteri: possiamo aggiungerne altri. Per esempio, la seguente query seleziona i documenti il cui prezzo \u00e8 pari a 10 dollari, la cui quantit\u00e0 \u00e8 inferiore a 15 o il cui tag \u00e8 stazionario:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>Quando si eseguono queste clausole, MongoDB esegue una scansione della collezione o una scansione dell&#8217;indice. Se tutti gli indici supportano le clausole, allora MongoDB utilizza gli indici per verificare un&#8217;espressione <code>$or<\/code>. In caso contrario, utilizza una scansione della collezione.<\/p>\n<p>Tuttavia, se volete verificare i criteri nello stesso campo, potreste voler usare l&#8217;operatore <code>$in<\/code> piuttosto che l&#8217;operatore <code>$or<\/code>. Per esempio, se volete ottenere una raccolta di documenti in cui la quantit\u00e0 sia 10 o 20, dovrete eseguire la seguente query <code>$in<\/code>:<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>Parleremo pi\u00f9 avanti dell&#8217;operatore <code>$in<\/code>.<\/p>\n<h4>$nor<\/h4>\n<p>Questo operatore esegue un&#8217;operazione logica &#8220;nor&#8221; su un array utilizzando una o pi\u00f9 espressioni. Quindi seleziona i documenti che non soddisfano le espressioni della query. In parole povere, fa l&#8217;opposto della condizione <code>$or<\/code>.<\/p>\n<p>Questa \u00e8 la sintassi generale:<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>Consideriamo la seguente query:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Questa query seleziona i documenti che contengono:<\/p>\n<ul>\n<li>un valore del campo prezzo non uguale a $3,99 e un valore di vendita non uguale a true; oppure<\/li>\n<li>un valore del campo prezzo non uguale a $3,99 e un campo vendita vuoto o assente; oppure<\/li>\n<li>nessun campo prezzo e un campo vendita non uguale a true; oppure<\/li>\n<li>n\u00e9 il campo prezzo n\u00e9 il campo vendita popolati o presenti.<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Questo operatore esegue un&#8217;operazione logica &#8220;not&#8221; su un array per l&#8217;espressione specificata. Seleziona quindi i documenti che non corrispondono alle espressioni della query. Questo include i documenti che non contengono il campo.<\/p>\n<p>Questa \u00e8 la sintassi generale:<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Per esempio, prendiamo la seguente query:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Questa query selezioner\u00e0 i documenti che contengono:<\/p>\n<ul>\n<li>un campo prezzo il cui valore \u00e8 maggiore o uguale a $3,99; e<\/li>\n<li>un campo prezzo non popolato o inesistente.<\/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> \u00e8 diverso dall&#8217;operatore <code>$gte<\/code>. <code>{ $gte: 3.99 }<\/code> restituisce solo i documenti in cui il campo prezzo esiste e il suo valore \u00e8 maggiore o uguale a $3,99 (l&#8217;operatore<code> $not<\/code> restituisce anche i documenti in cui il campo prezzo non esiste).<\/p>\n<\/aside>\n\n<h3>Operatori di Confronto<\/h3>\n<p>Gli operatori di confronto si possono usare per confrontare i valori di uno o pi\u00f9 documenti.<\/p>\n<p>Di seguito \u00e8 riportato un esempio di codice di una semplice raccolta di inventari per un supermercato:<\/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>Utilizzeremo questo esempio per descrivere nel dettaglio ogni operatore di confronto.<\/p>\n<h4>Uguale a ($eq)<\/h4>\n<p>Questo operatore viene soddisfatto se i valori che sono uguali al valore dato:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Per esempio, se vogliamo recuperare un documento specifico dalla raccolta dell&#8217;inventario con il valore esatto di quantit\u00e0 &#8220;20&#8221;, dovremo inserire il seguente comando:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>La query restituir\u00e0 quanto segue:<\/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>Maggiore di ($gt)<\/h4>\n<p>Questo operatore viene soddisfatto se i valori sono maggiori del valore indicato:<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>In questo esempio, recuperiamo i documenti la cui quantit\u00e0 \u00e8 superiore a 15:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>La query restituir\u00e0 quanto segue:<\/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>Meno di ($lt)<\/h4>\n<p>Questo operatore viene soddisfatto se i valori sono inferiori al valore fornito:<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Troviamo i documenti con una quantit\u00e0 inferiore a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>La query restituir\u00e0 quanto segue:<\/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>Maggiore o Uguale a ($gte)<\/h4>\n<p>Questo operatore viene soddisfatto quando i valori sono maggiori o uguali al valore indicato:<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>In questo esempio, recuperiamo i documenti la cui quantit\u00e0 \u00e8 maggiore o uguale a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Questa query restituir\u00e0 quanto segue:<\/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>Minore o Uguale a ($lte)<\/h4>\n<p>Questo operatore viene soddisfatto solo se i valori sono minori o uguali al valore indicato:<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Troviamo i documenti con una quantit\u00e0 minore o uguale a 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Possiamo aspettarci che questa query restituisca quanto segue:<\/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>In ($in)<\/h4>\n<p>Questo operatore restituisce i documenti che corrispondono ai valori specificati:<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>Il valore di un campo \u00e8 uguale a qualsiasi valore dell&#8217;array specificato. Per esempio, per recuperare i documenti con i valori &#8220;30&#8221; e &#8220;15&#8221; nella raccolta dell&#8217;inventario, dovete procedere in questo modo:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>L&#8217;output sarebbe:<\/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<p><span style=\"color: #0e0a1b;font-family: 'Brandon Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;font-size: 1rem;font-weight: 900\">Not in ($nin)<\/span>Questo operatore restituisce i documenti che non corrispondono ai valori indicati. Ecco la sintassi di base dell&#8217;operatore <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> seleziona i documenti dove:<\/p>\n<ul>\n<li>il valore del campo non si trova nell&#8217;array specificato; oppure<\/li>\n<li>il campo non esiste.<\/li>\n<\/ul>\n<p>Se il campo contiene degli array, selezioner\u00e0 gli array in cui non \u00e8 presente alcun elemento specificato nella sezione del valore. Per esempio, vogliamo selezionare i documenti in cui la quantit\u00e0 non \u00e8 uguale a 20 o a 15.<\/p>\n<p>Inoltre, seleziona anche i documenti che non hanno un campo quantit\u00e0:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>L&#8217;output sarebbe:<\/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>Non uguale ($ne)<\/h4>\n<p>L&#8217;operatore <code>$ne<\/code> restituisce i documenti in cui il valore specificato non \u00e8 uguale:<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Per esempio, supponiamo di voler selezionare tutti i documenti in cui la quantit\u00e0 non \u00e8 uguale a 20:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>L&#8217;output sarebbe:<\/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>Dall&#8217;output precedente, possiamo vedere che la query selezioner\u00e0 i documenti che non hanno un campo quantit\u00e0.<\/p>\n<h3>Operatori degli Elementi<\/h3>\n<p>Gli operatori di query elementari possono identificare i documenti utilizzando i campi del documento. Gli operatori di elemento sono costituiti da <code>$exist<\/code> e <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Questo operatore corrisponde ai documenti che hanno un campo specificato. Questo operatore ha un valore booleano che pu\u00f2 essere <code>true<\/code> o <code>false<\/code>.<\/p>\n<p>Se il valore specificato \u00e8 <code>true<\/code>, corrisponde ai documenti che contengono quel campo, compresi i documenti in cui il valore del campo \u00e8 nullo. Se &lt;boolean&gt; \u00e8 <code>false<\/code>, la query restituisce solo i documenti che non contengono il campo.<\/p>\n<p>Ecco la sintassi standard:<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } } )<\/code><\/pre>\n<p>Facciamo un esempio in cui abbiamo una raccolta di dati per un array chiamato &#8220;sacchetto di biglie&#8221;, dove ogni sacchetto contiene biglie di colori diversi:<\/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>Supponiamo di volere una query che restituisca solo i sacchetti in cui sono presenti biglie rosse. Questo significa che dovremo inserire il valore booleano come <code>true<\/code>. Diamo un&#8217;occhiata:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>I risultati sarebbero costituiti dai documenti che contengono il campo &#8220;red&#8221;, anche se il valore fosse <code>null<\/code>. Tuttavia, non sarebbero costituiti dai documenti in cui il campo &#8220;red&#8221; non esiste:<\/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>Se vogliamo solo le buste in cui le biglie rosse non esistono nemmeno come campo, possiamo inserire la seguente query:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>I risultati saranno costituiti dai documenti che non contengono il campo &#8220;red&#8221;:<\/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>Questo operatore abbina i documenti in base al tipo di campo specificato. \u00c8 utile quando avete dati molto poco strutturati o quando i tipi di dati non sono prevedibili. Questi tipi di campo sono tipi BSON specificati e possono essere definiti sia dal numero del tipo che dall&#8217;alias.<\/p>\n<p>Questa \u00e8 la sintassi generale di <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>Supponiamo di avere una rubrica contenente i documenti seguenti:<\/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>Osservando i documenti di cui sopra, il codice postale ha diversi tipi di dati. Si tratta di valori long, double, integer e string.<\/p>\n<p>Se vogliamo ottenere solo i documenti che hanno un determinato tipo di dato come codice postale &#8211; prendiamo per esempio una stringa &#8211; dobbiamo inserire la seguente query nel compilatore:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Questo restituirebbe i seguenti documenti:<\/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>Inoltre, esiste un tipo &#8220;number&#8221; che include tutti i valori long, integer o double come array contenente un elemento dei tipi specificati:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Output:<\/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>Se i documenti hanno un tipo di campo array, l&#8217;operatore <code>$type<\/code> restituisce i documenti in cui almeno un elemento dell&#8217;array corrisponde al tipo passato all&#8217;operatore.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>A partire da MongoDB 3.6, l&#8217;interrogazione di <code>$type: \"array\"<\/code> restituisce i documenti in cui il campo stesso \u00e8 un array. Tuttavia, utilizzando la stessa query, le versioni precedenti restituivano documenti in cui il campo era un array e almeno un elemento era di tipo array.<\/p>\n<\/aside>\n\n<h3>Operatori di Array<\/h3>\n<p>MongoDB dispone anche di operatori di array, per interrogare documenti contenenti array.<\/p>\n<p>Esistono tre operatori principali: <code>$all<\/code>, <code>$elemMatch<\/code> e <code>$size<\/code>. Di seguito ne parleremo in dettaglio.<\/p>\n<h4>$all<\/h4>\n<p>L&#8217;operatore <code>$all<\/code> sceglie i documenti in cui il valore di un campo \u00e8 un array contenente gli elementi specificati:<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>Per esempio, supponiamo di avere una raccolta di documenti per un negozio di abbigliamento, con i seguenti elementi sotto l&#8217;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>Vogliamo recuperare tutti i documenti (in questo caso, i vestiti) dall&#8217;inventario che sono collegati ai tag &#8220;trendy&#8221; e &#8220;y2k&#8221;. La seguente query utilizza l&#8217;operatore <code>$all<\/code> dove il valore del campo tags \u00e8 un array i cui elementi includono &#8220;y2k&#8221; e &#8220;trendy&#8221;:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>La query di cui sopra restituisce quanto segue:<\/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>Dall&#8217;esempio precedente, scopriamo che l&#8217;operatore <code>$all<\/code> svolge semplicemente la stessa funzione dell&#8217;operazione <code>$and<\/code>.<\/p>\n<p>In alternativa, possiamo usare la seguente query che dar\u00e0 un risultato simile a quello di cui sopra:<\/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>L&#8217;operatore <code>$elemMatch<\/code> corrisponde ai documenti che contengono un campo array con almeno un elemento che corrisponde a tutti i criteri di ricerca specificati:<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Sebbene si possano utilizzare operatori di confronto come <code>$lte<\/code> e <code>$gte<\/code>, se si specifica una sola condizione di query all&#8217;interno di <code>$elemMatch<\/code> e non si utilizzano gli operatori <code>$not<\/code> o <code>$ne<\/code>, l&#8217;utilizzo di <code>$elemMatch<\/code> pu\u00f2 essere omesso in quanto svolge essenzialmente la stessa funzione.<\/p>\n<p>Ci sono alcune altre cose da tenere a mente quando si utilizza questo operatore, soprattutto:<\/p>\n<ul>\n<li>Non potete specificare un&#8217;espressione <code>$where<\/code> in un&#8217;operazione <code>$elemMatch<\/code>.<\/li>\n<li>Non potete specificare un&#8217;espressione di query <code>$text<\/code> in un&#8217;operazione <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>Per esempio, abbiamo i seguenti documenti nella raccolta dei risultati degli studenti:<\/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 seguente query corrisponde solo ai documenti in cui l&#8217;array dei risultati contiene almeno un elemento maggiore o uguale a 90 e inferiore a 95:<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>La nostra query restituisce il seguente documento, poich\u00e9 l&#8217;elemento 92 \u00e8 maggiore o uguale a 90 e inferiore a 95:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>L&#8217;operatore <code>$size<\/code> restituisce i documenti in cui la dimensione dell&#8217;array corrisponde al numero di elementi specificato nell&#8217;argomento:<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>Ecco un esempio:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Questo restituisce tutti i documenti della collezione specificata in cui il campo \u00e8 un array con 2 elementi: <code>{ field: [ orange, apple] }<\/code> e <code>{ field: [ blue, red] }<\/code>, ma non <code>{ field: blue}<\/code> o <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Tuttavia, mentre possiamo inserire un valore specifico come dimensione, non possiamo specificare intervalli di valori come dimensione.<\/p>\n<h3>Operatori Geospaziali<\/h3>\n<p>MongoDB vi permette di memorizzare dati geospaziali sotto forma di GeoJSON. GeoJSON \u00e8 un formato open-standard basato sulla notazione a oggetti di JavaScript che pu\u00f2 rappresentare caratteristiche geografiche e supportare attributi non spaziali. Ci sono due tipi di operatori geospaziali di cui parleremo in questo articolo: gli specificatori di geometria e i selettori di query.<\/p>\n<h4>$geometry<\/h4>\n<p>Questo operatore indica la geometria GeoJSON da utilizzare con i seguenti operatori di query geospaziali: <code>$geoIntersects<\/code>, <code>$geoWithin<\/code>,<code>$nearSphere<\/code>, e <code>$near<\/code>. <code>$geometry<\/code> utilizza EPSG:4326 come sistema di riferimento delle coordinate (CRS) predefinito.<\/p>\n<p>Per menzionare gli oggetti GeoJSON con il CRS predefinito, potete usare il seguente snippet per <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>Per menzionare un poligono GeoJSON con un CRS personalizzato di MongoDB, potete usare il seguente snippet (potete usarlo solo per <code>$geoWithin<\/code> e <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>L&#8217;operatore <code>$polygon<\/code> pu\u00f2 essere utilizzato per specificare un poligono per una query geospaziale <code>$geoWithin<\/code> su coppie di coordinate legacy. Questa query restituir\u00e0 le coppie che rientrano nei confini del poligono. Tuttavia,<code> $polygon<\/code> non eseguir\u00e0 alcuna query su oggetti GeoJSON. Per definire un poligono, dovete specificare un array di punti di coordinate come segue:<\/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>In questo caso, l&#8217;ultimo punto \u00e8 implicitamente collegato al primo. Potete indicare tutti i punti o i lati che volete.<\/p>\n<p>Per esempio, la seguente query restituir\u00e0 tutti i documenti che hanno coordinate comprese nel poligono definito da [0,0], [1,5] e [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>Questo operatore pu\u00f2 essere utilizzato per scegliere i documenti con dati geospaziali che sono completamente contenuti in una forma specifica. La forma specificata pu\u00f2 essere un multipoligono GeoJSON, un poligono GeoJSON (sia a pi\u00f9 anelli che a singolo anello) o una forma che pu\u00f2 essere definita da coppie di coordinate legacy.<\/p>\n<p>L&#8217;operatore <code>$geoWithin<\/code> sfrutter\u00e0 l&#8217;operatore <code>$geometry<\/code> per citare l&#8217;oggetto GeoJSON.<\/p>\n<p>Per menzionare i multipoligoni o i poligoni GeoJSON tramite il Sistema di Riferimento di Coordinate (CRS) predefinito, potete usare la sintassi indicata di seguito:<\/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>Per le query di <code>$geoWithin<\/code> che menzionano le geometrie GeoJSON con aree pi\u00f9 grandi di un singolo emisfero, l&#8217;uso del CRS predefinito porter\u00e0 a query per le geometrie complementari.<\/p>\n<p>Per menzionare un poligono GeoJSON con un singolo emisfero con un CRS MongoDB personalizzato, potete utilizzare il prototipo menzionato di seguito nell&#8217;espressione <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>Il seguente esempio preleva tutti i dati loc che esistono completamente all&#8217;interno di un poligono GeoJSON, la cui area \u00e8 inferiore a quella di un singolo emisfero:<\/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>Potete usare <code>$box<\/code> per specificare un rettangolo per una query geospaziale <code>$geoWithin<\/code> per fornire i documenti che si trovano all&#8217;interno dei confini del rettangolo, in base ai loro dati di localizzazione puntuali. Quando usate <code>$geoWithin<\/code> con <code>$box<\/code>, otterrete documenti basati sulle coordinate della query. In questo scenario, <code>$geoWithin<\/code> non interrogher\u00e0 nessuna forma GeoJSON.<\/p>\n<p>Per sfruttare l&#8217;operatore <code>$box<\/code>, dovete menzionare gli angoli superiore destro e inferiore sinistro del rettangolo in un oggetto 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 query di cui sopra calcoler\u00e0 la distanza utilizzando la geometria planare (piatta). La seguente query restituir\u00e0 tutti i documenti che si trovano all&#8217;interno del rettangolo i cui punti sono: [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>Potete usare <code>$nearSphere<\/code> per indicare un punto per il quale una query geospaziale restituisce i documenti dal pi\u00f9 vicino al pi\u00f9 lontano.<\/p>\n<p>MongoDB usa la geometria sferica per calcolare le distanze per <code>$nearSphere<\/code>. Avr\u00e0 bisogno di un indice geospaziale come segue:<\/p>\n<ol>\n<li>indice 2d per i dati sulla posizione descritti come coppie di coordinate legacy. Per sfruttare un indice 2d sui punti GeoJSON, dovete generare l&#8217;indice sul campo delle coordinate dell&#8217;oggetto GeoJSON.<\/li>\n<li>indice 2dsphere per i dati di localizzazione descritti come punti GeoJSON.<\/li>\n<\/ol>\n<p>Per menzionare un punto GeoJSON, potete utilizzare la seguente sintassi:<\/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>In questo caso, <code>$minDistance<\/code> e <code>$maxDistance<\/code> sono opzionali. <code>$minDistance<\/code> pu\u00f2 limitare i risultati ai documenti che si trovano almeno alla distanza specificata dal centro. Potete usare <code>$maxDistance<\/code> per entrambi gli indici.<\/p>\n<p>Ora, considerate una collezione di &#8220;luoghi&#8221; che consiste in documenti con un campo di posizione che ha un indice 2dsphere. L&#8217;esempio seguente restituisce i punti la cui posizione dista almeno 2.000 metri e al massimo 6.000 metri dal punto scelto, ordinati dal pi\u00f9 vicino al pi\u00f9 lontano:<\/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>L&#8217;operatore <code>$geoIntersects<\/code> vi permette di selezionare i documenti i cui dati geospaziali si intersecano con un particolare oggetto GeoJSON (cio\u00e8 dove la convergenza dell&#8217;oggetto specificato e dei dati non \u00e8 vuota). Sfrutta l&#8217;operatore <code>$geometry<\/code> per specificare l&#8217;oggetto GeoJSON.<\/p>\n<p>Per citare i multipoligoni o i poligoni GeoJSON attraverso il sistema di riferimento delle coordinate (CRS) predefinito, potete utilizzare la seguente sintassi:<\/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 seguente istanza utilizzer\u00e0 <code>$geoIntersects<\/code> per selezionare tutti i dati loc che si intersecano con il poligono descritto dall&#8217;array di coordinate:<\/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>L&#8217;operatore <code>$center<\/code> menziona un cerchio per una query <code>$geoWithin<\/code> che restituisce le coppie di coordinate legacy che si trovano entro i confini del cerchio.<\/p>\n<p><code>$center<\/code> non restituisce oggetti GeoJSON. Per sfruttare l&#8217;operatore <code>$center<\/code>, dovete specificare un array che contenga:<\/p>\n<ol>\n<li>Il raggio del cerchio, misurato nelle unit\u00e0 utilizzate dal sistema di coordinate.<\/li>\n<li>Le coordinate della griglia del punto centrale del cerchio.<\/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>L&#8217;esempio riportato di seguito restituir\u00e0 tutti i documenti le cui coordinate si trovano all&#8217;interno del cerchio centrato su [2,3] e con raggio 40:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } }\n)<\/code><\/pre>\n<h3>Operatori di Proiezione<\/h3>\n<p>Potete usare gli operatori di proiezione per menzionare i campi restituiti da un&#8217;operazione. Gli operatori di proiezione di MongoDB consentono di utilizzare la funzione <code>find()<\/code> con argomenti di filtraggio dei dati. In questo modo gli utenti possono estrarre da un documento solo i campi di dati richiesti. Quindi, vi permette di proiettare dati trasparenti e concisi senza influire sulle prestazioni complessive del database.<\/p>\n<h4>$elemMatch (proiezione)<\/h4>\n<p>L&#8217;operatore <code>$elemMatch<\/code> \u00e8 responsabile di limitare il contenuto di un campo dei risultati della query in modo che contenga solo il primo elemento che corrisponde alla condizione <code>$elemMatch<\/code>.<\/p>\n<p>Ecco alcune cose che dovete tenere a mente prima di usare <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>Da MongoDB 4.4, indipendentemente dall&#8217;ordine dei campi nel documento, la proiezione <code>$elemMatch<\/code> di un campo esistente restituisce il campo dopo l&#8217;inclusione di altri campi esistenti.<\/li>\n<li>Entrambi gli operatori <code>$elemMatch<\/code> e <code>$<\/code> proiettano il primo elemento corrispondente di un array in base a una condizione specificata. L&#8217;operatore <code>$<\/code> proietta il primo elemento corrispondente di un array da ogni documento di una collezione in base a una condizione dell&#8217;istruzione di query, mentre l&#8217;operatore di proiezione <code>$elemMatch<\/code> richiede un argomento esplicito di condizione. Questo vi permette di proiettare in base a una condizione non presente nella query o se avete bisogno di proiettare in base a vari campi nei documenti incorporati nell&#8217;array.<\/li>\n<\/ul>\n<p>Prima di usare l&#8217;operatore <code>$elemMatch<\/code> sui vostri dati, dovete tenere presente le seguenti restrizioni:<\/p>\n<ul>\n<li>Non potete menzionare un&#8217;espressione di query <code>$text<\/code> all&#8217;interno di un operatore <code>$elemMatch<\/code>.<\/li>\n<li>Le operazioni <code>db.collection.find()<\/code> sulle viste non supportano l&#8217;operatore di proiezione <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>Il seguente esempio sull&#8217;operatore di proiezione <code>$elemMatch<\/code> presuppone una collezione <code>schools<\/code> con i seguenti documenti:<\/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>In questo caso, l&#8217;operazione <code>find()<\/code> cerca tutti i documenti in cui il valore del campo CAP \u00e8 63110. La proiezione di <code>$elemMatch<\/code> restituirebbe solo il primo elemento corrispondente dell&#8217;array <code>students<\/code> in cui il campo <code>school<\/code> ha un valore pari a 103:<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>Ecco come si presenterebbe il risultato:<\/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 (proiezione)<\/h4>\n<p>L&#8217;operatore di proiezione <code>$slice<\/code> pu\u00f2 essere utilizzato per specificare il numero di elementi di un array da restituire nel risultato della query:<\/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>Pu\u00f2 anche essere espresso in questo modo:<\/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>Per dimostrarlo, potete creare un esempio di raccolta di tweet con i seguenti documenti:<\/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 seguente operazione utilizza l&#8217;operatore di proiezione <code>$slice<\/code> sull&#8217;array di tweet per restituire l&#8217;array con i primi due elementi. Se un array contiene meno di due elementi, vengono restituiti tutti gli elementi dell&#8217;array:<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Questa operazione restituirebbe i seguenti documenti:<\/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>$ (proiezione)<\/h4>\n<p>L&#8217;operatore posizionale <code>$<\/code> limita il contenuto di un array per restituire il primo elemento che corrisponde alla condizione di interrogazione dell&#8217;array. Potete usare <code>$<\/code> nel documento di proiezione del metodo <code>find()<\/code> o del metodo <code>findOne()<\/code> quando avete bisogno di un solo elemento particolare dell&#8217;array nei documenti scelti.<\/p>\n<p>Ecco come si presenta la sintassi dell&#8217;operatore <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>In questo esempio, la collezione <code>students<\/code> \u00e8 composta dai seguenti documenti:<\/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>Nella seguente query, la proiezione <code>{ \"grades.$\": 1 }<\/code> restituisce solo il primo elemento maggiore o uguale a 89 per il 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>Questa operazione restituisce i seguenti documenti:<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Operatori di Valutazione<\/h3>\n<p>Potete sfruttare gli operatori di valutazione di MongoDB per valutare la struttura complessiva dei dati o i singoli campi di un documento.<\/p>\n<p>Vediamo alcuni comuni operatori di valutazione di MongoDB.<\/p>\n<h4>$mod<\/h4>\n<p>Questo operatore pu\u00f2 essere utilizzato per trovare una corrispondenza tra i documenti in cui il valore di un campo specificato \u00e8 uguale al resto dopo essere stato diviso per un valore specificato:<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>Supponiamo che abbiate una tabella di auto di diverse marche che possedete nel vostro autosalone. La seguente query vi fornir\u00e0 tutte le marche di auto i cui numeri di serie sono multipli di 250.<\/p>\n<pre><code class=\"language-php\">db.cars.find ( { qty: { $mod: [ 250,0 ] } } )<\/code><\/pre>\n<h4>$jsonSchema<\/h4>\n<p>L&#8217;opzione <code>$jsonSchema<\/code> vi permette di abbinare i documenti che corrispondono allo schema JSON specificato. L&#8217;implementazione di MongoDB dello schema JSON include l&#8217;aggiunta della parola chiave <code>bsonType<\/code>, che vi permette di utilizzare tutti i tipi BSON all&#8217;interno dell&#8217;operatore <code>$jsonSchema<\/code>.<\/p>\n<p><code>bsonType<\/code> pu\u00f2 accettare gli stessi alias di stringa che usereste per l&#8217;operatore <code>type<\/code>. Ecco come si presenterebbe la sintassi di <code>$jsonSchema<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>In questo caso, l&#8217;oggetto JSON schema \u00e8 formattato in base alla <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">bozza 4 dello standard JSON schema<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>Ecco un esempio che dimostra il funzionamento di <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>Potete anche usare <code>$jsonSchema<\/code> in un validatore di documenti per applicare lo schema specificato alle operazioni di aggiornamento e inserimento:<\/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>Tenete presente che ci sono diverse cose che non sono supportate dall&#8217;operatore <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>Il tipo intero. Dovete sfruttare il tipo BSON long o int con la parola chiave bsonType.<\/li>\n<li>Parole chiave sconosciute.<\/li>\n<li>Il collegamento delle propriet\u00e0 e l&#8217;ipermedia dello schema JSON, oltre all&#8217;uso di riferimenti JSON e puntatori JSON.<\/li>\n<\/ol>\n<h4>$text<\/h4>\n<p>L&#8217;operatore <code>$text<\/code> cerca un testo all&#8217;interno del contenuto del campo specificato, indicizzato con un indice di testo:<\/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>In questo caso, il seguente frammento di codice passer\u00e0 al setaccio la tabella per filtrare tutte le auto che contengono il testo &#8220;Porsche&#8221;:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>L&#8217;operatore <code>$regex<\/code> offre la possibilit\u00e0 di utilizzare le espressioni regolari per effettuare delle corrispondenze con le stringhe nelle query. MongoDB sfrutta le espressioni regolari compatibili con il Perl:<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>L&#8217;esempio seguente permette di filtrare tutte le auto in cui \u00e8 presente la stringa &#8220;$78900&#8221;:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>L&#8217;operatore <code>$expr<\/code> vi permette di sfruttare le espressioni di aggregazione all&#8217;interno del linguaggio di query:<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Potete anche usare <code>$expr<\/code> per costruire espressioni di query che confrontano i campi dello stesso documento in uno stadio <code>$match<\/code>. Se lo stadio <code>$match<\/code> fa parte di uno stadio <code>$lookup<\/code>, <code>$expr<\/code> pu\u00f2 confrontare i campi con l&#8217;aiuto delle variabili let.<\/p>\n<h4>$where<\/h4>\n<p>Potete sfruttare l&#8217;operatore <code>$where<\/code> per passare al sistema di query una stringa contenente una funzione JavaScript completa o un&#8217;espressione JavaScript. L&#8217;operatore <code>$where<\/code> offre una maggiore flessibilit\u00e0 ma richiede che il database elabori la funzione o l&#8217;espressione JavaScript per ogni documento della collezione. Potete fare riferimento a questo documento nella funzione o espressione JavaScript usando <code>obj<\/code> o <code>this<\/code>.<\/p>\n<p>Ecco un esempio di sintassi:<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>Ci sono alcune considerazioni chiave da tenere a mente prima di immergerci in un esempio di utilizzo dell&#8217;operatore <code>$where<\/code>:<\/p>\n<ul>\n<li>Dovreste utilizzare l&#8217;operatore di query <code>$where<\/code> solo per i documenti di primo livello. L&#8217;operatore di query <code>$where<\/code> non funziona in un documento annidato, come in una query <code>$elemMatch<\/code>.<\/li>\n<li>In generale, dovreste usare <code>$where<\/code> solo quando non potete esprimere la vostra query con un altro operatore. Se dovete usare <code>$where<\/code>, assicuratevi di includere almeno un altro operatore di query standard per filtrare l&#8217;insieme dei risultati. L&#8217;utilizzo di <code>$where<\/code> richiede una scansione della collezione per una corretta esecuzione.<\/li>\n<\/ul>\n<p>Ecco un esempio che illustra questo aspetto:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Operatori bitwise<\/h3>\n<p>Gli operatori bitwise restituiscono i dati in base alle condizioni di posizione dei bit. In parole povere, vengono utilizzati per abbinare valori numerici o binari in cui qualsiasi bit di un insieme di posizioni di bit ha un valore di 1 o 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Questo operatore corrisponde a tutti i documenti in cui tutte le posizioni di bit fornite dalla query sono impostate (cio\u00e8 1) nel 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>Il valore del campo deve essere un&#8217;istanza di BinData o un numero per <code>$bitsAllSet<\/code> per corrispondere al documento corrente.<\/p>\n<p>Nella seguente istanza, stiamo sfruttando una raccolta con i seguenti documenti:<\/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 query riportata di seguito utilizzer\u00e0 l&#8217;operatore <code>$bitsAllSet<\/code> per verificare se il campo a ha dei bit impostati in posizione 1 e in posizione 5, dove il bit meno significativo si trova in posizione 0:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } })<\/code><\/pre>\n<p>Questa query corrisponde ai seguenti documenti:<\/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>L&#8217;operatore <code>$bitsAllClear<\/code> corrisponder\u00e0 ai documenti in cui tutte le posizioni dei bit fornite dalla query sono chiare 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>Useremo l&#8217;esempio di <code>$bitsAllSet<\/code> per dimostrare l&#8217;uso di <code>$bitsAllClear<\/code>. La seguente query utilizzerebbe questo operatore per verificare se il campo a ha i bit liberi nelle posizioni 1 e 5:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Questa query corrisponderebbe ai seguenti documenti:<\/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-operatori<\/h3>\n<p>Esistono diversi modificatori di query che vi permettono di modificare il comportamento o l&#8217;output di una query in MongoDB. Le interfacce dei driver possono fornire metodi di cursore che li avvolgono per il vostro utilizzo.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB ha deprecato <code>$hint<\/code> dalla v3.2. Tuttavia, questo operatore potrebbe essere ancora disponibile per i driver MongoDB come Go, Java, Scala, Ruby, Swift, ecc. Pu\u00f2 forzare l&#8217;ottimizzatore di query a sfruttare un indice specifico per soddisfare la query, che pu\u00f2 essere menzionata sia per documento che per nome dell&#8217;indice.<\/p>\n<p>Potete anche usare l&#8217;operatore <code>$hint<\/code> per testare le strategie di indicizzazione e le prestazioni delle query. Per esempio, prendiamo la seguente operazione:<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Questa operazione restituirebbe tutti i documenti della collezione <code>users<\/code> sfruttando l&#8217;indice sul campo <code>age<\/code>.<\/p>\n<p>Potete anche indicare un suggerimento utilizzando una delle seguenti forme:<\/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>Se esiste un filtro indice per la forma della query, MongoDB ignorer\u00e0 semplicemente il campo <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>L&#8217;operatore <code>$comment<\/code> vi permette di aggiungere un commento a una query in qualsiasi <code>$query<\/code> contesto possa apparire. Poich\u00e9 i commenti si propagano al log del profilo, l&#8217;aggiunta di un commento pu\u00f2 rendere pi\u00f9 facile l&#8217;interpretazione e la tracciabilit\u00e0 del vostro profilo.<\/p>\n<p>Potete utilizzare <code>$comment<\/code> in uno dei tre modi seguenti:<\/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>Se volete aggiungere commenti alle espressioni delle query in altri contesti, come nel caso di <code>db.collection.update()<\/code>, usate l&#8217;operatore di query <code>$comment<\/code> invece del meta-operatore.<\/p>\n<h4>$max<\/h4>\n<p>Potete citare un valore di <code>$max<\/code> per specificare il limite superiore esclusivo di un particolare indice per limitare i risultati di <code>find()<\/code>. Questo operatore specificher\u00e0 il limite superiore per tutte le chiavi di un ordine specifico nell&#8217;indice.<\/p>\n<p>Mongosh fornisce il seguente metodo wrapper <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>Potete anche citare <code>$max<\/code> con le due forme seguenti:<\/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>Per esempio, se volete specificare il limite superiore esclusivo, tenete presente le seguenti operazioni su una collezione chiamata collezione che contiene un indice <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>Questa operazione limita la query ai documenti in cui l&#8217;et\u00e0 del campo \u00e8 inferiore a 100 e forza un piano di query che scansiona l&#8217;indice <code>{ age: 1 }<\/code> da <code>minKey<\/code> a 100.<\/p>\n<h4>$explain<\/h4>\n<p>Questo operatore fornisce informazioni sul piano di query. Restituisce un documento che descrive gli indici e i processi utilizzati per eseguire la query. Questo pu\u00f2 essere utile quando si cerca di ottimizzare una query.<\/p>\n<p>Potete citare l&#8217;operatore <code>$explain<\/code> in una delle seguenti forme:<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>Migliori Pratiche per gli Operatori di MongoDB<\/h2>\n<p>In questa sezione vedremo alcune delle migliori pratiche per l&#8217;utilizzo di questi operatori MongoDB.<\/p>\n<h3>Incorporare e Referenziare<\/h3>\n<p>L&#8217;incorporamento \u00e8 un&#8217;estensione naturale della modellazione dei dati. Permette di evitare i join delle applicazioni, riducendo cos\u00ec gli aggiornamenti e le query.<\/p>\n<p>Potete incorporare i dati con una relazione 1:1 all&#8217;interno di un singolo documento. Tuttavia, anche i dati con una relazione molti:1 in cui &#8220;molti&#8221; oggetti appaiono con i loro documenti genitori possono essere dei buoni candidati.<\/p>\n<p>Memorizzare questi tipi di dati nello stesso documento sembra una scelta prudente. Tuttavia, l&#8217;incorporamento offre prestazioni migliori per le operazioni di lettura con questo tipo di localizzazione dei dati.<\/p>\n<p>I modelli di dati incorporati possono anche aiutare gli sviluppatori ad aggiornare i dati associati con un&#8217;unica operazione di scrittura. Questo funziona perch\u00e9 le scritture di un singolo documento sono transazionali.<\/p>\n<p>Dovreste prendere in considerazione l&#8217;utilizzo del referenziamento per i seguenti scenari:<\/p>\n<ul>\n<li>Quando si aggiorna un segmento del documento e questo continua ad allungarsi, mentre il resto del documento \u00e8 statico.<\/li>\n<li>Quando un documento viene consultato ma contiene dati che vengono utilizzati raramente. L&#8217;inclusione aumenterebbe solo i requisiti di memoria, quindi il riferimento ha pi\u00f9 senso.<\/li>\n<li>Quando le dimensioni del documento superano il limite di 16 MB di MongoDB. Questo pu\u00f2 accadere quando si modellano relazioni molti:1 (per esempio, <em>dipendenti:reparto<\/em>).<\/li>\n<\/ul>\n<h3>Esaminare i Modelli di Profilazione e di Query<\/h3>\n<p>Per la maggior parte degli sviluppatori, il primo passo per <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-test-prestazioni\/\">ottimizzare le prestazioni<\/a> \u00e8 capire i modelli di query attuali e previsti. Una volta che conoscete abbastanza bene i modelli di query della vostra applicazione, potete creare il vostro modello di dati e scegliere gli indici appropriati.<\/p>\n<p>Le sviluppatrici e gli sviluppatori di MongoDB hanno accesso a diversi strumenti potenti che permettono loro di migliorare le prestazioni. Ma questo non significa che i profili e i modelli di query possano essere ignorati.<\/p>\n<p>Per esempio, un modo semplice per aumentare le prestazioni \u00e8 analizzare i modelli di query e capire dove \u00e8 possibile inserire i dati. Altri modi per migliorare le prestazioni di MongoDB dopo aver identificato i principali modelli di query sono:<\/p>\n<ul>\n<li>Assicurarsi di avere degli indici su tutti i campi su cui si effettuano le query.<\/li>\n<li>Memorizzare i risultati delle sotto-query frequenti sui documenti per ridurre il carico di lettura.<\/li>\n<li>Dare un&#8217;occhiata ai log per individuare le query lente e poi controllare gli indici.<\/li>\n<\/ul>\n<h3>Rivedere l&#8217;Indicizzazione e la Modellazione dei Dati<\/h3>\n<p>Durante la creazione del modello dei dati, dovrete decidere come modellare le relazioni tra i dati. Scegliere quando incorporare un documento piuttosto che creare un riferimento a documenti separati in raccolte diverse, per esempio, \u00e8 un esempio di considerazione specifica per l&#8217;applicazione.<\/p>\n<p>Un grande vantaggio dei documenti JSON \u00e8 che permettono agli sviluppatori di modellare i dati in base ai requisiti dell&#8217;applicazione. L&#8217;annidamento di sottodocumenti e array vi aiuta a modellare relazioni complesse tra i dati sfruttando semplici documenti di testo.<\/p>\n<p>Potete usare MongoDB anche per modellare quanto segue:<\/p>\n<ul>\n<li>Dati geospaziali<\/li>\n<li>Strutture tabellari, piatte e colonnari<\/li>\n<li>Semplici coppie chiave-valore<\/li>\n<li>Dati di serie temporali<\/li>\n<li>Angoli e nodi di strutture di dati a grafo connesso e simili<\/li>\n<\/ul>\n<h3>Monitorare lo Sharding e la Replica<\/h3>\n<p>La replica pu\u00f2 essere fondamentale per migliorare le prestazioni in quanto aumenta la disponibilit\u00e0 dei dati grazie alla scalabilit\u00e0 orizzontale. La replica pu\u00f2 portare a prestazioni migliori e a una maggiore sicurezza grazie alla ridondanza.<\/p>\n<p>Il monitoraggio delle prestazioni pu\u00f2 essere una seccatura che richiede risorse e tempo aggiuntivi per garantire un funzionamento regolare. Potete sfruttare gli strumenti di monitoraggio delle prestazioni disponibili sul mercato che rispondono alle vostre esigenze specifiche.<\/p>\n<p>Per esempio, <a href=\"https:\/\/kinsta.com\/it\/strumento-apm\/\">Kinsta APM<\/a> \u00e8 in grado di raccogliere informazioni con data e ora sulle query del database MySQL del vostro sito WordPress, sui processi PHP, sulle chiamate HTTP esterne e molto altro ancora. Potete anche usare questo strumento gratuito per eseguire il debug:<\/p>\n<ul>\n<li>Chiamate API lunghe<\/li>\n<li>Lunghe richieste di URL esterni<\/li>\n<li>Query di database lente, per citarne alcune.<\/li>\n<\/ul>\n<p>In MongoDB, la replica pu\u00f2 essere realizzata attraverso set di replica che consentono agli sviluppatori di copiare i dati da un nodo o server primario su pi\u00f9 secondari. In questo modo la replica consente di eseguire alcune query sui secondari anzich\u00e9 sul primario, evitando la contesa e migliorando il bilanciamento del carico.<\/p>\n<p>I cluster sharded di MongoDB sono un altro modo per migliorare potenzialmente le prestazioni. Come la replica, lo sharding pu\u00f2 essere utilizzato per distribuire grandi insiemi di dati su pi\u00f9 server.<\/p>\n<p>Sfruttando una chiave shard, gli sviluppatori possono copiare shard o pezzi di dati su pi\u00f9 server. Questi server possono lavorare insieme per utilizzare tutti i dati.<\/p>\n<p>Lo sharding presenta una serie di vantaggi, tra cui la scalabilit\u00e0 orizzontale per le scritture\/letture, una maggiore disponibilit\u00e0 e una maggiore capacit\u00e0 di archiviazione.<\/p>\n<h3>Determinare l&#8217;Uso della Memoria<\/h3>\n<p>MongoDB d\u00e0 il meglio di s\u00e9 quando l&#8217;insieme di lavoro di un&#8217;applicazione (cio\u00e8 i dati e gli indici a cui si accede di frequente) entra in memoria senza problemi. Anche se altri fattori sono fondamentali per le prestazioni, la dimensione della RAM \u00e8 la pi\u00f9 importante per il dimensionamento dell&#8217;istanza.<\/p>\n<p>Quando l&#8217;insieme di lavoro di un&#8217;applicazione \u00e8 contenuto nella RAM, l&#8217;attivit\u00e0 di lettura dal disco deve essere bassa. Ma se l&#8217;insieme di lavoro supera la RAM del server o le dimensioni dell&#8217;istanza, l&#8217;attivit\u00e0 di lettura inizier\u00e0 ad aumentare.<\/p>\n<p>Se vedete che questo accade, potreste risolvere il problema passando a un&#8217;istanza pi\u00f9 grande con pi\u00f9 memoria.<\/p>\n<h3>Posizionare i Campi a Valore Multiplo alla Fine<\/h3>\n<p>Se state indicizzando un paio di campi e uno dei campi che volete interrogare utilizza uno di quegli operatori &#8220;multi-valore&#8221;, allora dovreste metterli alla fine dell&#8217;indice. Dovete ordinare l&#8217;indice in modo che i campi interrogati per i valori esatti vengano prima e gli operatori &#8220;multivalore&#8221; vengano visualizzati per ultimi nell&#8217;indice.<\/p>\n<p>Un&#8217;eccezione \u00e8 rappresentata dall&#8217;ordinamento in base ai campi. Posizionate questi ultimi tra i campi &#8220;multi-valore&#8221; e i campi esatti per ridurre la quantit\u00e0 di ordinamenti in memoria necessari.<\/p>\n<h2>Riepilogo<\/h2>\n<p>Per MongoDB, la velocit\u00e0 \u00e8 tutto. Per restituire rapidamente le query, MongoDB sfrutta gli operatori per eseguire operazioni matematiche o logiche. In poche parole, capire gli operatori di MongoDB \u00e8 la chiave per padroneggiare MongoDB.<\/p>\n\n<p>In questo articolo abbiamo evidenziato alcuni degli operatori chiave di MongoDB che potete utilizzare sui vostri dati, come gli operatori di confronto, gli operatori logici, i meta-operatori e gli operatori di proiezione, per citarne alcuni. Inoltre, vi aiuta a capire come utilizzare gli operatori di MongoDB e le migliori pratiche che vi permetteranno di sfruttarli al meglio.<\/p>\n<p>Tra tutti gli operatori, quale\/i usate pi\u00f9 spesso e perch\u00e9? Ditecelo nei commenti qui sotto: ci piacerebbe conoscere le vostre opinioni!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In qualsiasi azienda, i dati sono la vostra risorsa pi\u00f9 importante. Analizzando i dati, potete prendere decisioni sulle tendenze e sui comportamenti dei clienti. Questo aumenta &#8230;<\/p>\n","protected":false},"author":117,"featured_media":60231,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[26050,10885,25728,25897,25635],"topic":[25883],"class_list":["post-60075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-mongodb","tag-sviluppo","topic-strumenti-di-sviluppo-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 Tipi di Operatori di Mongodb Da Conoscere<\/title>\n<meta name=\"description\" content=\"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.\" \/>\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\/it\/blog\/operatori-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 Tipi di Operatori di Mongodb Da Conoscere\" \/>\n<meta property=\"og:description\" content=\"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:36:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-14T12:57:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-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=\"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"36 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 Tipi di Operatori di Mongodb Da Conoscere\",\"datePublished\":\"2022-09-19T08:36:18+00:00\",\"dateModified\":\"2023-04-14T12:57:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\"},\"wordCount\":5435,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"MongoDB\",\"sviluppo\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\",\"name\":\"9 Tipi di Operatori di Mongodb Da Conoscere\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg\",\"datePublished\":\"2022-09-19T08:36:18+00:00\",\"dateModified\":\"2023-04-14T12:57:40+00:00\",\"description\":\"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"9 Tipi di Operatori di Mongodb Da Conoscere\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Strumenti di Sviluppo Web\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"9 Tipi di Operatori di Mongodb Da Conoscere\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 Tipi di Operatori di Mongodb Da Conoscere","description":"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.","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\/it\/blog\/operatori-mongodb\/","og_locale":"it_IT","og_type":"article","og_title":"9 Tipi di Operatori di Mongodb Da Conoscere","og_description":"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.","og_url":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2022-09-19T08:36:18+00:00","article_modified_time":"2023-04-14T12:57:40+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","twitter_creator":"@salmanravoof","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Salman Ravoof","Tempo di lettura stimato":"36 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 Tipi di Operatori di Mongodb Da Conoscere","datePublished":"2022-09-19T08:36:18+00:00","dateModified":"2023-04-14T12:57:40+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/"},"wordCount":5435,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","keywords":["datab","database","databases","MongoDB","sviluppo"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/","url":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/","name":"9 Tipi di Operatori di Mongodb Da Conoscere","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","datePublished":"2022-09-19T08:36:18+00:00","dateModified":"2023-04-14T12:57:40+00:00","description":"Questo articolo descrive alcuni dei principali operatori di MongoDB che possono aiutare a migliorare le prestazioni e spiega come usarli.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/09\/operatori-mongodb.jpeg","width":1460,"height":730,"caption":"9 Tipi di Operatori di Mongodb Da Conoscere"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/operatori-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Strumenti di Sviluppo Web","item":"https:\/\/kinsta.com\/it\/argomenti\/strumenti-di-sviluppo-web\/"},{"@type":"ListItem","position":3,"name":"9 Tipi di Operatori di Mongodb Da Conoscere"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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\/it\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/60075","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=60075"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/60075\/revisions"}],"predecessor-version":[{"id":68042,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/60075\/revisions\/68042"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/translations\/dk"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/60075\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/60231"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=60075"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=60075"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=60075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}