{"id":61451,"date":"2022-09-19T09:35:33","date_gmt":"2022-09-19T08:35:33","guid":{"rendered":"https:\/\/kinsta.com\/fr\/?p=61451&#038;preview=true&#038;preview_id=61451"},"modified":"2023-10-18T09:54:00","modified_gmt":"2023-10-18T08:54:00","slug":"operateurs-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/","title":{"rendered":"9 types d&rsquo;op\u00e9rateurs Mongodb que vous devez conna\u00eetre"},"content":{"rendered":"<p>Dans toute entreprise, les donn\u00e9es sont votre plus grand atout. En analysant les donn\u00e9es, vous pouvez prendre des d\u00e9cisions sur les tendances et la pr\u00e9diction du comportement des clients. Cela permet d&rsquo;accro\u00eetre la rentabilit\u00e9 de l&rsquo;entreprise et de prendre des d\u00e9cisions efficaces.<\/p>\n<p>Sans <a href=\"https:\/\/kinsta.com\/fr\/blog\/base-de-donnees-open-source\/\">logiciel de base de donn\u00e9es<\/a>, une t\u00e2che simple comme trouver la moyenne de toutes les valeurs dans un syst\u00e8me rempli d&rsquo;enregistrements serait fastidieuse. Heureusement, les bases de donn\u00e9es ont rendu l&rsquo;analyse des donn\u00e9es plus facile et plus rapide gr\u00e2ce aux fonctions et aux op\u00e9rateurs.<\/p>\n\n<p>Cet article vous \u00e9clairera sur les op\u00e9rateurs utilis\u00e9s dans le logiciel de base de donn\u00e9es 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>Que sont les op\u00e9rateurs MongoDB ?<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/fr\/blog\/qu-est-ce-que-mongodb\/\">MongoDB<\/a> est un logiciel de base de donn\u00e9es NoSQL qui g\u00e8re des informations orient\u00e9es documents.<\/p>\n<p>L&rsquo;une des principales caract\u00e9ristiques de MongoDB est sa rapidit\u00e9. Pour renvoyer les requ\u00eates plus rapidement, MongoDB peut utiliser des op\u00e9rateurs pour ex\u00e9cuter des fonctions sp\u00e9cifiques.<\/p>\n<p>Les op\u00e9rateurs sont des symboles sp\u00e9ciaux qui aident les compilateurs \u00e0 effectuer des t\u00e2ches math\u00e9matiques ou logiques. MongoDB propose plusieurs types d&rsquo;op\u00e9rateurs pour interagir avec la base de donn\u00e9es.<\/p>\n<h2>Types d&rsquo;op\u00e9rateurs MongoDB<\/h2>\n<p>Il existe neuf types d&rsquo;op\u00e9rateurs, chacun nomm\u00e9 en fonction de sa fonction. Par exemple, les op\u00e9rateurs logiques utilisent des op\u00e9rations logiques. Pour les ex\u00e9cuter, vous devez utiliser un mot-cl\u00e9 sp\u00e9cifique et respecter les syntaxes. Cependant, elles sont assez faciles \u00e0 suivre !<\/p>\n<p>\u00c0 la fin de cet article, vous serez en mesure d&rsquo;apprendre les bases de chaque op\u00e9rateur et de ses fonctions.<\/p>\n<h3>Op\u00e9rateurs logiques<\/h3>\n<p>Les op\u00e9rateurs logiques sont souvent utilis\u00e9s pour filtrer les donn\u00e9es en fonction des conditions donn\u00e9es. Ils permettent \u00e9galement l&rsquo;\u00e9valuation de nombreuses conditions, que nous aborderons plus en d\u00e9tail.<\/p>\n<p>Vous trouverez ci-dessous quelques op\u00e9rateurs logiques que vous pouvez utiliser :<\/p>\n<h4>$and<\/h4>\n<p>Une condition \u00ab and \u00bb effectue une op\u00e9ration logique \u00ab and \u00bb sur un tableau de deux ou plusieurs expressions. Elle s\u00e9lectionne les documents pour lesquels <em>toutes les<\/em> conditions des expressions sont satisfaites.<\/p>\n<p>Il s&rsquo;agit de la syntaxe standard de l&rsquo;expression <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>Une condition \u00ab ou \u00bb effectue une op\u00e9ration logique \u00ab ou \u00bb sur un tableau de deux expressions ou plus. Elle s\u00e9lectionne les documents pour lesquels au moins une des expressions est vraie.<\/p>\n<p>Voici la syntaxe standard de l&rsquo;expression <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Par exemple, si nous voulons s\u00e9lectionner les documents o\u00f9 le prix est de 10 $ ou la quantit\u00e9 est inf\u00e9rieure \u00e0 15, nous pouvons saisir la requ\u00eate suivante :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>Nous ne sommes pas oblig\u00e9s de limiter l&rsquo;expression \u00e0 deux crit\u00e8res &#8211; nous pouvons en ajouter d&rsquo;autres. Par exemple, la requ\u00eate ci-dessous s\u00e9lectionne les documents dont le prix est \u00e9gal \u00e0 10 $, la quantit\u00e9 est inf\u00e9rieure \u00e0 15, ou le tag est \u00ab stationary \u00bb :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>Lors de l&rsquo;ex\u00e9cution de ces clauses, MongoDB effectue soit une analyse de collection, soit une analyse d&rsquo;index. Si tous les index prennent en charge les clauses, alors MongoDB utilise les index pour v\u00e9rifier une expression <code>$or<\/code>. Sinon, il utilise une analyse de collection \u00e0 la place.<\/p>\n<p>Mais si vous voulez tester les crit\u00e8res dans le m\u00eame champ, vous pouvez utiliser l&rsquo;op\u00e9rateur <code>$in<\/code> plut\u00f4t que l&rsquo;op\u00e9rateur <code>$or<\/code>. Par exemple, si vous voulez une collection de documents dont la quantit\u00e9 est soit 10 soit 20, vous devrez peut-\u00eatre ex\u00e9cuter la requ\u00eate <code>$in<\/code> ci-dessous \u00e0 la place :<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>Nous reviendrons plus tard sur l&rsquo;op\u00e9rateur <code>$in<\/code>.<\/p>\n<h4>$nor<\/h4>\n<p>Cet op\u00e9rateur effectue une op\u00e9ration logique \u00ab nor \u00bb sur un tableau en utilisant une ou plusieurs expressions. Ensuite, il s\u00e9lectionne les documents qui ne r\u00e9pondent pas aux expressions de la requ\u00eate. En termes plus simples, il fait l&rsquo;inverse de la condition <code>$or<\/code>.<\/p>\n<p>Voici la syntaxe g\u00e9n\u00e9rale :<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>Consid\u00e9rons la requ\u00eate suivante :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Cette requ\u00eate s\u00e9lectionne les documents qui contiennent :<\/p>\n<ul>\n<li>une valeur de champ \u00ab price \u00bb non \u00e9gale \u00e0 3,99 $, et une valeur \u00ab sale \u00bb non \u00e9gale \u00e0 true ; ou<\/li>\n<li>un champ \u00ab price \u00bb dont la valeur n&rsquo;est pas \u00e9gale \u00e0 3,99 $, et un champ \u00ab sale \u00bb vide ou absent ; ou<\/li>\n<li>aucun champ \u00ab price \u00bb, et un champ \u00ab sale \u00bb non \u00e9gal \u00e0 true ; ou<\/li>\n<li>ni champ \u00ab price \u00bb ni champ \u00ab sale \u00bb renseign\u00e9s ou pr\u00e9sents.<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Cet op\u00e9rateur effectue une op\u00e9ration logique \u00ab not \u00bb sur un tableau pour l&rsquo;expression sp\u00e9cifi\u00e9e. Il s\u00e9lectionne ensuite les documents qui ne correspondent pas aux expressions de la requ\u00eate. Cela inclut les documents qui ne contiennent pas le champ.<\/p>\n<p>Voici la syntaxe g\u00e9n\u00e9rale :<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Par exemple, prenez la requ\u00eate suivante :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Cette requ\u00eate s\u00e9lectionnerait les documents qui contiennent :<\/p>\n<ul>\n<li>un champ \u00ab price \u00bb dont la valeur est sup\u00e9rieure ou \u00e9gale \u00e0 3,99 $ ; et<\/li>\n<li>un champ \u00ab price \u00bb non renseign\u00e9 ou inexistant.<\/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> est diff\u00e9rent de l&rsquo;op\u00e9rateur <code>$gte<\/code>. <code>{ $gte : 3.99 }<\/code> renvoie uniquement les documents dans lesquels le champ prix existe et dont la valeur est sup\u00e9rieure ou \u00e9gale \u00e0 3,99 $ (l&rsquo;op\u00e9rateur <code>$not<\/code> renvoie m\u00eame les documents dans lesquels le champ prix n&rsquo;existe pas).<\/p>\n<\/aside>\n\n<h3>Op\u00e9rateurs de comparaison<\/h3>\n<p>Les op\u00e9rateurs de comparaison peuvent \u00eatre utilis\u00e9s pour comparer des valeurs dans un ou plusieurs documents.<\/p>\n<p>Vous trouverez ci-dessous un exemple de code d&rsquo;une simple collection d&rsquo;inventaire pour un supermarch\u00e9 :<\/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>Nous allons utiliser cet exemple tout en d\u00e9taillant ensuite chaque op\u00e9rateur de comparaison.<\/p>\n<h4>\u00c9gal \u00e0 ($eq)<\/h4>\n<p>Cet op\u00e9rateur correspond aux valeurs qui sont \u00e9gales \u00e0 la valeur donn\u00e9e :<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Par exemple, si nous voulons r\u00e9cup\u00e9rer un document sp\u00e9cifique de la collection d&rsquo;inventaire ayant la valeur exacte de quantit\u00e9 \u00ab 20 \u00bb, nous saisirions la commande suivante :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>La requ\u00eate renverrait ce qui suit :<\/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>Sup\u00e9rieur \u00e0 ($gt)<\/h4>\n<p>Cet op\u00e9rateur correspond si les valeurs sont sup\u00e9rieures \u00e0 la valeur donn\u00e9e :<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>Dans cet exemple, nous r\u00e9cup\u00e9rons les documents dont la quantit\u00e9 est sup\u00e9rieure \u00e0 15 :<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>La requ\u00eate renverrait ce qui suit :<\/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>Inf\u00e9rieur \u00e0 ($lt)<\/h4>\n<p>Cet op\u00e9rateur correspond aux valeurs qui sont inf\u00e9rieures \u00e0 la valeur fournie :<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Trouvons les documents dont la quantit\u00e9 est inf\u00e9rieure \u00e0 25 :<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>La requ\u00eate retournerait ce qui suit :<\/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>Sup\u00e9rieur ou \u00e9gal \u00e0 ($gte)<\/h4>\n<p>Cet op\u00e9rateur correspond lorsque les valeurs sont sup\u00e9rieures ou \u00e9gales \u00e0 la valeur donn\u00e9e :<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>Dans cet exemple, nous r\u00e9cup\u00e9rons les documents dont la quantit\u00e9 est sup\u00e9rieure ou \u00e9gale \u00e0 25 :<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Cette requ\u00eate retournerait ce qui suit :<\/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>Inf\u00e9rieur ou \u00e9gal \u00e0 ($lte)<\/h4>\n<p>Cet op\u00e9rateur ne correspond que si les valeurs sont inf\u00e9rieures ou \u00e9gales \u00e0 la valeur donn\u00e9e :<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Trouvons les documents dont la quantit\u00e9 est inf\u00e9rieure ou \u00e9gale \u00e0 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Nous pouvons nous attendre \u00e0 ce que cette requ\u00eate renvoie ce qui suit :<\/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>Dans ($in)<\/h4>\n<p>Cet op\u00e9rateur renvoie les documents qui correspondent aux valeurs sp\u00e9cifi\u00e9es :<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>La valeur d&rsquo;un champ est \u00e9gale \u00e0 toute valeur du tableau sp\u00e9cifi\u00e9. Pour r\u00e9cup\u00e9rer les documents ayant les valeurs \u00ab 30 \u00bb et \u00ab 15 \u00bb dans la collection d&rsquo;inventaire, par exemple, vous feriez ceci :<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>La sortie serait :<\/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>Pas dans ($nin)<\/h4>\n<p>Cet op\u00e9rateur renvoie les documents qui ne correspondent pas aux valeurs donn\u00e9es. Voici la syntaxe de base de l&rsquo;op\u00e9rateur <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> s\u00e9lectionne les documents o\u00f9 :<\/p>\n<ul>\n<li>la valeur du champ ne se trouve pas dans le tableau sp\u00e9cifi\u00e9 ; ou<\/li>\n<li>le champ n&rsquo;existe pas.<\/li>\n<\/ul>\n<p>Si le champ contient des tableaux, il s\u00e9lectionnera les tableaux o\u00f9 aucun \u00e9l\u00e9ment sp\u00e9cifi\u00e9 dans la section valeur n&rsquo;est pr\u00e9sent. Par exemple, nous voulons s\u00e9lectionner les documents dont la quantit\u00e9 n&rsquo;est \u00e9gale ni \u00e0 20 ni \u00e0 15.<\/p>\n<p>En outre, elle correspond \u00e9galement aux documents qui ne poss\u00e8dent pas de champ de quantit\u00e9 :<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>Le r\u00e9sultat serait le suivant :<\/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 \u00e9gal ($ne)<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$ne<\/code> renvoie les documents o\u00f9 la valeur sp\u00e9cifi\u00e9e n&rsquo;est pas \u00e9gale :<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Par exemple, disons que nous voulons s\u00e9lectionner tous les documents o\u00f9 la quantit\u00e9 n&rsquo;est pas \u00e9gale \u00e0 20 :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>La sortie serait :<\/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>D&rsquo;apr\u00e8s le r\u00e9sultat ci-dessus, nous pouvons voir que la requ\u00eate s\u00e9lectionnera les documents qui n&rsquo;ont pas de champ de quantit\u00e9.<\/p>\n<h3>Op\u00e9rateurs d&rsquo;\u00e9l\u00e9ments<\/h3>\n<p>Les op\u00e9rateurs de requ\u00eate par \u00e9l\u00e9ment permettent d&rsquo;identifier des documents \u00e0 l&rsquo;aide des champs du document. Les op\u00e9rateurs d&rsquo;\u00e9l\u00e9ments se composent de <code>$exist<\/code> et <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Cet op\u00e9rateur correspond aux documents qui poss\u00e8dent un champ sp\u00e9cifi\u00e9. Cet op\u00e9rateur a une valeur bool\u00e9enne qui peut \u00eatre soit <code>true<\/code> soit <code>false<\/code>.<\/p>\n<p>S&rsquo;il est sp\u00e9cifi\u00e9 comme \u00e9tant <code>true<\/code>, il correspond aux documents qui contiennent ce champ, y compris les documents o\u00f9 la valeur du champ est nulle. Si &lt;boolean&gt; est <code>false<\/code>, alors la requ\u00eate renvoie uniquement les documents qui ne contiennent pas le champ.<\/p>\n<p>Voici la syntaxe standard :<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } } )<\/code><\/pre>\n<p>Prenons un exemple o\u00f9 nous avons une collection de donn\u00e9es pour un tableau nomm\u00e9 \u00ab bagofmarbles \u00bb, o\u00f9 chaque sac contient des billes de diff\u00e9rentes couleurs :<\/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>Disons que nous voulons une requ\u00eate qui renvoie uniquement les sacs o\u00f9 les billes rouges existent. Cela signifie que nous devrions entrer la valeur bool\u00e9enne comme <code>true<\/code>. Voyons cela :<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>Les r\u00e9sultats seront constitu\u00e9s des documents qui contiennent le champ \u00ab red \u00bb, m\u00eame si la valeur est <code>null<\/code>. Cependant, ils ne seront pas constitu\u00e9s des documents o\u00f9 le champ \u00ab red \u00bb n&rsquo;existe pas :<\/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 nous ne voulions que les sacs o\u00f9 les billes rouges n&rsquo;existent m\u00eame pas comme champ, nous pouvons entrer la requ\u00eate ci-dessous :<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>Les r\u00e9sultats seraient constitu\u00e9s des documents qui ne contiennent pas le champ \u00ab red \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>Cet op\u00e9rateur fait correspondre les documents en fonction du type de champ sp\u00e9cifi\u00e9. Il est utile lorsque vous avez des donn\u00e9es tr\u00e8s peu structur\u00e9es, ou lorsque les types de donn\u00e9es ne sont pas pr\u00e9visibles. Ces types de champ sont des types BSON sp\u00e9cifi\u00e9s et peuvent \u00eatre d\u00e9finis par un num\u00e9ro de type ou un alias.<\/p>\n<p>Voici la syntaxe g\u00e9n\u00e9rale de <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>Disons que nous avons un carnet d&rsquo;adresses contenant les documents ci-dessous :<\/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>En observant les documents ci-dessus, le code postal a diff\u00e9rents types de donn\u00e9es. Il s&rsquo;agit de valeurs longues, doubles, enti\u00e8res et de cha\u00eenes de caract\u00e8res.<\/p>\n<p>Si nous voulons seulement les documents qui ont un type de donn\u00e9es sp\u00e9cifi\u00e9 comme le code postal &#8211; prenons une cha\u00eene de caract\u00e8res pour cet exemple &#8211; nous devrions saisir la requ\u00eate suivante dans le compilateur :<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Cela retournerait les documents suivants :<\/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>En outre, il existe un type \u00ab number \u00bb, qui inclut toutes les valeurs longues, enti\u00e8res ou doubles sous forme de tableau contenant un \u00e9l\u00e9ment des types sp\u00e9cifi\u00e9s :<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Sortie :<\/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 les documents ont un type de tableau, l&rsquo;op\u00e9rateur <code>$type<\/code> renvoie les documents dans lesquels au moins un \u00e9l\u00e9ment de tableau correspond au type pass\u00e9 \u00e0 l&rsquo;op\u00e9rateur.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>\u00c0 partir de MongoDB 3.6 et plus, la requ\u00eate pour <code>$type: \"array\"<\/code>\u00a0renvoie des documents o\u00f9 le champ lui-m\u00eame est un tableau. Cependant, en utilisant la m\u00eame requ\u00eate, les versions pr\u00e9c\u00e9dentes retournaient des documents o\u00f9 le champ est un tableau, et o\u00f9 au moins un \u00e9l\u00e9ment \u00e9tait du type tableau<\/p>\n<\/aside>\n\n<h3>Op\u00e9rateurs de tableau<\/h3>\n<p>MongoDB comprend \u00e9galement des op\u00e9rateurs de tableau, pour interroger des documents contenant des tableaux.<\/p>\n<p>Il existe trois op\u00e9rateurs principaux : <code>$all<\/code>, <code>$elemMatch<\/code> et <code>$size<\/code>. Nous allons examiner chacun d&rsquo;eux en d\u00e9tail ci-dessous.<\/p>\n<h4>tout<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$all<\/code> s\u00e9lectionne les documents dans lesquels la valeur d&rsquo;un champ est un tableau contenant les \u00e9l\u00e9ments sp\u00e9cifi\u00e9s :<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>Par exemple, disons que nous avons une collection de documents pour un magasin de v\u00eatements, avec les \u00e9l\u00e9ments suivants dans l&rsquo;inventaire.<\/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>Nous voudrions r\u00e9cup\u00e9rer tous les documents (dans ce cas, les v\u00eatements) de l&rsquo;inventaire qui sont li\u00e9s aux tags \u00ab trendy \u00bb et \u00ab y2k \u00bb. La requ\u00eate ci-dessous utilise l&rsquo;op\u00e9rateur <code>$all<\/code> o\u00f9 la valeur du champ tags est un tableau dont les \u00e9l\u00e9ments incluent \u00ab y2k \u00bb et \u00ab trendy \u00bb :<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>La requ\u00eate ci-dessus renvoie ce qui suit :<\/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>\u00c0 partir de l&rsquo;exemple ci-dessus, nous constatons \u00e9galement que l&rsquo;op\u00e9rateur <code>$all<\/code> ex\u00e9cute simplement la m\u00eame fonction que l&rsquo;op\u00e9ration <code>$and<\/code>.<\/p>\n<p>Alternativement, nous pourrions utiliser la requ\u00eate ci-dessous qui donnerait un r\u00e9sultat similaire \u00e0 celui ci-dessus :<\/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&rsquo;op\u00e9rateur <code>$elemMatch<\/code> correspond aux documents qui contiennent un champ de tableau dont au moins un \u00e9l\u00e9ment correspond \u00e0 tous les crit\u00e8res de requ\u00eate sp\u00e9cifi\u00e9s :<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Bien que nous puissions utiliser des op\u00e9rateurs de comparaison tels que <code>$lte<\/code> et <code>$gte<\/code>, si nous ne sp\u00e9cifions qu&rsquo;une seule condition de requ\u00eate dans <code>$elemMatch<\/code>, et que nous n&rsquo;utilisons pas les op\u00e9rateurs <code>$not<\/code> ou <code>$ne<\/code>, l&rsquo;utilisation de <code>$elemMatch<\/code> peut \u00eatre omise car il remplirait essentiellement la m\u00eame fonction.<\/p>\n<p>Il y a quelques autres choses \u00e0 garder \u00e0 l&rsquo;esprit lors de l&rsquo;utilisation de cet op\u00e9rateur, principalement :<\/p>\n<ul>\n<li>Vous ne pouvez pas sp\u00e9cifier une expression <code>$where<\/code> dans une op\u00e9ration <code>$elemMatch<\/code>.<\/li>\n<li>Vous ne pouvez pas sp\u00e9cifier une expression de requ\u00eate <code>$text<\/code> dans une op\u00e9ration <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>Par exemple, nous avons les documents suivants dans la collection de r\u00e9sultats des \u00e9tudiants :<\/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 requ\u00eate suivante correspond uniquement aux documents dont le tableau de r\u00e9sultats contient au moins un \u00e9l\u00e9ment qui est \u00e0 la fois sup\u00e9rieur ou \u00e9gal \u00e0 90 et inf\u00e9rieur \u00e0 95 :<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>Notre requ\u00eate renvoie le document suivant, puisque l&rsquo;\u00e9l\u00e9ment 92 est \u00e0 la fois sup\u00e9rieur ou \u00e9gal \u00e0 90 et inf\u00e9rieur \u00e0 95 :<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$size<\/code> renvoie les documents dont la taille du tableau correspond au nombre d&rsquo;\u00e9l\u00e9ments sp\u00e9cifi\u00e9 dans l&rsquo;argument :<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>Voici un exemple :<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Cela renverrait tous les documents de la collection sp\u00e9cifi\u00e9e dont le champ est un tableau comportant 2 \u00e9l\u00e9ments : <code>{ field: [ orange, apple] }<\/code> and <code>{ field: [ blue, red] }<\/code>, but not <code>{ field: blue}<\/code> or <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Cependant, alors que nous pouvons saisir une valeur sp\u00e9cifique comme taille, nous ne pouvons pas sp\u00e9cifier des plages de valeurs comme taille.<\/p>\n<h3>Op\u00e9rateurs g\u00e9ospatiaux<\/h3>\n<p>MongoDB vous permet de stocker des donn\u00e9es g\u00e9ospatiales sous la forme de types GeoJSON. GeoJSON est un format standard ouvert bas\u00e9 sur la notation objet JavaScript qui peut repr\u00e9senter des caract\u00e9ristiques g\u00e9ographiques et prendre en charge des attributs non spatiaux. Il existe deux types d&rsquo;op\u00e9rateurs g\u00e9ospatiaux dont nous allons parler dans cet article : les sp\u00e9cificateurs de g\u00e9om\u00e9trie et les s\u00e9lecteurs de requ\u00eate.<\/p>\n<h4>$geometry<\/h4>\n<p>Cet op\u00e9rateur mentionne la g\u00e9om\u00e9trie GeoJSON \u00e0 utiliser avec les op\u00e9rateurs de requ\u00eate g\u00e9ospatiale suivants : <code>$geoIntersects<\/code>, <code>$geoWithin<\/code>,<code>$nearSphere<\/code>, and <code>$near<\/code>. <code>$geometry<\/code> utilise EPSG:4326 comme syst\u00e8me de r\u00e9f\u00e9rence de coordonn\u00e9es (CRS) par d\u00e9faut.<\/p>\n<p>Pour mentionner des objets GeoJSON avec le CRS par d\u00e9faut, vous pouvez utiliser le code suivant pour <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>Pour mentionner un polygone GeoJSON \u00e0 anneau unique avec un CRS MongoDB adapt\u00e9, vous pouvez utiliser le code suivant (vous ne pouvez l&rsquo;utiliser que pour <code>$geoWithin<\/code> and <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&rsquo;op\u00e9rateur <code>$polygon<\/code> peut \u00eatre utilis\u00e9 pour sp\u00e9cifier un polygone pour une requ\u00eate g\u00e9ospatiale <code>$geoWithin<\/code> sur des paires de coordonn\u00e9es anciennes. Cette requ\u00eate renverra alors les paires qui se situent dans les limites du polygone. Toutefois,<code> $polygon<\/code> n&rsquo;effectuera pas de requ\u00eate sur les objets GeoJSON. Pour d\u00e9finir un polygone, vous devez sp\u00e9cifier un tableau de points de coordonn\u00e9es comme suit :<\/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>Ici, le dernier point est implicitement reli\u00e9 au premier. Vous pouvez mentionner autant de points ou de c\u00f4t\u00e9s que vous le souhaitez.<\/p>\n<p>Par exemple, la requ\u00eate suivante renvoie tous les documents dont les coordonn\u00e9es se trouvent dans le polygone d\u00e9fini par [0,0], [1,5] et [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>Cet op\u00e9rateur peut \u00eatre utilis\u00e9 pour choisir les documents contenant des donn\u00e9es g\u00e9ospatiales qui sont enti\u00e8rement contenus dans une forme sp\u00e9cifique. La forme sp\u00e9cifi\u00e9e peut \u00eatre soit un multipolygone GeoJSON, soit un polygone GeoJSON (\u00e0 plusieurs anneaux ou \u00e0 un seul anneau), soit une forme qui peut \u00eatre d\u00e9finie par des paires de coordonn\u00e9es anciennes.<\/p>\n<p>L&rsquo;op\u00e9rateur <code>$geoWithin<\/code> s&rsquo;appuiera sur l&rsquo;op\u00e9rateur <code>$geometry<\/code> pour mentionner l&rsquo;objet GeoJSON.<\/p>\n<p>Pour mentionner les multi-polygones ou polygones GeoJSON via le syst\u00e8me de r\u00e9f\u00e9rence des coordonn\u00e9es (CRS) par d\u00e9faut, vous pouvez utiliser la syntaxe mentionn\u00e9e ci-dessous :<\/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>Pour les requ\u00eates <code>$geoWithin<\/code> qui mentionnent les g\u00e9om\u00e9tries GeoJSON dont la surface est sup\u00e9rieure \u00e0 un seul h\u00e9misph\u00e8re, l&rsquo;utilisation du CRS par d\u00e9faut entra\u00eenerait des requ\u00eates pour les g\u00e9om\u00e9tries compl\u00e9mentaires.<\/p>\n<p>Pour mentionner un polygone GeoJSON \u00e0 un seul h\u00e9misph\u00e8re avec un SRC MongoDB personnalis\u00e9, vous pouvez exploiter le prototype mentionn\u00e9 ci-dessous dans l&rsquo;expression <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>L&rsquo;exemple suivant s\u00e9lectionne toutes les donn\u00e9es localis\u00e9es qui existent enti\u00e8rement dans un polygone GeoJSON, la superficie du polygone \u00e9tant inf\u00e9rieure \u00e0 celle d&rsquo;un seul h\u00e9misph\u00e8re :<\/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>Vous pouvez utiliser <code>$box<\/code> pour sp\u00e9cifier un rectangle pour une requ\u00eate g\u00e9ospatiale <code>$geoWithin<\/code> afin de fournir les documents qui se trouvent dans les limites du rectangle, en fonction de leurs donn\u00e9es de localisation ponctuelles. Lorsque vous utilisez <code>$geoWithin<\/code> avec <code>$box<\/code>, vous obtenez des documents bas\u00e9s sur les coordonn\u00e9es de la requ\u00eate. Dans ce sc\u00e9nario, <code>$geoWithin<\/code> n&rsquo;effectuera pas de requ\u00eate pour les formes GeoJSON.<\/p>\n<p>Pour tirer parti de l&rsquo;op\u00e9rateur <code>$box<\/code>, vous devez mentionner les coins sup\u00e9rieurs droit et inf\u00e9rieurs gauche du rectangle dans un objet de type tableau :<\/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 requ\u00eate susmentionn\u00e9e calculera la distance en utilisant la g\u00e9om\u00e9trie planaire (plate). La requ\u00eate suivante renverra tous les documents qui sont \u00e0 l&rsquo;int\u00e9rieur de la bo\u00eete ayant des points \u00e0 : [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>Vous pouvez utiliser <code>$nearSphere<\/code> pour mentionner un point pour lequel une requ\u00eate g\u00e9ospatiale renvoie les documents du plus proche au plus \u00e9loign\u00e9.<\/p>\n<p>MongoDB utilise la g\u00e9om\u00e9trie sph\u00e9rique pour calculer les distances pour <code>$nearSphere<\/code>. Il aura besoin d&rsquo;un index g\u00e9ospatial comme suit :<\/p>\n<ol>\n<li>index 2d pour les donn\u00e9es de localisation d\u00e9crites comme des paires de coordonn\u00e9es anciennes. Pour exploiter un index 2d sur des points GeoJSON, vous devez g\u00e9n\u00e9rer l&rsquo;index sur le champ de coordonn\u00e9es de l&rsquo;objet GeoJSON.<\/li>\n<li>index 2dsphere pour les donn\u00e9es de localisation d\u00e9crites comme des points GeoJSON.<\/li>\n<\/ol>\n<p>Pour mentionner un point GeoJSON, vous pouvez exploiter la syntaxe suivante :<\/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>Ici, <code>$minDistance<\/code> et <code>$maxDistance<\/code> sont facultatifs. <code>$minDistance<\/code> peut limiter les r\u00e9sultats aux documents qui sont au moins \u00e0 la distance sp\u00e9cifi\u00e9e du centre. Vous pouvez utiliser <code>$maxDistance<\/code> pour l&rsquo;un ou l&rsquo;autre des index.<\/p>\n<p>Maintenant, consid\u00e9rez une collection de \u00ab places \u00bb qui se compose de documents dont le champ d&#8217;emplacement a un indice 2dsphere. L&rsquo;exemple suivant renverrait les points dont l&#8217;emplacement est situ\u00e9 \u00e0 au moins 2 000 m\u00e8tres et au plus 6 000 m\u00e8tres du point que vous avez choisi, class\u00e9s du plus proche au plus \u00e9loign\u00e9 :<\/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&rsquo;op\u00e9rateur <code>$geoIntersects<\/code> vous permet de s\u00e9lectionner les documents dont les donn\u00e9es g\u00e9ospatiales intersectent avec un objet GeoJSON particulier (c&rsquo;est-\u00e0-dire o\u00f9 la convergence de l&rsquo;objet sp\u00e9cifi\u00e9 et des donn\u00e9es est non vide). Il s&rsquo;appuie sur l&rsquo;op\u00e9rateur <code>$geometry<\/code> pour sp\u00e9cifier l&rsquo;objet GeoJSON.<\/p>\n<p>Pour mentionner des multi-polygones ou des polygones GeoJSON par le biais du syst\u00e8me de r\u00e9f\u00e9rence de coordonn\u00e9es (Coordinate Reference System ou CRS) par d\u00e9faut, vous pouvez utiliser la syntaxe suivante :<\/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>L&rsquo;instance suivante utilisera <code>$geoIntersects<\/code> pour pr\u00e9lever toutes les donn\u00e9es localis\u00e9es qui intersectent le polygone d\u00e9crit par le tableau de coordonn\u00e9es :<\/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&rsquo;op\u00e9rateur <code>$center<\/code> mentionne un cercle pour une requ\u00eate <code>$geoWithin<\/code> qui renvoie les paires de coordonn\u00e9es h\u00e9rit\u00e9es qui se trouvent dans les limites du cercle.<\/p>\n<p><code>$center<\/code> ne renvoie pas d&rsquo;objets GeoJSON. Pour exploiter l&rsquo;op\u00e9rateur <code>$center<\/code>, vous devez sp\u00e9cifier un tableau qui contient :<\/p>\n<ol>\n<li>Le rayon du cercle, tel que mesur\u00e9 dans les unit\u00e9s utilis\u00e9es par le syst\u00e8me de coordonn\u00e9es.<\/li>\n<li>Les coordonn\u00e9es de grille du point central du cercle.<\/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&rsquo;exemple mentionn\u00e9 ci-dessous renverra tous les documents dont les coordonn\u00e9es peuvent \u00eatre trouv\u00e9es dans le cercle centr\u00e9 sur [2,3] et dont le rayon est de 40 :<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } }\n)<\/code><\/pre>\n<h3>Op\u00e9rateurs de projection<\/h3>\n<p>Vous pouvez utiliser des op\u00e9rateurs de projection pour mentionner les champs retourn\u00e9s par une op\u00e9ration. Les op\u00e9rateurs de projection MongoDB permettent d&rsquo;utiliser la fonction <code>find()<\/code> avec des arguments de filtrage des donn\u00e9es. Cela aide les utilisateurs \u00e0 extraire uniquement les champs de donn\u00e9es requis d&rsquo;un document. Ainsi, il permet de projeter des donn\u00e9es transparentes et concises sans affecter les performances globales de la base de donn\u00e9es.<\/p>\n<h4>$elemMatch (projection)<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$elemMatch<\/code> est charg\u00e9 de limiter le contenu d&rsquo;un champ des r\u00e9sultats de la requ\u00eate pour ne contenir que le premier \u00e9l\u00e9ment correspondant \u00e0 la condition <code>$elemMatch<\/code>.<\/p>\n<p>Voici quelques \u00e9l\u00e9ments que vous devez garder \u00e0 l&rsquo;esprit avant d&rsquo;utiliser <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>\u00c0 partir de MongoDB 4.4, ind\u00e9pendamment de l&rsquo;ordre des champs dans le document, la projection <code>$elemMatch<\/code> d&rsquo;un champ existant renvoie le champ apr\u00e8s l&rsquo;inclusion d&rsquo;autres champs existants.<\/li>\n<li>Les op\u00e9rateurs <code>$elemMatch<\/code> et <code>$<\/code> projettent tous deux le premier \u00e9l\u00e9ment correspondant d&rsquo;un tableau en fonction d&rsquo;une condition sp\u00e9cifi\u00e9e. L&rsquo;op\u00e9rateur <code>$<\/code> projetterait le premier \u00e9l\u00e9ment correspondant d&rsquo;un tableau \u00e0 partir de chaque document d&rsquo;une collection en fonction d&rsquo;une condition de l&rsquo;\u00e9nonc\u00e9 de la requ\u00eate, tandis que l&rsquo;op\u00e9rateur de projection <code>$elemMatch<\/code> prend un argument de condition explicite. Cela vous permet de projeter sur la base d&rsquo;une condition qui n&rsquo;est pas pr\u00e9sente dans la requ\u00eate, ou si vous devez projeter sur la base de divers champs dans les documents int\u00e9gr\u00e9s au tableau.<\/li>\n<\/ul>\n<p>Vous devez \u00e9galement \u00eatre conscient des restrictions suivantes avant d&rsquo;utiliser l&rsquo;op\u00e9rateur <code>$elemMatch<\/code> sur vos donn\u00e9es :<\/p>\n<ul>\n<li>Vous ne pouvez pas mentionner une expression de requ\u00eate <code>$text<\/code> au sein d&rsquo;un op\u00e9rateur <code>$elemMatch<\/code>.<\/li>\n<li><code>db.collection.find()<\/code> les op\u00e9rations sur les vues ne prennent pas en charge l&rsquo;op\u00e9rateur de projection <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>L&rsquo;exemple suivant sur l&rsquo;op\u00e9rateur de projection <code>$elemMatch<\/code> suppose une collection <code>schools<\/code> avec les documents suivants :<\/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>Dans ce cas, l&rsquo;op\u00e9ration <code>find()<\/code> recherche tous les documents o\u00f9 la valeur du champ code postal est 63110. La projection <code>$elemMatch<\/code> renverrait uniquement le premier \u00e9l\u00e9ment correspondant du tableau <code>students<\/code> o\u00f9 le champ <code>school<\/code> a une valeur de 103 :<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>Voici \u00e0 quoi ressemblera le r\u00e9sultat :<\/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 (projection)<\/h4>\n<p>L&rsquo;op\u00e9rateur de projection <code>$slice<\/code> peut \u00eatre utilis\u00e9 pour sp\u00e9cifier le nombre d&rsquo;\u00e9l\u00e9ments d&rsquo;un tableau \u00e0 retourner dans le r\u00e9sultat de la requ\u00eate :<\/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>Il peut \u00e9galement \u00eatre exprim\u00e9 de la mani\u00e8re suivante :<\/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>Pour le d\u00e9montrer, vous pouvez cr\u00e9er un exemple de collection de tweets avec les documents suivants :<\/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>L&rsquo;op\u00e9ration suivante utiliserait l&rsquo;op\u00e9rateur de projection <code>$slice<\/code> sur le tableau de tweets pour retourner le tableau avec ses deux premiers \u00e9l\u00e9ments. Si un tableau contient moins de deux \u00e9l\u00e9ments, tous les \u00e9l\u00e9ments du tableau sont retourn\u00e9s :<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Cette op\u00e9ration renverrait les documents suivants :<\/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>$ (projection)<\/h4>\n<p>L&rsquo;op\u00e9rateur positionnel <code>$<\/code> limite le contenu d&rsquo;un tableau pour renvoyer le premier \u00e9l\u00e9ment qui correspond \u00e0 la condition d&rsquo;interrogation de ce tableau. Vous pouvez utiliser <code>$<\/code> dans le document de projection de la m\u00e9thode <code>find()<\/code> ou de la m\u00e9thode <code>findOne()<\/code> lorsque vous n&rsquo;avez besoin que d&rsquo;un \u00e9l\u00e9ment particulier du tableau dans les documents choisis.<\/p>\n<p>Voici \u00e0 quoi ressemble la syntaxe de l&rsquo;op\u00e9rateur <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>Dans cet exemple, la collection <code>students<\/code> est compos\u00e9e des documents suivants :<\/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>Dans la requ\u00eate suivante, la projection <code>{ \"grades.$\": 1 }<\/code> renvoie uniquement le premier \u00e9l\u00e9ment sup\u00e9rieur ou \u00e9gal \u00e0 89 pour le champ <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>Cette op\u00e9ration renvoie les documents suivants :<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Op\u00e9rateurs d&rsquo;\u00e9valuation<\/h3>\n<p>Vous pouvez exploiter les op\u00e9rateurs d&rsquo;\u00e9valuation de MongoDB pour jauger la structure globale des donn\u00e9es ou un champ individuel dans un document.<\/p>\n<p>Examinons quelques op\u00e9rateurs d&rsquo;\u00e9valuation MongoDB courants.<\/p>\n<h4>$mod<\/h4>\n<p>Vous pouvez utiliser cet op\u00e9rateur pour faire correspondre des documents o\u00f9 la valeur d&rsquo;un champ sp\u00e9cifi\u00e9 est \u00e9gale au reste apr\u00e8s avoir \u00e9t\u00e9 divis\u00e9 par une valeur sp\u00e9cifi\u00e9e :<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>Disons que vous avez un tableau de voitures appartenant \u00e0 diff\u00e9rentes marques que vous poss\u00e9dez dans votre salle d&rsquo;exposition. La requ\u00eate suivante vous donnerait toutes les marques de voitures dont le num\u00e9ro de stock est un multiple de 250.<\/p>\n<pre><code class=\"language-php\">db.cars.find ( { qty: { $mod: [ 250,0 ] } } )<\/code><\/pre>\n<h4>$jsonSchema<\/h4>\n<p>L&rsquo;adresse <code>$jsonSchema<\/code> vous permet de faire correspondre les documents qui correspondent au sch\u00e9ma JSON sp\u00e9cifi\u00e9. L&rsquo;impl\u00e9mentation du sch\u00e9ma JSON par MongoDB comprend l&rsquo;ajout du mot-cl\u00e9 <code>bsonType<\/code>, qui vous permet d&rsquo;utiliser tous les types BSON au sein de l&rsquo;op\u00e9rateur <code>$jsonSchema<\/code>.<\/p>\n<p><code>bsonType<\/code> peut accepter les m\u00eames alias de cha\u00eene que vous utiliseriez pour l&rsquo;op\u00e9rateur <code>type<\/code>. Voici \u00e0 quoi ressemblerait la syntaxe de <code>$jsonSchema<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>Ici, l&rsquo;objet de sch\u00e9ma JSON est format\u00e9 sur la base du <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">draft 4 de la norme de sch\u00e9ma JSON<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>Voici un exemple pour d\u00e9montrer le fonctionnement de <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>Vous pouvez \u00e9galement utiliser <code>$jsonSchema<\/code> dans un validateur de document pour faire respecter le sch\u00e9ma sp\u00e9cifi\u00e9 lors des op\u00e9rations de mise \u00e0 jour et d&rsquo;insertion :<\/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>Gardez \u00e0 l&rsquo;esprit qu&rsquo;il existe plusieurs choses qui ne sont pas prises en charge par l&rsquo;op\u00e9rateur <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>Le type integer. Vous devez exploiter le type BSON long ou int avec le mot-cl\u00e9 bsonType.<\/li>\n<li>Les mots-cl\u00e9s inconnus.<\/li>\n<li>Les propri\u00e9t\u00e9s de liaison et l&rsquo;hyperm\u00e9dia du sch\u00e9ma JSON, ainsi que l&rsquo;utilisation des r\u00e9f\u00e9rences JSON et des pointeurs JSON.<\/li>\n<\/ol>\n<h4>text<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$text<\/code> rechercherait un texte dans le contenu du champ sp\u00e9cifi\u00e9, index\u00e9 avec un indice de texte :<\/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>Dans ce cas, le bout de code suivant passera au crible le tableau pour filtrer toutes les voitures contenant le texte \u00ab Porsche \u00bb :<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$regex<\/code> offre des capacit\u00e9s d&rsquo;expression r\u00e9guli\u00e8re pour faire correspondre des cha\u00eenes de caract\u00e8res dans les requ\u00eates. MongoDB exploite les expressions r\u00e9guli\u00e8res qui sont compatibles avec Perl :<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>L&rsquo;exemple suivant permettrait de filtrer toutes les voitures dans lesquelles la cha\u00eene \u00ab $78900 \u00bb est pr\u00e9sente :<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$expr<\/code> vous permet de tirer parti des expressions d&rsquo;agr\u00e9gation dans le langage de requ\u00eate :<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Vous pouvez \u00e9galement utiliser <code>$expr<\/code> pour construire des expressions de requ\u00eate qui comparent les champs d&rsquo;un m\u00eame document dans une \u00e9tape <code>$match<\/code>. Si l&rsquo;\u00e9tape <code>$match<\/code> se trouve \u00eatre la partie d&rsquo;une \u00e9tape <code>$lookup<\/code>, <code>$expr<\/code> peut comparer des champs \u00e0 l&rsquo;aide de variables let.<\/p>\n<h4>$where<\/h4>\n<p>Vous pouvez exploiter l&rsquo;op\u00e9rateur <code>$where<\/code> pour transmettre une cha\u00eene contenant une fonction JavaScript compl\u00e8te ou une expression JavaScript au syst\u00e8me de requ\u00eates. L&rsquo;op\u00e9rateur <code>$where<\/code> offre une plus grande flexibilit\u00e9 mais n\u00e9cessite que la base de donn\u00e9es traite la fonction ou l&rsquo;expression JavaScript pour chaque document de la collection. Vous pouvez r\u00e9f\u00e9rencer ce document dans la fonction ou l&rsquo;expression JavaScript en utilisant soit <code>obj<\/code> soit <code>this<\/code>.<\/p>\n<p>Voici un exemple de la syntaxe :<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>Il y a quelques consid\u00e9rations cl\u00e9s \u00e0 garder \u00e0 l&rsquo;esprit avant de nous plonger dans un exemple d&rsquo;utilisation de l&rsquo;op\u00e9rateur <code>$where<\/code>:<\/p>\n<ul>\n<li>Vous ne devez utiliser l&rsquo;op\u00e9rateur de requ\u00eate <code>$where<\/code> que dans les documents de premier niveau. L&rsquo;op\u00e9rateur de requ\u00eate <code>$where<\/code> ne fonctionnera pas dans un document imbriqu\u00e9, comme dans une requ\u00eate <code>$elemMatch<\/code>.<\/li>\n<li>En g\u00e9n\u00e9ral, vous ne devez utiliser <code>$where<\/code> que lorsque vous ne pouvez pas exprimer votre requ\u00eate via un autre op\u00e9rateur. Si vous devez utiliser <code>$where<\/code>, veillez \u00e0 inclure au moins un autre op\u00e9rateur de requ\u00eate standard pour filtrer l&rsquo;ensemble des r\u00e9sultats. L&rsquo;utilisation ind\u00e9pendante de <code>$where<\/code> n\u00e9cessite un balayage de la collection pour une ex\u00e9cution correcte.<\/li>\n<\/ul>\n<p>Voici un exemple pour illustrer cela :<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Op\u00e9rateurs Bitwise<\/h3>\n<p>Les op\u00e9rateurs bitwise renvoient des donn\u00e9es bas\u00e9es sur des conditions de position de bit. En termes simples, ils sont utilis\u00e9s pour faire correspondre des valeurs num\u00e9riques ou binaires dans lesquelles n&rsquo;importe quel bit d&rsquo;un ensemble de positions binaires a une valeur de 1 ou 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Cet op\u00e9rateur correspondra \u00e0 tous les documents o\u00f9 toutes les positions binaires fournies par la requ\u00eate sont d\u00e9finies (c&rsquo;est-\u00e0-dire 1) dans le champ :<\/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>La valeur du champ doit \u00eatre soit une instance BinData, soit num\u00e9rique pour <code>$bitsAllSet<\/code> afin de correspondre au document actuel.<\/p>\n<p>Dans l&rsquo;instance suivante, nous exploitons une collection avec les documents suivants :<\/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 requ\u00eate mentionn\u00e9e ci-dessous utilisera l&rsquo;op\u00e9rateur <code>$bitsAllSet<\/code> pour tester si le champ a a des bits plac\u00e9s en position 1 et en position 5, o\u00f9 le bit le moins significatif serait en position 0 :<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } )<\/code><\/pre>\n<p>Cette requ\u00eate correspondrait aux documents suivants :<\/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&rsquo;op\u00e9rateur <code>$bitsAllClear<\/code> correspondra aux documents dans lesquels toutes les positions de bits fournies par la requ\u00eate sont claires ou <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>Nous utiliserons ici l&rsquo;exemple utilis\u00e9 pour <code>$bitsAllSet<\/code> pour d\u00e9montrer l&rsquo;utilisation de <code>$bitsAllClear<\/code>. La requ\u00eate suivante utiliserait cet op\u00e9rateur pour v\u00e9rifier si le champ a a les bits clairs aux positions 1 et 5 :<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Cette requ\u00eate correspondrait aux documents suivants :<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }\n{ \"_id\" : 3, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }<\/code><\/pre>\n<h3>M\u00e9ta-op\u00e9rateurs<\/h3>\n<p>Il existe divers modificateurs de requ\u00eate qui vous permettent de modifier le comportement ou la sortie d&rsquo;une requ\u00eate dans MongoDB. Les interfaces du pilote peuvent fournir des m\u00e9thodes de curseur qui les enveloppent pour votre usage.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB a d\u00e9pr\u00e9ci\u00e9 <code>$hint<\/code> depuis la version 3.2. Mais, cet op\u00e9rateur peut encore \u00eatre disponible pour les pilotes MongoDB comme Go, Java, Scala, Ruby, Swift, etc. Il peut forcer l&rsquo;optimiseur de requ\u00eates \u00e0 exploiter un index sp\u00e9cifique pour r\u00e9pondre \u00e0 la requ\u00eate, qui peut alors \u00eatre mentionn\u00e9 soit par document, soit par nom d&rsquo;index.<\/p>\n<p>Vous pouvez \u00e9galement utiliser l&rsquo;op\u00e9rateur <code>$hint<\/code> pour tester les strat\u00e9gies d&rsquo;indexation et les performances des requ\u00eates. Par exemple, prenez l&rsquo;op\u00e9ration suivante :<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Cette op\u00e9ration renverrait tous les documents de la collection appel\u00e9e <code>users<\/code> en exploitant l&rsquo;index sur le champ <code>age<\/code>.<\/p>\n<p>Vous pouvez \u00e9galement mentionner un indice en utilisant l&rsquo;une des formes suivantes :<\/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 un filtre d&rsquo;index existe pour la forme de la requ\u00eate, MongoDB ignorerait simplement le champ <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>L&rsquo;op\u00e9rateur <code>$comment<\/code> vous permet de joindre un commentaire \u00e0 une requ\u00eate dans n&rsquo;importe quel contexte o\u00f9 <code>$query<\/code> peut appara\u00eetre. Comme les commentaires se propagent dans le journal du profil, l&rsquo;ajout d&rsquo;un commentaire peut faciliter l&rsquo;interpr\u00e9tation et le tra\u00e7age de votre profil.<\/p>\n<p>Vous pouvez exploiter <code>$comment<\/code> de l&rsquo;une des trois mani\u00e8res suivantes :<\/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 vous voulez joindre des commentaires \u00e0 des expressions de requ\u00eate dans d&rsquo;autres contextes, comme avec <code>db.collection.update()<\/code>, utilisez l&rsquo;op\u00e9rateur de requ\u00eate <code>$comment<\/code> au lieu du m\u00e9ta-op\u00e9rateur.<\/p>\n<h4>$max<\/h4>\n<p>Vous pouvez mentionner une valeur <code>$max<\/code> pour sp\u00e9cifier la limite sup\u00e9rieure exclusive d&rsquo;un index particulier afin de contraindre les r\u00e9sultats de <code>find()<\/code>. Cet op\u00e9rateur sp\u00e9cifiera la limite sup\u00e9rieure pour toutes les cl\u00e9s d&rsquo;un ordre sp\u00e9cifique dans l&rsquo;index.<\/p>\n<p>Mongosh vous donne la m\u00e9thode <code>max()<\/code> suivante :<\/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>Vous pouvez \u00e9galement mentionner <code>$max<\/code> avec les deux formes suivantes :<\/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>Par exemple, si vous voulez sp\u00e9cifier la limite sup\u00e9rieure exclusive, gardez \u00e0 l&rsquo;esprit les op\u00e9rations suivantes sur une collection nomm\u00e9e collection qui contient un index <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>Cette op\u00e9ration limite la requ\u00eate aux documents dont le champ \u00e2ge est inf\u00e9rieur \u00e0 100 et force un plan de requ\u00eate qui balayera l&rsquo;index <code>{ age: 1 }<\/code> de <code>minKey<\/code> \u00e0 100.<\/p>\n<h4>$explain<\/h4>\n<p>Cet op\u00e9rateur vous donnera des informations sur le plan de requ\u00eate. Il renvoie un document qui d\u00e9crit les index et les processus utilis\u00e9s pour renvoyer la requ\u00eate. Cela peut \u00eatre utile lorsque vous essayez d&rsquo;optimiser une requ\u00eate.<\/p>\n<p>Vous pouvez mentionner l&rsquo;op\u00e9rateur <code>$explain<\/code> sous l&rsquo;une des formes suivantes :<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>Meilleures pratiques pour les op\u00e9rateurs MongoDB<\/h2>\n<p>Dans cette section, nous allons examiner certaines des meilleures pratiques lors de l&rsquo;utilisation de ces op\u00e9rateurs MongoDB.<\/p>\n<h3>Int\u00e9gration et r\u00e9f\u00e9rencement<\/h3>\n<p>L&rsquo;int\u00e9gration est une extension naturelle de la mod\u00e9lisation des donn\u00e9es. Elle vous permet d&rsquo;\u00e9viter les jointures d&rsquo;application, ce qui peut r\u00e9duire les mises \u00e0 jour et les requ\u00eates.<\/p>\n<p>Vous pouvez int\u00e9grer des donn\u00e9es avec une relation 1:1 dans un seul document. Cela dit, les donn\u00e9es avec une relation many:1 dans laquelle de \u00ab nombreux \u00bb objets apparaissent avec leurs documents parents peuvent \u00e9galement \u00eatre de bons candidats.<\/p>\n<p>Stocker ces types de donn\u00e9es dans le m\u00eame document semble \u00eatre un choix prudent. Cependant, l&rsquo;int\u00e9gration offre de meilleures performances pour les op\u00e9rations de lecture avec ce type de localit\u00e9 des donn\u00e9es.<\/p>\n<p>Les mod\u00e8les de donn\u00e9es int\u00e9gr\u00e9s peuvent \u00e9galement aider les d\u00e9veloppeurs \u00e0 mettre \u00e0 jour les donn\u00e9es associ\u00e9es en une seule op\u00e9ration d&rsquo;\u00e9criture. Cela fonctionne parce que les \u00e9critures de documents uniques sont transactionnelles.<\/p>\n<p>Vous devriez envisager d&rsquo;utiliser le r\u00e9f\u00e9rencement pour les sc\u00e9narios suivants :<\/p>\n<ul>\n<li>Lorsque vous mettez \u00e0 jour un segment de document et qu&rsquo;il continue \u00e0 s&rsquo;allonger, alors que le reste du document est statique.<\/li>\n<li>Lorsqu&rsquo;un document est consult\u00e9 mais contient des donn\u00e9es qui sont rarement utilis\u00e9es. L&rsquo;int\u00e9gration ne ferait qu&rsquo;augmenter les exigences en m\u00e9moire, le r\u00e9f\u00e9rencement est donc plus logique.<\/li>\n<li>Lorsque la taille du document d\u00e9passe la limite de 16 Mo fix\u00e9e par MongoDB. Cela peut se produire lors de la mod\u00e9lisation de relations many:1 (par exemple, <em>employ\u00e9s:d\u00e9partement<\/em>).<\/li>\n<\/ul>\n<h3>Examiner le profilage et les mod\u00e8les de requ\u00eate<\/h3>\n<p>Pour la plupart des d\u00e9veloppeurs, la premi\u00e8re \u00e9tape pour <a href=\"https:\/\/kinsta.com\/fr\/blog\/outils-test-performances\/\">optimiser les performances<\/a> consiste \u00e0 comprendre les mod\u00e8les de requ\u00eate r\u00e9els et attendus. Une fois que vous connaissez suffisamment bien les mod\u00e8les de requ\u00eate de votre application, vous pouvez \u00e9laborer votre mod\u00e8le de donn\u00e9es et choisir les index appropri\u00e9s.<\/p>\n<p>Les d\u00e9veloppeurs MongoDB ont acc\u00e8s \u00e0 divers outils puissants qui leur permettent d&rsquo;am\u00e9liorer les performances. Mais cela ne signifie pas que les profils et les mod\u00e8les de requ\u00eate peuvent \u00eatre ignor\u00e9s.<\/p>\n<p>Par exemple, une fa\u00e7on simple d&rsquo;am\u00e9liorer les performances est d&rsquo;analyser vos mod\u00e8les de requ\u00eate et de comprendre o\u00f9 vous pouvez int\u00e9grer les donn\u00e9es. Voici d&rsquo;autres moyens d&rsquo;am\u00e9liorer les performances de MongoDB apr\u00e8s avoir identifi\u00e9 vos principaux mod\u00e8les de requ\u00eate :<\/p>\n<ul>\n<li>S&rsquo;assurer que vous disposez d&rsquo;indices sur tous les champs sur lesquels vous effectuez des requ\u00eates.<\/li>\n<li>Stocker les r\u00e9sultats des sous-requ\u00eates fr\u00e9quentes sur les documents pour r\u00e9duire la charge de lecture.<\/li>\n<li>Examinez vos journaux pour rep\u00e9rer les requ\u00eates lentes, puis v\u00e9rifiez vos index.<\/li>\n<\/ul>\n<h3>Revoir l&rsquo;indexation et la mod\u00e9lisation des donn\u00e9es<\/h3>\n<p>En cr\u00e9ant votre mod\u00e8le de donn\u00e9es, vous d\u00e9ciderez comment mod\u00e9liser les relations entre les donn\u00e9es. Choisir quand incorporer un document plut\u00f4t que de cr\u00e9er une r\u00e9f\u00e9rence \u00e0 travers des documents s\u00e9par\u00e9s dans diff\u00e9rentes collections, par exemple, est un exemple de consid\u00e9ration sp\u00e9cifique \u00e0 l&rsquo;application.<\/p>\n<p>Un avantage majeur des documents JSON est qu&rsquo;ils permettent aux d\u00e9veloppeurs de mod\u00e9liser les donn\u00e9es en fonction des exigences de l&rsquo;application. L&rsquo;imbrication de sous-documents et de tableaux vous permet de mod\u00e9liser des relations complexes entre les donn\u00e9es en exploitant de simples documents texte.<\/p>\n<p>Vous pouvez \u00e9galement utiliser MongoDB pour mod\u00e9liser les \u00e9l\u00e9ments suivants :<\/p>\n<ul>\n<li>Donn\u00e9es g\u00e9ospatiales<\/li>\n<li>Structures tabulaires, plates et en colonnes<\/li>\n<li>Paires cl\u00e9-valeur simples<\/li>\n<li>Donn\u00e9es de s\u00e9ries chronologiques<\/li>\n<li>Ar\u00eates et n\u0153uds de structures de donn\u00e9es de graphes connect\u00e9s et similaires<\/li>\n<\/ul>\n<h3>Surveiller le sharding et la r\u00e9plication<\/h3>\n<p>La r\u00e9plication peut \u00eatre essentielle pour am\u00e9liorer les performances car elle augmente la disponibilit\u00e9 des donn\u00e9es gr\u00e2ce \u00e0 la mise \u00e0 l&rsquo;\u00e9chelle horizontale. La r\u00e9plication peut conduire \u00e0 de meilleures performances et \u00e0 plus de s\u00e9curit\u00e9 gr\u00e2ce \u00e0 la redondance.<\/p>\n<p>La surveillance des performances peut s&rsquo;av\u00e9rer fastidieuse et n\u00e9cessiter des ressources et du temps suppl\u00e9mentaires pour assurer un bon fonctionnement. Vous pouvez tirer parti des outils de surveillance des performances disponibles sur le march\u00e9 qui r\u00e9pondent \u00e0 vos besoins sp\u00e9cifiques.<\/p>\n<p>Par exemple, <a href=\"https:\/\/kinsta.com\/fr\/outil-apm\/\">Kinsta APM<\/a> peut saisir des informations horodat\u00e9es sur les requ\u00eates de la base de donn\u00e9es MySQL de votre site WordPress, les processus PHP, les appels HTTP externes, et bien plus encore. Vous pouvez \u00e9galement utiliser cet outil gratuit pour d\u00e9boguer :<\/p>\n<ul>\n<li>Les longs appels d&rsquo;API<\/li>\n<li>Les longues requ\u00eates URL externes<\/li>\n<li>Des requ\u00eates de base de donn\u00e9es lentes, pour n&rsquo;en citer que quelques-unes.<\/li>\n<\/ul>\n<p>Dans MongoDB, la r\u00e9plication peut \u00eatre r\u00e9alis\u00e9e gr\u00e2ce \u00e0 des ensembles de r\u00e9pliques qui permettent aux d\u00e9veloppeurs de copier les donn\u00e9es d&rsquo;un n\u0153ud ou d&rsquo;un serveur primaire sur plusieurs secondaires. Cela permet \u00e0 votre r\u00e9plication d&rsquo;ex\u00e9cuter certaines requ\u00eates sur les secondaires plut\u00f4t que sur le primaire, \u00e9vitant ainsi la contention et conduisant \u00e0 un meilleur \u00e9quilibrage de la charge.<\/p>\n<p>Les clusters sharded de MongoDB sont un autre moyen d&rsquo;am\u00e9liorer potentiellement les performances. Tout comme la r\u00e9plication, le sharding peut \u00eatre utilis\u00e9 pour distribuer de grands ensembles de donn\u00e9es sur plusieurs serveurs.<\/p>\n<p>En exploitant une cl\u00e9 de shard, les d\u00e9veloppeurs peuvent copier des shards ou des morceaux de donn\u00e9es sur plusieurs serveurs. Ces serveurs peuvent travailler ensemble pour utiliser toutes les donn\u00e9es.<\/p>\n<p>Le sharding a son lot d&rsquo;avantages, notamment la mise \u00e0 l&rsquo;\u00e9chelle horizontale pour les \u00e9critures\/lectures, une plus grande disponibilit\u00e9 et une capacit\u00e9 de stockage accrue.<\/p>\n<h3>D\u00e9terminer l&rsquo;utilisation de la m\u00e9moire<\/h3>\n<p>MongoDB est plus performant lorsque l&rsquo;ensemble de travail d&rsquo;une application (c&rsquo;est-\u00e0-dire les donn\u00e9es et les index fr\u00e9quemment utilis\u00e9s) tient sans probl\u00e8me en m\u00e9moire. Bien que d&rsquo;autres facteurs soient essentiels pour les performances, la taille de la RAM est la plus importante pour le dimensionnement de l&rsquo;instance.<\/p>\n<p>Lorsque l&rsquo;ensemble de travail d&rsquo;une application tient dans la RAM, l&rsquo;activit\u00e9 de lecture sur le disque doit \u00eatre faible. Mais si votre ensemble de travail d\u00e9passe la RAM du serveur ou de la taille de l&rsquo;instance, l&rsquo;activit\u00e9 de lecture commencera \u00e0 augmenter.<\/p>\n<p>Si vous constatez ce ph\u00e9nom\u00e8ne, vous pouvez peut-\u00eatre r\u00e9soudre le probl\u00e8me en passant \u00e0 une instance plus grande qui dispose de plus de m\u00e9moire.<\/p>\n<h3>Placez les champs \u00e0 valeurs multiples \u00e0 la fin<\/h3>\n<p>Si vous indexez quelques champs et que l&rsquo;un des champs que vous souhaitez interroger utilise l&rsquo;un de ces op\u00e9rateurs \u00ab multi-valeurs \u00bb, vous devez les placer \u00e0 la fin de l&rsquo;index. Vous devez ordonner l&rsquo;index de mani\u00e8re \u00e0 ce que les champs interrog\u00e9s pour des valeurs exactes apparaissent en premier et que les op\u00e9rateurs \u00ab multi-valeurs \u00bb apparaissent en dernier dans l&rsquo;index.<\/p>\n<p>Une exception \u00e0 cette r\u00e8gle serait le tri par rapport aux champs. Placez-les entre les champs \u00ab multi-valeurs \u00bb et les champs exacts pour r\u00e9duire la quantit\u00e9 de tri en m\u00e9moire n\u00e9cessaire.<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Pour MongoDB, la vitesse est primordiale. Pour renvoyer rapidement les requ\u00eates, MongoDB utilise des op\u00e9rateurs pour ex\u00e9cuter des t\u00e2ches math\u00e9matiques ou logiques. En termes simples, comprendre les op\u00e9rateurs MongoDB est la cl\u00e9 de la ma\u00eetrise de MongoDB.<\/p>\n\n<p>Cet article a mis en \u00e9vidence certains des principaux op\u00e9rateurs MongoDB que vous pouvez utiliser sur vos donn\u00e9es, tels que les op\u00e9rateurs de comparaison, les op\u00e9rateurs logiques, les m\u00e9ta-op\u00e9rateurs et les op\u00e9rateurs de projection, pour n&rsquo;en citer que quelques-uns. Il vous aide \u00e9galement \u00e0 comprendre comment vous pouvez utiliser les op\u00e9rateurs MongoDB et les meilleures pratiques qui vous permettront d&rsquo;en tirer le meilleur parti.<\/p>\n<p>Parmi tous les op\u00e9rateurs, lequel ou lesquels utilisez-vous le plus souvent, et pourquoi ? Partagez-les dans les commentaires ci-dessous &#8211; nous serions ravis de conna\u00eetre votre avis !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans toute entreprise, les donn\u00e9es sont votre plus grand atout. En analysant les donn\u00e9es, vous pouvez prendre des d\u00e9cisions sur les tendances et la pr\u00e9diction du &#8230;<\/p>\n","protected":false},"author":117,"featured_media":61452,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[840,373,596,449,746],"topic":[1020],"class_list":["post-61451","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-development","tag-mongodb","topic-outils-developpement-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 types d&#039;op\u00e9rateurs Mongodb que vous devez conna\u00eetre<\/title>\n<meta name=\"description\" content=\"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.\" \/>\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\/fr\/blog\/operateurs-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 types d&#039;op\u00e9rateurs Mongodb que vous devez conna\u00eetre\" \/>\n<meta property=\"og:description\" content=\"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstafrance\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:35:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-10-18T08:54:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\" \/>\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=\"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_fr\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 types d&rsquo;op\u00e9rateurs Mongodb que vous devez conna\u00eetre\",\"datePublished\":\"2022-09-19T08:35:33+00:00\",\"dateModified\":\"2023-10-18T08:54:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\"},\"wordCount\":6756,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"development\",\"MongoDB\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\",\"name\":\"9 types d'op\u00e9rateurs Mongodb que vous devez conna\u00eetre\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\",\"datePublished\":\"2022-09-19T08:35:33+00:00\",\"dateModified\":\"2023-10-18T08:54:00+00:00\",\"description\":\"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Outils de d\u00e9veloppement web\",\"item\":\"https:\/\/kinsta.com\/fr\/sujets\/outils-developpement-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"9 types d&rsquo;op\u00e9rateurs Mongodb que vous devez conna\u00eetre\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/fr\/#website\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/fr\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstafrance\/\",\"https:\/\/x.com\/kinsta_fr\",\"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\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/kinsta.com\/fr\/#\/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\/fr\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 types d'op\u00e9rateurs Mongodb que vous devez conna\u00eetre","description":"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.","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\/fr\/blog\/operateurs-mongodb\/","og_locale":"fr_FR","og_type":"article","og_title":"9 types d'op\u00e9rateurs Mongodb que vous devez conna\u00eetre","og_description":"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.","og_url":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstafrance\/","article_published_time":"2022-09-19T08:35:33+00:00","article_modified_time":"2023-10-18T08:54:00+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.","twitter_image":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_fr","twitter_misc":{"\u00c9crit par":"Salman Ravoof","Dur\u00e9e de lecture estim\u00e9e":"37 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 types d&rsquo;op\u00e9rateurs Mongodb que vous devez conna\u00eetre","datePublished":"2022-09-19T08:35:33+00:00","dateModified":"2023-10-18T08:54:00+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/"},"wordCount":6756,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","keywords":["datab","database","databases","development","MongoDB"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/","url":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/","name":"9 types d'op\u00e9rateurs Mongodb que vous devez conna\u00eetre","isPartOf":{"@id":"https:\/\/kinsta.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","datePublished":"2022-09-19T08:35:33+00:00","dateModified":"2023-10-18T08:54:00+00:00","description":"Cet article pr\u00e9sente quelques-uns des principaux op\u00e9rateurs MongoDB qui peuvent vous aider \u00e0 am\u00e9liorer les performances et vous montre comment les utiliser.","breadcrumb":{"@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2022\/09\/mongodb-operators.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/fr\/blog\/operateurs-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Outils de d\u00e9veloppement web","item":"https:\/\/kinsta.com\/fr\/sujets\/outils-developpement-web\/"},{"@type":"ListItem","position":3,"name":"9 types d&rsquo;op\u00e9rateurs Mongodb que vous devez conna\u00eetre"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/fr\/#website","url":"https:\/\/kinsta.com\/fr\/","name":"Kinsta\u00ae","description":"Solutions d&#039;h\u00e9bergement premium, rapides et s\u00e9curis\u00e9es","publisher":{"@id":"https:\/\/kinsta.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/fr\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/fr\/wp-content\/uploads\/sites\/4\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstafrance\/","https:\/\/x.com\/kinsta_fr","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\/fr\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/kinsta.com\/fr\/#\/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\/fr\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/61451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/comments?post=61451"}],"version-history":[{"count":13,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/61451\/revisions"}],"predecessor-version":[{"id":68115,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/posts\/61451\/revisions\/68115"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/translations\/dk"},{"href":"https:\/\/kinsta.com\/fr\/wp-json\/kinsta\/v1\/posts\/61451\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media\/61452"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/media?parent=61451"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/tags?post=61451"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/fr\/wp-json\/wp\/v2\/topic?post=61451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}