{"id":45128,"date":"2022-09-19T09:33:28","date_gmt":"2022-09-19T08:33:28","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=45128&#038;preview=true&#038;preview_id=45128"},"modified":"2023-08-24T11:32:14","modified_gmt":"2023-08-24T10:32:14","slug":"mongodb-operatorer","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/","title":{"rendered":"9 typer Mongodb-operatorer, som du skal kende"},"content":{"rendered":"<p style=\"text-align: left\">I enhver virksomhed er data dit st\u00f8rste aktiv. Ved at analysere data kan du tr\u00e6ffe beslutninger om kundetendenser og forudsigelse af adf\u00e6rd. Dette \u00f8ger virksomhedens rentabilitet og effektiv beslutningstagning.<\/p>\n<p>Uden <a href=\"https:\/\/kinsta.com\/blog\/open-source-database\/\">databasesoftware<\/a> ville en simpel opgave som at finde gennemsnittet af alle v\u00e6rdierne i et system fuld af poster v\u00e6re kedelig. Heldigvis har databaser gjort det nemmere og hurtigere at analysere data med funktioner og operat\u00f8rer.<\/p>\n\n<p>Denne artikel vil kaste lidt lys over de operat\u00f8rer, der bruges i MongoDB-databasesoftwaren.<\/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>Hvad er MongoDB-operatorer?<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a> er en NoSQL-databasesoftware, der h\u00e5ndterer dokumentorienteret information.<\/p>\n<p>En af MongoDB&#8217;s vigtigste funktioner er dens hastighed. For at returnere foresp\u00f8rgsler hurtigere kan MongoDB bruge operat\u00f8rer til at udf\u00f8re specifikke funktioner.<\/p>\n<p>Operatorer er specielle symboler, der hj\u00e6lper compilere med at udf\u00f8re matematiske eller logiske opgaver. MongoDB tilbyder flere typer af operat\u00f8rer til at interagere med databasen.<\/p>\n<h2>MongoDB Operatortyper<\/h2>\n<p>Der findes ni typer af operat\u00f8rer, som hver is\u00e6r er opkaldt efter deres funktion. Logiske operat\u00f8rer bruger f.eks. logiske operationer. For at udf\u00f8re dem skal du bruge et specifikt n\u00f8gleord og f\u00f8lge syntaksen. De er dog ret nemme at f\u00f8lge!<\/p>\n<p>N\u00e5r du n\u00e5r slutningen af artiklen vil du v\u00e6re i stand til at l\u00e6re det grundl\u00e6ggende om hver enkelt operat\u00f8r og dens funktioner.<\/p>\n<h3>Logiske operatorer<\/h3>\n<p>Logiske operatorer bruges ofte til at filtrere data p\u00e5 baggrund af de givne betingelser. De giver ogs\u00e5 mulighed for at evaluere mange betingelser, hvilket vi vil diskutere n\u00e6rmere.<\/p>\n<p>Nedenfor er der nogle f\u00e5 logiske operatorer, som du kan bruge:<\/p>\n<h4>$og<\/h4>\n<p>En &#8220;og&#8221;-betingelse udf\u00f8rer en logisk &#8220;og&#8221;-operation p\u00e5 et array af to eller flere udtryk. Den udv\u00e6lger de dokumenter, hvor <em>alle<\/em> betingelserne i udtrykkene er opfyldt.<\/p>\n<p>Dette er standardsyntaksen for udtrykket <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>En &#8220;or&#8221;-betingelse udf\u00f8rer en logisk &#8220;or&#8221;-operation p\u00e5 et array af to eller flere udtryk. Den udv\u00e6lger de dokumenter, hvor mindst et af udtrykkene er sandt.<\/p>\n<p>Dette er standardsyntaksen for udtrykket <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Hvis vi f.eks. \u00f8nsker at udv\u00e6lge dokumenter, hvor prisen er 10 USD eller m\u00e6ngden er mindre end 15, kan vi indtaste f\u00f8lgende foresp\u00f8rgsel:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>Vi beh\u00f8ver ikke at begr\u00e6nse udtrykket til to kriterier &#8211; vi kan tilf\u00f8je flere. F.eks. kan nedenst\u00e5ende foresp\u00f8rgsel udv\u00e6lge de dokumenter, hvor prisen er lig med 10 USD, m\u00e6ngden er under 15, eller tagget er station\u00e6rt:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>N\u00e5r disse klausuler k\u00f8res, udf\u00f8rer MongoDB enten en samlingsscanning eller en indeksscanning. Hvis alle indekser underst\u00f8tter klausulerne, bruger MongoDB indekser til at kontrollere et <code>$or<\/code> udtryk. Ellers bruger den i stedet en samlingsscanning.<\/p>\n<p>Men hvis du \u00f8nsker at teste kriterierne i det samme felt, kan du bruge operatoren <code>$in<\/code> i stedet for operatoren <code>$or<\/code>. Hvis du f.eks. vil have en samling dokumenter, hvor m\u00e6ngden enten er 10 eller 20, skal du m\u00e5ske k\u00f8re nedenst\u00e5ende <code>$in<\/code> foresp\u00f8rgsel i stedet:<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>Vi kommer n\u00e6rmere ind p\u00e5 operatoren <code>$in<\/code> senere.<\/p>\n<h4>$nor<\/h4>\n<p>Denne operat\u00f8r udf\u00f8rer en logisk &#8220;nor&#8221;-operation p\u00e5 et array ved hj\u00e6lp af et eller flere udtryk. Derefter udv\u00e6lger den de dokumenter, der ikke opfylder foresp\u00f8rgselsudtrykkene. I enklere vendinger g\u00f8r den det modsatte af betingelsen <code>$or<\/code>.<\/p>\n<p>Dette er den generelle syntaks:<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>Lad os se p\u00e5 f\u00f8lgende foresp\u00f8rgsel:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Denne foresp\u00f8rgsel udv\u00e6lger de dokumenter, der indeholder:<\/p>\n<ul>\n<li>en v\u00e6rdi i prisfeltet, der ikke er lig med 3,99 USD, og en salgsv\u00e6rdi, der ikke er lig med true, eller<\/li>\n<li>en v\u00e6rdi i prisfeltet, der ikke er lig med 3,99 USD, og et tomt eller manglende salgsfelt, eller<\/li>\n<li>intet prisfelt og et udsalgsfelt, der ikke er lig med true, eller<\/li>\n<li>hverken prisfelt eller udsalgsfelt er udfyldt eller til stede.<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Denne operat\u00f8r udf\u00f8rer en logisk &#8220;not&#8221;-operation p\u00e5 et array for det angivne udtryk. Derefter udv\u00e6lges de dokumenter, der ikke svarer til foresp\u00f8rgselsudtrykket. Dette omfatter de dokumenter, der ikke indeholder feltet.<\/p>\n<p>Dette er den generelle syntaks:<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Tag f.eks. f\u00f8lgende foresp\u00f8rgsel:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Denne foresp\u00f8rgsel vil v\u00e6lge de dokumenter, der indeholder:<\/p>\n<ul>\n<li>et prisfelt, hvis v\u00e6rdi er st\u00f8rre end eller lig med 3,99 USD, og<\/li>\n<li>et prisfelt er ikke udfyldt eller findes ikke.<\/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> er forskellig fra operatoren <code>$gte<\/code>. <code>{ $gte: 3.99 }<\/code> returnerer kun de dokumenter, hvor prisfeltet findes, og hvis v\u00e6rdi er st\u00f8rre end eller lig med $3,99 (operatoren<code> $not<\/code> returnerer ogs\u00e5 de dokumenter, hvor prisfeltet ikke findes).<\/p>\n<\/aside>\n\n<h3>Sammenligningsoperatorer<\/h3>\n<p>Sammenligningsoperatorer kan bruges til at sammenligne v\u00e6rdier i et eller flere dokumenter.<\/p>\n<p>Nedenfor er et kodeeksempel p\u00e5 en simpel lageropsamling for et supermarked:<\/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>Vi bruger dette eksempel, mens vi beskriver hver enkelt sammenligningsoperator i det f\u00f8lgende.<\/p>\n<h4>Lig med ($eq)<\/h4>\n<p>Denne operat\u00f8r matcher v\u00e6rdier, der er lig med den givne v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Hvis vi f.eks. \u00f8nsker at hente et bestemt dokument fra inventaropsamlingen med den n\u00f8jagtige m\u00e6ngdev\u00e6rdi &#8220;20&#8221;, skal vi indtaste f\u00f8lgende kommando:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>Foresp\u00f8rgslen ville returnere f\u00f8lgende:<\/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>St\u00f8rre end ($gt)<\/h4>\n<p>Denne operator passer til, hvis v\u00e6rdierne er st\u00f8rre end den angivne v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>I dette eksempel henter vi de dokumenter, hvor m\u00e6ngden er st\u00f8rre end 15:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>Foresp\u00f8rgslen ville give f\u00f8lgende:<\/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>Mindre end ($lt)<\/h4>\n<p>Denne operator passer til, hvis v\u00e6rdierne er mindre end den angivne v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Lad os finde de dokumenter, hvis antal er mindre end 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>Foresp\u00f8rgslen vil give f\u00f8lgende:<\/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>St\u00f8rre end eller lig med ($gte)<\/h4>\n<p>Denne operat\u00f8r passer, n\u00e5r v\u00e6rdierne er st\u00f8rre end eller lig med den angivne v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>I dette eksempel henter vi de dokumenter, hvor m\u00e6ngden er st\u00f8rre end eller lig med 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Denne foresp\u00f8rgsel ville give f\u00f8lgende:<\/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>Mindre end eller lig med ($lte)<\/h4>\n<p>Denne operator passer kun, hvis v\u00e6rdierne er mindre end eller lig med den angivne v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Lad os finde de dokumenter med en m\u00e6ngde, der er mindre end eller lig med 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Vi kan forvente, at denne foresp\u00f8rgsel returnerer f\u00f8lgende:<\/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>I ($in)<\/h4>\n<p>Denne operat\u00f8r returnerer de dokumenter, der svarer til de angivne v\u00e6rdier:<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>V\u00e6rdien af et felt er lig med enhver v\u00e6rdi i det angivne array. Hvis du f.eks. vil hente dokumenterne med v\u00e6rdierne &#8220;30&#8221; og &#8220;15&#8221; i inventarsamlingen, skal du g\u00f8re dette:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>Udgangen ville v\u00e6re:<\/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>Ikke i ($nin)<\/h4>\n<p>Denne operat\u00f8r returnerer de dokumenter, der ikke matcher de givne v\u00e6rdier. Her er den grundl\u00e6ggende syntaks for operatoren <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> udv\u00e6lger de dokumenter, hvor:<\/p>\n<ul>\n<li>feltets v\u00e6rdi er ikke i det angivne array, eller<\/li>\n<li>feltet findes ikke.<\/li>\n<\/ul>\n<p>Hvis feltet indeholder arrays, udv\u00e6lges arrays, hvor der ikke findes noget element, der er angivet i v\u00e6rdiafsnittet. Vi \u00f8nsker f.eks. at v\u00e6lge de dokumenter, hvor m\u00e6ngden ikke er lig med hverken 20 eller 15.<\/p>\n<p>Derudover matcher den ogs\u00e5 dokumenter, der ikke har et m\u00e6ngdefelt:<\/p>\n<pre><code>db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>Resultatet ville v\u00e6re:<\/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>Not Equal ($ne)<\/h4>\n<p>Operatoren <code>$ne<\/code> returnerer de dokumenter, hvor den angivne v\u00e6rdi ikke er lig med hinanden:<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Lad os for eksempel sige, at vi \u00f8nsker at v\u00e6lge alle dokumenter, hvor m\u00e6ngden ikke er lig med 20:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>Resultatet ville v\u00e6re:<\/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>Af ovenst\u00e5ende output kan vi se, at foresp\u00f8rgslen vil v\u00e6lge dokumenter, der ikke har et m\u00e6ngdefelt.<\/p>\n<h3>Operatorer for elementer<\/h3>\n<p>Med elementforesp\u00f8rgselsoperatorerne kan dokumenter identificeres ved hj\u00e6lp af dokumentets felter. Elementoperatorer best\u00e5r af <code>$exist<\/code> og <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Denne operator matcher dokumenter, der har et angivet felt. Operatoren har en boolsk v\u00e6rdi, som kan v\u00e6re enten <code>true<\/code> eller <code>false<\/code>.<\/p>\n<p>Hvis den er angivet som <code>true<\/code>, matcher den de dokumenter, der indeholder det p\u00e5g\u00e6ldende felt, herunder dokumenter, hvor feltv\u00e6rdien er nul. Hvis &lt;boolean&gt; er <code>false<\/code>, returnerer foresp\u00f8rgslen kun de dokumenter, der ikke indeholder feltet.<\/p>\n<p>Her er standardsyntaksen:<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } })<\/code><\/pre>\n<p>Lad os tage et eksempel, hvor vi har indsamlingsdata for et array ved navn &#8220;bagofmarbles&#8221;, hvor hver pose indeholder kugler af forskellige farver:<\/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>Lad os sige, at vi \u00f8nsker en foresp\u00f8rgsel, der kun returnerer de poser, hvor der findes r\u00f8de kugler. Det betyder, at vi skal indtaste den boolske v\u00e6rdi som <code>true<\/code>. Lad os tage et kig:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>Resultaterne ville best\u00e5 af de dokumenter, der indeholder feltet &#8220;red&#8221;, selv om v\u00e6rdien var <code>null<\/code>. Derimod ville de ikke best\u00e5 af de dokumenter, hvor feltet &#8220;red&#8221; slet ikke eksisterede:<\/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>Hvis vi kun ville have de poser, hvor r\u00f8de kugler ikke engang findes som felt, kan vi indtaste nedenst\u00e5ende foresp\u00f8rgsel:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>Resultaterne vil best\u00e5 af de dokumenter, der ikke indeholder feltet &#8220;red&#8221;:<\/p>\n<pre><code class=\"language-php\">{ green: 2, blue: 4 }\n{ green: 2 }\n{ blue: 6 }<\/code><\/pre>\n<h4>$type<\/h4>\n<p>Denne operat\u00f8r matcher dokumenter i henhold til den angivne felttype. Dette er nyttigt, n\u00e5r du har meget ustrukturerede data, eller n\u00e5r datatyperne ikke er forudsigelige. Disse felttyper er specificerede BSON-typer og kan defineres enten ved hj\u00e6lp af typenummer eller alias.<\/p>\n<p>Dette er den generelle syntaks for <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>Lad os sige, at vi har en adressebog, der indeholder nedenst\u00e5ende dokumenter:<\/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>Hvis vi ser p\u00e5 ovenst\u00e5ende dokumenter, har postnummeret forskellige datatyper. Dette omfatter lange, dobbelte, hele tal og stringv\u00e6rdier.<\/p>\n<p>Hvis vi kun vil have de dokumenter, der har en bestemt datatype som postnummer &#8211; lad os tage string i dette tilf\u00e6lde &#8211; skal vi indtaste f\u00f8lgende foresp\u00f8rgsel i compileren:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Dette ville give f\u00f8lgende dokumenter tilbage:<\/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>Derudover er der en &#8220;number&#8221;-type, som indeholder alle long-, integer- eller double-v\u00e6rdier som et array, der indeholder et element af de angivne typer:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Output:<\/p>\n<pre><code class=\"language-php\">[\n{\n      \"_id\": 2,\n      address: \"25 Moon Place\",\n      zipCode: 26237\n    },\n    {\n      \"_id\": 3,\n      address: \"2324 Neptune Ring\",\n      zipCode: NumberLong(77622222)\n    },\n    {\n      \"_id\": 4,\n      address: \"33 Saturns Moon\",\n      zipCode: NumberInt(117)\n    }\n]<\/code><\/pre>\n<p>Hvis dokumenterne har en array-felttype, returnerer operatoren <code>$type<\/code> de dokumenter, hvor mindst \u00e9t array-element svarer til den type, der er angivet til operatoren.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Fra MongoDB 3.6 og senere returnerer foresp\u00f8rgsel efter <code>$type: \"array\"<\/code>\u00a0dokumenter, hvor selve feltet er et array. Ved brug af den samme foresp\u00f8rgsel returnerede de tidligere versioner imidlertid dokumenter, hvor feltet er et array, og hvor mindst \u00e9t element var af datatypen array.<\/p>\n<\/aside>\n\n<h3>Array-operatorer<\/h3>\n<p>MongoDB best\u00e5r ogs\u00e5 af array-operat\u00f8rer til at foresp\u00f8rge dokumenter, der indeholder arrays.<\/p>\n<p>Der er tre prim\u00e6re operatorer: <code>$all<\/code>, , <code>$elemMatch<\/code> og <code>$size<\/code>. Vi vil diskutere hver enkelt i detaljer nedenfor.<\/p>\n<h4>$all<\/h4>\n<p>Operatoren <code>$all<\/code> v\u00e6lger de dokumenter, hvor et felts v\u00e6rdi er et array, der indeholder de angivne elementer:<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>Lad os f.eks. sige, at vi har en samling dokumenter for en t\u00f8jbutik med f\u00f8lgende under inventar.<\/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>Vi \u00f8nsker at hente alle dokumenter (i dette tilf\u00e6lde t\u00f8j) fra lageret, der er knyttet til tagsene &#8220;trendy&#8221; og &#8220;y2k&#8221;. Nedenst\u00e5ende foresp\u00f8rgsel anvender operatoren <code>$all<\/code>, hvor v\u00e6rdien af feltet tags er et array, hvis elementer omfatter &#8220;y2k&#8221; og &#8220;trendy&#8221;:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>Ovenst\u00e5ende foresp\u00f8rgsel returnerer f\u00f8lgende:<\/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>Fra ovenst\u00e5ende eksempel finder vi ogs\u00e5, at operatoren <code>$all<\/code> simpelthen udf\u00f8rer den samme funktion som operationen <code>$and<\/code>.<\/p>\n<p>Alternativt kunne vi bruge nedenst\u00e5ende foresp\u00f8rgsel, som ville give et lignende output som ovenst\u00e5ende:<\/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>Operatoren <code>$elemMatch<\/code> matcher dokumenter, der indeholder et array-felt med mindst \u00e9t element, der matcher alle de angivne foresp\u00f8rgselskriterier:<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Vi kan bruge sammenligningsoperatorer som <code>$lte<\/code> og <code>$gte<\/code>, men hvis vi kun angiver en enkelt foresp\u00f8rgselsbetingelse inden for <code>$elemMatch<\/code>, og ikke bruger <code>$not<\/code> eller <code>$ne<\/code> -operatorerne, kan vi udelade at bruge <code>$elemMatch<\/code>, da det i det v\u00e6sentlige ville udf\u00f8re den samme funktion.<\/p>\n<p>Der er et par andre ting, som man skal v\u00e6re opm\u00e6rksom p\u00e5, n\u00e5r man bruger denne operator, is\u00e6r:<\/p>\n<ul>\n<li>Du kan ikke angive et <code>$where<\/code> -udtryk i en <code>$elemMatch<\/code> -operation.<\/li>\n<li>Du kan ikke angive et <code>$text<\/code> foresp\u00f8rgselsudtryk i en <code>$elemMatch<\/code> -operation.<\/li>\n<\/ul>\n<p>Vi har f.eks. f\u00f8lgende dokumenter i samlingen af elevresultater:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, results: [ 92, 89, 98 ] }\n{ _id: 2, results: [ 85, 99, 99 ] }<\/code><\/pre>\n<p>F\u00f8lgende foresp\u00f8rgsel matcher kun de dokumenter, hvor resultatmatrixen indeholder mindst \u00e9t element, der b\u00e5de er st\u00f8rre end eller lig med 90 og mindre end 95:<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>Vores foresp\u00f8rgsel returnerer f\u00f8lgende dokument, da elementet 92 b\u00e5de er st\u00f8rre end eller lig med 90 og er mindre end 95:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>Operatoren <code>$size<\/code> returnerer de dokumenter, hvor arrayets st\u00f8rrelse svarer til det antal elementer, der er angivet i argumentet:<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>Her er et eksempel:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Dette ville returnere alle dokumenter i den angivne samling, hvor feltet er et array med 2 elementer: <code>{ field: [ orange, apple] }<\/code> og <code>{ field: [ blue, red] }<\/code>, men ikke <code>{ field: blue}<\/code> eller <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Men mens vi kan indtaste den specifikke v\u00e6rdi som st\u00f8rrelse, kan vi ikke angive v\u00e6rdim\u00e6ngder som st\u00f8rrelse.<\/p>\n<h3>Geospatiale operatorer<\/h3>\n<p>MongoDB giver dig mulighed for at gemme geospatiale data i form af GeoJSON-typer. GeoJSON er et \u00e5bent standardformat baseret p\u00e5 JavaScript-objektnotationen, der kan repr\u00e6sentere geografiske elementer og underst\u00f8tte ikke-geografiske attributter. Der er to typer geospatiale operatorer, som vi vil tale om i denne artikel: geometri-specifikatorer og foresp\u00f8rgselsv\u00e6lgere.<\/p>\n<h4>$geometri<\/h4>\n<p>Denne operat\u00f8r n\u00e6vner GeoJSON-geometri til brug med f\u00f8lgende geospatiale foresp\u00f8rgselsoperatorer: <code>$geoIntersects<\/code>, , <code>$geoWithin<\/code>,<code>$nearSphere<\/code> og <code>$near<\/code>. <code>$geometry<\/code> udnytter EPSG:4326 som standardkoordinatreferencesystem (CRS).<\/p>\n<p>Hvis du vil n\u00e6vne GeoJSON-objekter med standard CRS, kan du bruge f\u00f8lgende uddrag for <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>Hvis du vil n\u00e6vne en enkeltringet GeoJSON-polygon med et skr\u00e6ddersyet MongoDB CRS, kan du bruge f\u00f8lgende uddrag (du kan kun bruge dette for <code>$geoWithin<\/code> og <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>Operatoren <code>$polygon<\/code> kan bruges til at angive en polygon for en geospatial <code>$geoWithin<\/code> foresp\u00f8rgsel p\u00e5 \u00e6ldre koordinatpar. Denne foresp\u00f8rgsel vil derefter returnere de par, der ligger inden for polygonens gr\u00e6nser. <code> $polygon<\/code> vil dog ikke foresp\u00f8rge efter GeoJSON-objekter. For at definere en polygon skal du angive et array af koordinatpunkter p\u00e5 f\u00f8lgende m\u00e5de:<\/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>Her er det sidste punkt implicit forbundet med det f\u00f8rste. Du kan n\u00e6vne s\u00e5 mange punkter eller sider, som du vil.<\/p>\n<p>F\u00f8lgende foresp\u00f8rgsel vil f.eks. returnere alle de dokumenter, hvis koordinater findes inden for polygonen defineret af [0,0], [1,5] og [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>Denne operat\u00f8r kan bruges til at v\u00e6lge dokumenter med geodata, som er helt indeholdt i en bestemt form. Den angivne form kan enten v\u00e6re en GeoJSON-multipolygon, en GeoJSON-polygon (enten med flere ringe eller en enkelt ring) eller en form, der kan defineres ved hj\u00e6lp af \u00e6ldre koordinatpar.<\/p>\n<p>Operatoren <code>$geoWithin<\/code> vil udnytte operatoren <code>$geometry<\/code> til at n\u00e6vne GeoJSON-objektet.<\/p>\n<p>For at n\u00e6vne GeoJSON-multipolygoner eller -polygoner via standard koordinatreferencesystemet (CRS) kan du bruge nedenst\u00e5ende syntaks:<\/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>For <code>$geoWithin<\/code> foresp\u00f8rgsler, der n\u00e6vner GeoJSON-geometrier med omr\u00e5der, der er st\u00f8rre end en enkelt halvkugle, vil brugen af standard CRS f\u00f8re til foresp\u00f8rgsler om de komplement\u00e6re geometrier.<\/p>\n<p>Hvis du vil n\u00e6vne en GeoJSON-polygon med en enkelt ring med et brugerdefineret MongoDB CRS, kan du udnytte nedenst\u00e5ende prototype i <code>$geometry<\/code> -udtrykket:<\/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>Det f\u00f8lgende eksempel v\u00e6lger alle de lok-data, der findes fuldst\u00e6ndigt inden for en GeoJSON-polygon, idet polygonens areal er mindre end arealet af en enkelt halvkugle:<\/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>Du kan bruge <code>$box<\/code> til at angive et rektangel for en geospatial <code>$geoWithin<\/code> -foresp\u00f8rgsel for at f\u00e5 dokumenter, der ligger inden for rektanglets gr\u00e6nser, i henhold til deres punktbaserede lokaliseringsdata. N\u00e5r du bruger <code>$geoWithin<\/code> sammen med <code>$box<\/code>, f\u00e5r du dokumenter baseret p\u00e5 foresp\u00f8rgselskoordinater. I dette scenario vil <code>$geoWithin<\/code> ikke foresp\u00f8rge efter GeoJSON-former.<\/p>\n<p>For at udnytte operatoren <code>$box<\/code> skal du n\u00e6vne rektanglets \u00f8verste h\u00f8jre og nederste venstre hj\u00f8rne i et arrayobjekt:<\/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>Ovenn\u00e6vnte foresp\u00f8rgsel vil beregne afstanden ved hj\u00e6lp af planar (flad) geometri. F\u00f8lgende foresp\u00f8rgsel returnerer alle de dokumenter, der ligger inden for den kasse, der har punkter p\u00e5: [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>Du kan bruge <code>$nearSphere<\/code> til at n\u00e6vne et punkt, for hvilket en geografisk foresp\u00f8rgsel returnerer dokumenterne fra det n\u00e6rmeste til det fjerneste punkt.<\/p>\n<p>MongoDB bruger sf\u00e6risk geometri til at beregne afstandene for <code>$nearSphere<\/code>. Det vil have brug for et geospatialt indeks som f\u00f8lger:<\/p>\n<ol>\n<li>2d-indeks for lokaliseringsdata, der er beskrevet som \u00e6ldre koordinatpar. For at udnytte et 2d-indeks p\u00e5 GeoJSON-punkter skal du generere indekset p\u00e5 GeoJSON-objektets koordinatfelt.<\/li>\n<li>2dsphere-indeks for lokaliseringsdata, der er beskrevet som GeoJSON-punkter.<\/li>\n<\/ol>\n<p>For at n\u00e6vne et GeoJSON-punkt kan du bruge f\u00f8lgende syntaks:<\/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>Her er <code>$minDistance<\/code> og <code>$maxDistance<\/code> valgfrie. <code>$minDistance<\/code> kan begr\u00e6nse resultaterne til de dokumenter, der er mindst den angivne afstand fra centrum. Du kan bruge <code>$maxDistance<\/code> til begge indeks.<\/p>\n<p>Overvej nu en samling af &#8220;steder&#8221;, der best\u00e5r af dokumenter med et stedfelt, der har et 2dsphere-indeks. F\u00f8lgende eksempel ville returnere de punkter, hvis placering er mindst 2.000 meter og h\u00f8jst 6.000 meter fra det punkt, du v\u00e6lger, ordnet fra n\u00e6rmest til fjernest:<\/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>Operatoren <code>$geoIntersects<\/code> giver dig mulighed for at v\u00e6lge dokumenter, hvis geospatiale data sk\u00e6rer et bestemt GeoJSON-objekt (dvs. hvor konvergensen mellem det angivne objekt og dataene ikke er tom). Den udnytter operatoren <code>$geometry<\/code> til at angive GeoJSON-objektet.<\/p>\n<p>For at n\u00e6vne GeoJSON multipolygoner eller polygoner gennem standard koordinatreferencesystemet (CRS) kan du bruge f\u00f8lgende syntaks:<\/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>F\u00f8lgende eksempel bruger <code>$geoIntersects<\/code> til at v\u00e6lge alle de lok-data, der sk\u00e6rer polygonen, som beskrives af koordinatarrayet:<\/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>Operatoren <code>$center<\/code> n\u00e6vner en cirkel for en <code>$geoWithin<\/code> foresp\u00f8rgsel, der returnerer de koordinatpar, der ligger inden for cirklens gr\u00e6nser.<\/p>\n<p><code>$center<\/code> returnerer ikke GeoJSON-objekter. For at udnytte operatoren <code>$center<\/code> skal du angive et array, der indeholder:<\/p>\n<ol>\n<li>Cirklens radius, m\u00e5lt i de enheder, der anvendes af koordinatsystemet.<\/li>\n<li>Gitterkoordinaterne for cirklens midtpunkt.<\/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>I eksemplet nedenfor returneres alle de dokumenter, hvis koordinater kan findes inden for cirklen centreret p\u00e5 [2,3] og med en radius p\u00e5 40:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } }\n)<\/code><\/pre>\n<h3>Fremskrivningsoperatorer<\/h3>\n<p>Du kan bruge projektionsoperatorer til at n\u00e6vne de felter, der returneres af en operation. MongoDB-projektionsoperatorer g\u00f8r det muligt at bruge <code>find()<\/code> -funktionen med datafiltreringsargumenter. Dette hj\u00e6lper brugerne med kun at udtr\u00e6kke de n\u00f8dvendige datafelter fra et dokument. S\u00e5 det giver dig mulighed for at projicere gennemsigtige og pr\u00e6cise data uden at p\u00e5virke den samlede databaseydelse.<\/p>\n<h4>$elemMatch (projektion)<\/h4>\n<p>Operatoren <code>$elemMatch<\/code> er ansvarlig for at begr\u00e6nse indholdet af et felt fra foresp\u00f8rgselsresultaterne til kun at indeholde det f\u00f8rste element, der matcher <code>$elemMatch<\/code> betingelsen.<\/p>\n<p>Her er et par ting, du skal v\u00e6re opm\u00e6rksom p\u00e5, f\u00f8r du bruger <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>Fra MongoDB 4.4 returnerer <code>$elemMatch<\/code> -projektionen af et eksisterende felt, uanset r\u00e6kkef\u00f8lgen af felterne i dokumentet, feltet efter inddragelse af andre eksisterende felter.<\/li>\n<li>B\u00e5de operatorerne <code>$elemMatch<\/code> og <code>$<\/code> viser det f\u00f8rste matchende element fra et array baseret p\u00e5 en specificeret betingelse. Operatoren <code>$<\/code> projicerer det f\u00f8rste matchende array-element fra hvert dokument i en samling p\u00e5 grundlag af en betingelse fra foresp\u00f8rgselsmeddelelsen, hvorimod operatoren <code>$elemMatch<\/code> projektion tager et eksplicit betingelsesargument. Dette giver dig mulighed for at projicere p\u00e5 grundlag af en betingelse, der ikke findes i foresp\u00f8rgslen, eller hvis du har brug for at projicere p\u00e5 grundlag af forskellige felter i arrayets indlejrede dokumenter.<\/li>\n<\/ul>\n<p>Du b\u00f8r ogs\u00e5 v\u00e6re opm\u00e6rksom p\u00e5 f\u00f8lgende begr\u00e6nsninger, f\u00f8r du bruger operatoren <code>$elemMatch<\/code> p\u00e5 dine data:<\/p>\n<ul>\n<li>Du kan ikke n\u00e6vne et <code>$text<\/code> foresp\u00f8rgselsudtryk i en <code>$elemMatch<\/code> operator.<\/li>\n<li><code>db.collection.find()<\/code> operationer p\u00e5 visninger underst\u00f8tter ikke <code>$elemMatch<\/code> projektionsoperatoren.<\/li>\n<\/ul>\n<p>Det f\u00f8lgende eksempel p\u00e5 <code>$elemMatch<\/code> projektionsoperatoren foruds\u00e6tter en samling <code>schools<\/code> med f\u00f8lgende dokumenter:<\/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>I dette tilf\u00e6lde s\u00f8ger operationen <code>find()<\/code> efter alle dokumenter, hvor v\u00e6rdien af postnummerfeltet er 63110. Projektionen <code>$elemMatch<\/code> ville kun returnere det f\u00f8rste matchende element i arrayet <code>students<\/code>, hvor feltet <code>school<\/code> har v\u00e6rdien 103:<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>S\u00e5dan vil resultatet se ud:<\/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 (projektion)<\/h4>\n<p>Operatoren <code>$slice<\/code> projection kan bruges til at angive antallet af elementer i et array, der skal returneres i foresp\u00f8rgselsresultatet:<\/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>Det kan ogs\u00e5 udtrykkes p\u00e5 denne m\u00e5de:<\/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>For at demonstrere det samme kan du oprette en eksempelsamling af tweets med f\u00f8lgende dokumenter:<\/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>F\u00f8lgende operation ville bruge <code>$slice<\/code> projektionsoperatoren p\u00e5 tweets-arrayet til at returnere arrayet med de to f\u00f8rste elementer. Hvis et array indeholder mindre end to elementer, returneres alle elementer i arrayet:<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Denne operation ville returnere f\u00f8lgende dokumenter:<\/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>$ (fremskrivning)<\/h4>\n<p>Operatoren <code>$<\/code> begr\u00e6nser indholdet af et array til at returnere det f\u00f8rste element, der svarer til foresp\u00f8rgselsbetingelsen for arrayet. Du kan bruge <code>$<\/code> i projektionsdokumentet i <code>find()<\/code> -metoden eller <code>findOne()<\/code> -metoden, n\u00e5r du kun har brug for et bestemt array-element i de valgte dokumenter.<\/p>\n<p>S\u00e5dan ser syntaksen for operatoren <code>$<\/code> ud:<\/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>I dette eksempel best\u00e5r <code>students<\/code> -samlingen af f\u00f8lgende dokumenter:<\/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>I den f\u00f8lgende foresp\u00f8rgsel returnerer projektionen <code>{ \"grades.$\": 1 }<\/code> kun det f\u00f8rste element, der er st\u00f8rre end eller lig med 89 for feltet <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>Denne operation returnerer f\u00f8lgende dokumenter:<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Evaluering Operatorer<\/h3>\n<p>Du kan bruge MongoDB-evalueringsoperatorer til at vurdere den overordnede datastruktur eller det enkelte felt i et dokument.<\/p>\n<p>Lad os se p\u00e5 nogle almindelige MongoDB-evalueringsoperatorer.<\/p>\n<h4>$mod<\/h4>\n<p>Du kan bruge denne operat\u00f8r til at matche dokumenter, hvor et specificeret felts v\u00e6rdi er lig med resten efter at v\u00e6re blevet divideret med en specificeret v\u00e6rdi:<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>Lad os sige, at du har en tabel med biler, der tilh\u00f8rer forskellige m\u00e6rker, som du ejer i dit showroom. F\u00f8lgende foresp\u00f8rgsel ville give dig alle bilm\u00e6rker, hvis lagernumre er multipla af 250.<\/p>\n<pre><code class=\"language-php\">db.cars.find ( { qty: { $mod: [ 250,0 ] } } )<\/code><\/pre>\n<h4>$jsonSchema<\/h4>\n<p>Med <code>$jsonSchema<\/code> kan du matche de dokumenter, der passer til det angivne JSON-skema. MongoDB&#8217;s implementering af JSON-skemaet omfatter tilf\u00f8jelsen af n\u00f8gleordet <code>bsonType<\/code>, som lader dig bruge alle BSON-typer inden for operatoren <code>$jsonSchema<\/code>.<\/p>\n<p><code>bsonType<\/code> kan acceptere de samme strengaliaser, som du ville bruge til operatoren <code>type<\/code>. S\u00e5dan ville <code>$jsonSchema<\/code>&#8216;s syntaks se ud:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>Her er JSON-skemaobjektet formateret i henhold til <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">JSON-skema-standardens udkast 4<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>Her er et eksempel, der viser, hvordan <code>$jsonSchema<\/code> fungerer:<\/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>Du kan ogs\u00e5 bruge <code>$jsonSchema<\/code> i en dokumentvalidator til at h\u00e5ndh\u00e6ve det angivne skema ved opdaterings- og inds\u00e6ttelsesoperationer:<\/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>Husk p\u00e5, at der er flere ting, der ikke underst\u00f8ttes af operatoren <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>Den hele taltype. Du skal udnytte BSON-typen long eller int med n\u00f8gleordet bsonType.<\/li>\n<li>Ukendte n\u00f8gleord.<\/li>\n<li>Linking properties og hypermedia i JSON-skemaet sammen med brugen af JSON-referencer og JSON-pointere.<\/li>\n<\/ol>\n<h4>$text<\/h4>\n<p>Operatoren <code>$text<\/code> ville s\u00f8ge efter en tekst i indholdet af det angivne felt, indekseret med et tekstindeks:<\/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>I dette tilf\u00e6lde vil f\u00f8lgende kodestykke gennemg\u00e5 tabellen for at filtrere alle biler, der indeholder teksten &#8220;Porsche&#8221;, fra:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>Operatoren <code>$regex<\/code> giver mulighed for at anvende regul\u00e6re udtryk til at matche m\u00f8nsterstrenge i foresp\u00f8rgsler. MongoDB anvender regul\u00e6re udtryk, der er kompatible med Perl:<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>F\u00f8lgende eksempel ville hj\u00e6lpe med at filtrere alle biler, der indeholder strengen &#8220;$78900&#8221;, fra:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>Operatoren <code>$expr<\/code> giver dig mulighed for at udnytte aggregeringsudtryk i foresp\u00f8rgselssproget:<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Du kan ogs\u00e5 bruge <code>$expr<\/code> til at opbygge foresp\u00f8rgselsudtryk, der sammenligner felter fra det samme dokument i et <code>$match<\/code> trin. Hvis <code>$match<\/code> -stadiet tilf\u00e6ldigvis er en del af et <code>$lookup<\/code> -stadium, kan <code>$expr<\/code> sammenligne felter ved hj\u00e6lp af let-variabler.<\/p>\n<h4>$where<\/h4>\n<p>Du kan udnytte operatoren <code>$where<\/code> til enten at sende en string, der indeholder en fuld JavaScript-funktion eller et JavaScript-udtryk, til foresp\u00f8rgselssystemet. Operatoren <code>$where<\/code> giver st\u00f8rre fleksibilitet, men kr\u00e6ver, at databasen behandler JavaScript-funktionen eller -udtrykket for hvert dokument i samlingen. Du kan henvise til dette dokument i JavaScript-funktionen eller -udtrykket ved at bruge enten <code>obj<\/code> eller <code>this<\/code>.<\/p>\n<p>Her er et eksempel p\u00e5 syntaksen:<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>Der er nogle f\u00e5 vigtige overvejelser, som du skal huske p\u00e5, f\u00f8r vi dykker ned i et eksempel, mens du bruger operatoren <code>$where<\/code>:<\/p>\n<ul>\n<li>Du b\u00f8r kun bruge foresp\u00f8rgselsoperatoren <code>$where<\/code> til dokumenter p\u00e5 \u00f8verste niveau. Operatoren <code>$where<\/code> query operator vil ikke fungere i et indlejret dokument, som i en <code>$elemMatch<\/code> query.<\/li>\n<li>Generelt b\u00f8r du kun bruge <code>$where<\/code>, n\u00e5r du ikke kan udtrykke din foresp\u00f8rgsel via en anden operator. Hvis du er n\u00f8dt til at bruge <code>$where<\/code>, skal du s\u00f8rge for at inkludere mindst \u00e9n anden standard foresp\u00f8rgselsoperator til at filtrere resultatm\u00e6ngden. Hvis du bruger <code>$where<\/code> uafh\u00e6ngigt, skal du foretage en samlingsscanning for at kunne udf\u00f8re den korrekt.<\/li>\n<\/ul>\n<p>Her er et eksempel til at illustrere dette:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Bitvise operatorer<\/h3>\n<p>Bitvise operatorer returnerer data baseret p\u00e5 bit-positionsbetingelser. Kort sagt bruges de til at matche numeriske eller bin\u00e6re v\u00e6rdier, hvor en bit fra et s\u00e6t bit-positioner har v\u00e6rdien 1 eller 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Denne operator vil matche alle dokumenter, hvor alle bitpositioner, der er angivet i foresp\u00f8rgslen, er sat (dvs. 1) i feltet:<\/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>Feltv\u00e6rdien skal enten v\u00e6re en BinData-instans eller numerisk for <code>$bitsAllSet<\/code> for at matche det aktuelle dokument.<\/p>\n<p>I det f\u00f8lgende eksempel udnytter vi en samling med f\u00f8lgende dokumenter:<\/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>Den nedenfor n\u00e6vnte foresp\u00f8rgsel vil bruge operatoren <code>$bitsAllSet<\/code> til at teste, om felt a har bits sat p\u00e5 position 1 og position 5, hvor den mindst betydningsfulde bit ville v\u00e6re p\u00e5 position 0:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } })<\/code><\/pre>\n<p>Denne foresp\u00f8rgsel vil matche f\u00f8lgende dokumenter:<\/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>Operatoren <code>$bitsAllClear<\/code> vil matche dokumenter, hvor alle de bitpositioner, der er angivet i foresp\u00f8rgslen, er clear eller <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>Vi bruger eksemplet for <code>$bitsAllSet<\/code> her for at demonstrere brugen af <code>$bitsAllClear<\/code>. F\u00f8lgende foresp\u00f8rgsel ville bruge denne operator til at kontrollere, om felt a har bitsene clearet p\u00e5 positionerne 1 og 5:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Denne foresp\u00f8rgsel ville matche f\u00f8lgende dokumenter:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }\n{ \"_id\" : 3, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }<\/code><\/pre>\n<h3>Meta-operatorer<\/h3>\n<p>Der findes forskellige foresp\u00f8rgsels-modifikatorer, som giver dig mulighed for at \u00e6ndre adf\u00e6rd eller output af en foresp\u00f8rgsel i MongoDB. Drivergr\u00e6nsefladerne kan indeholde cursormetoder, der indpakker dem til din brug.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB har for\u00e6ldet <code>$hint<\/code> siden v3.2. Men denne operat\u00f8r kan stadig v\u00e6re tilg\u00e6ngelig for MongoDB-drivere som Go, Java, Scala, Ruby, Swift osv. Den kan tvinge foresp\u00f8rgselsoptimeringen til at udnytte et specifikt indeks til at opfylde foresp\u00f8rgslen, som derefter kan n\u00e6vnes enten ved dokument eller ved indeksnavn.<\/p>\n<p>Du kan ogs\u00e5 bruge operatoren <code>$hint<\/code> til at teste indekseringsstrategier og foresp\u00f8rgselsydelse. Tag f.eks. f\u00f8lgende operation:<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Denne operation ville returnere alle dokumenter i samlingen kaldet <code>users<\/code> ved at udnytte indekset p\u00e5 feltet <code>age<\/code>.<\/p>\n<p>Du kan ogs\u00e5 n\u00e6vne et hint ved at bruge en af f\u00f8lgende former:<\/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>Hvis der findes et indeksfilter for foresp\u00f8rgselsformen, vil MongoDB simpelthen ignorere <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>Operatoren <code>$comment<\/code> giver dig mulighed for at knytte en kommentar til en foresp\u00f8rgsel i enhver sammenh\u00e6ng, som <code>$query<\/code> kan forekomme. Da kommentarer forplanter sig til profilloggen, kan tilf\u00f8jelse af en kommentar g\u00f8re det lettere at fortolke og spore din profil.<\/p>\n<p>Du kan udnytte <code>$comment<\/code> p\u00e5 en af tre m\u00e5der:<\/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>Hvis du \u00f8nsker at knytte kommentarer til foresp\u00f8rgselsudtryk i andre sammenh\u00e6nge, f.eks. med <code>db.collection.update()<\/code>, skal du bruge foresp\u00f8rgselsoperatoren <code>$comment<\/code> i stedet for metaoperatoren.<\/p>\n<h4>$max<\/h4>\n<p>Du kan n\u00e6vne en <code>$max<\/code> -v\u00e6rdi for at angive den eksklusive \u00f8vre gr\u00e6nse for et bestemt indeks for at begr\u00e6nse resultaterne af <code>find()<\/code>. Denne operat\u00f8r angiver den \u00f8vre gr\u00e6nse for alle n\u00f8gler i en bestemt r\u00e6kkef\u00f8lge i indekset.<\/p>\n<p>Mongosh giver dig f\u00f8lgende <code>max()<\/code> wrapper-metode:<\/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>Du kan ogs\u00e5 n\u00e6vne <code>$max<\/code> med f\u00f8lgende to former:<\/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>Hvis du f.eks. \u00f8nsker at angive den eksklusive \u00f8vre gr\u00e6nse, skal du huske f\u00f8lgende operationer p\u00e5 en samling ved navn collection, der indeholder et indeks <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>Denne operation begr\u00e6nser foresp\u00f8rgslen til de dokumenter, hvor feltet alder er mindre end 100, og fremtvinger en foresp\u00f8rgselsplan, der scanner <code>{ age: 1 }<\/code> -indekset fra <code>minKey<\/code> til 100.<\/p>\n<h4>$explain<\/h4>\n<p>Denne operat\u00f8r giver dig oplysninger om foresp\u00f8rgselsplanen. Den returnerer et dokument, der beskriver de indekser og processer, der anvendes til at returnere foresp\u00f8rgslen. Dette kan v\u00e6re nyttigt, n\u00e5r du fors\u00f8ger at optimere en foresp\u00f8rgsel.<\/p>\n<p>Du kan n\u00e6vne operatoren <code>$explain<\/code> i en af f\u00f8lgende former:<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>Bedste praksis for MongoDB-operatorer<\/h2>\n<p>I dette afsnit vil vi se p\u00e5 nogle af de bedste fremgangsm\u00e5der, n\u00e5r du bruger disse MongoDB-operat\u00f8rer.<\/p>\n<h3>Indlejring og henvisninger<\/h3>\n<p>Indlejring er en naturlig forl\u00e6ngelse af datamodellering. Det giver dig mulighed for at undg\u00e5 applikation-joins, hvilket kan reducere opdateringer og foresp\u00f8rgsler.<\/p>\n<p>Du kan indlejre data med et 1:1-forhold i et enkelt dokument. N\u00e5r det er sagt, kan data med et mange:1-forhold, hvor &#8220;mange&#8221; objekter vises sammen med deres overordnede dokumenter, ogs\u00e5 v\u00e6re gode kandidater.<\/p>\n<p>Lagring af disse typer data i samme dokument lyder som et klogt valg. Indlejring giver imidlertid en bedre ydeevne for l\u00e6seoperationer med denne form for datalokalitet.<\/p>\n<p>Indlejrede datamodeller kan ogs\u00e5 hj\u00e6lpe udviklere med at opdatere tilknyttede data i en enkelt skriveoperation. Dette fungerer, fordi skrivninger af enkeltdokumenter er transaktionsbaserede.<\/p>\n<p>Du b\u00f8r overveje at bruge referencer i f\u00f8lgende scenarier:<\/p>\n<ul>\n<li>N\u00e5r du opdaterer et dokumentsegment, og det bliver l\u00e6ngere og l\u00e6ngere, mens resten af dokumentet er statisk.<\/li>\n<li>N\u00e5r der er adgang til et dokument, men det indeholder data, der sj\u00e6ldent bruges. Indlejring ville kun \u00f8ge kravene til hukommelsen, s\u00e5 det giver mere mening at henvise til referencer.<\/li>\n<li>N\u00e5r dokumentst\u00f8rrelsen g\u00e5r over MongoDB&#8217;s dokumentgr\u00e6nse p\u00e5 16 MB. Dette kan ske ved modellering af mange:1-relationer (f.eks. <em>medarbejdere:afdeling<\/em>).<\/li>\n<\/ul>\n<h3>Unders\u00f8g profilering og foresp\u00f8rgselsm\u00f8nstre<\/h3>\n<p>For de fleste udviklere er det f\u00f8rste skridt i <a href=\"https:\/\/kinsta.com\/dk\/blog\/ydeevne-testvaerktoejer\/\">optimering af ydeevnen<\/a> at forst\u00e5 de faktiske og forventede foresp\u00f8rgselsm\u00f8nstre. N\u00e5r du kender programmets foresp\u00f8rgselsm\u00f8nstre godt nok, kan du lave din datamodel og v\u00e6lge et passende indeks.<\/p>\n<p>MongoDB-udviklere har adgang til forskellige kraftfulde v\u00e6rkt\u00f8jer, der lader dem forbedre ydeevnen. Men det betyder ikke, at foresp\u00f8rgselsprofiler- og m\u00f8nstre kan ignoreres.<\/p>\n<p>En nem m\u00e5de at \u00f8ge ydeevnen p\u00e5 er f.eks. ved at analysere dine foresp\u00f8rgselsm\u00f8nstre og forst\u00e5, hvor du kan indlejre data. Andre m\u00e5der at forbedre MongoDB-ydelsen p\u00e5 efter at have identificeret dine vigtigste foresp\u00f8rgselsm\u00f8nstre er bl.a:<\/p>\n<ul>\n<li>S\u00f8rg for, at du har indeks p\u00e5 alle felter, du foresp\u00f8rger mod.<\/li>\n<li>Lagring af resultaterne af hyppige underafsp\u00f8rgsler p\u00e5 dokumenter for at reducere l\u00e6sebelastningen.<\/li>\n<li>Tag et kig p\u00e5 dine logfiler for at se p\u00e5 langsomme foresp\u00f8rgsler, og tjek derefter dine indekser.<\/li>\n<\/ul>\n<h3>Gennemg\u00e5 dataindeksering og modellering<\/h3>\n<p>Mens du laver din datamodel, skal du beslutte, hvordan du skal modellere relationer mellem data. At v\u00e6lge, hvorn\u00e5r et dokument skal indlejres i stedet for at oprette en reference p\u00e5 tv\u00e6rs af separate dokumenter i forskellige samlinger, er f.eks. et eksempel p\u00e5 applikationsspecifikke overvejelser.<\/p>\n<p>En stor fordel ved JSON-dokumenter er, at de giver udviklere mulighed for at modellere data ud fra applikationens krav. Ved at indlejre underdokumenter og arrays kan du modellere komplekse relationer mellem data ved at udnytte simple tekstdokumenter.<\/p>\n<p>Du kan ogs\u00e5 bruge MongoDB til at modellere f\u00f8lgende:<\/p>\n<ul>\n<li>Geospatiale data<\/li>\n<li>Tabul\u00e6re, flade og kolonneformede strukturer<\/li>\n<li>Simple n\u00f8gle-v\u00e6rdipar<\/li>\n<li>Tidsseriedata<\/li>\n<li>Kanter og knuder i forbundne grafdatastrukturer og lignende<\/li>\n<\/ul>\n<h3>Overv\u00e5g Sharding og replikering<\/h3>\n<p>Replikering kan v\u00e6re afg\u00f8rende for at forbedre ydeevnen, da det \u00f8ger datatilg\u00e6ngeligheden gennem horisontal skalering. Replikering kan f\u00f8re til bedre ydeevne og st\u00f8rre sikkerhed gennem redundans.<\/p>\n<p>Overv\u00e5gning af ydelsen kan v\u00e6re besv\u00e6rlig og kr\u00e6ve ekstra ressourcer og tid for at sikre en problemfri funktion. Du kan udnytte de v\u00e6rkt\u00f8jer til overv\u00e5gning af ydeevne, der findes p\u00e5 markedet, og som opfylder dine specifikke behov.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/dk\/apm-tool\/\">Kinsta APM<\/a> kan f.eks. indsamle tidsstemplede oplysninger om dit WordPress-websteds MySQL-databaseforesp\u00f8rgsler, PHP-processer, eksterne HTTP-call og meget mere. Du kan ogs\u00e5 bruge dette gratis v\u00e6rkt\u00f8j til fejlfinding:<\/p>\n<ul>\n<li>Lange API-call<\/li>\n<li>Lange eksterne URL-foresp\u00f8rgsler<\/li>\n<li>Langsomme databaseforesp\u00f8rgsler for blot at n\u00e6vne nogle f\u00e5.<\/li>\n<\/ul>\n<p>I MongoDB kan replikering opn\u00e5s gennem replikas\u00e6t, der giver udviklere mulighed for at kopiere data fra en prim\u00e6r knude eller server p\u00e5 tv\u00e6rs af flere sekund\u00e6re knudepunkter. Dette g\u00f8r det muligt for din replikering at k\u00f8re nogle foresp\u00f8rgsler p\u00e5 sekund\u00e6re enheder i mods\u00e6tning til den prim\u00e6re, hvilket undg\u00e5r konkurrence og f\u00f8rer til bedre belastningsudligning.<\/p>\n<p>Sharded clusters i MongoDB er en anden m\u00e5de at forbedre ydeevnen p\u00e5. I lighed med replikering kan sharding bruges til at fordele store datas\u00e6t p\u00e5 flere servere.<\/p>\n<p>Ved at udnytte en shard key kan udviklere kopiere shards eller datastykker p\u00e5 tv\u00e6rs af flere servere. Disse servere kan arbejde sammen om at bruge alle dataene.<\/p>\n<p>Sharding har sin del af fordele, herunder horisontal skalering for skrivning\/l\u00e6sning, h\u00f8jere tilg\u00e6ngelighed og \u00f8get lagerkapacitet.<\/p>\n<h3>Bestem hukommelsesforbrug<\/h3>\n<p>MongoDB fungerer bedst, n\u00e5r et programs arbejdss\u00e6t (dvs. data og indekser, der ofte tilg\u00e5s) passer uden problemer i hukommelsen. Mens andre faktorer er afg\u00f8rende for ydeevnen, er RAM-st\u00f8rrelsen den vigtigste for instansdimensionering.<\/p>\n<p>N\u00e5r en applikations arbejdss\u00e6t passer i RAM, skal l\u00e6seaktiviteten fra disken v\u00e6re lav. Men hvis dit arbejdss\u00e6t overstiger instansserverens RAM eller st\u00f8rrelse, vil l\u00e6seaktiviteten begynde at skyde i vejret.<\/p>\n<p>Hvis du ser dette ske, kan du m\u00e5ske l\u00f8se problemet ved at flytte over til en st\u00f8rre instans, der har mere hukommelse.<\/p>\n<h3>Plac\u00e9r felter med flere v\u00e6rdier i slutningen<\/h3>\n<p>Hvis du indekserer et par felter, og et af de felter, du vil sp\u00f8rge om, bruger en af disse &#8220;multi-value&#8221;-operatorer, b\u00f8r du placere dem i slutningen af indekset. Du skal ordne indekset s\u00e5ledes, at de felter, hvor der sp\u00f8rges efter n\u00f8jagtige v\u00e6rdier, kommer f\u00f8rst, og at &#8220;multi-value&#8221;-operatorerne vises sidst i indekset.<\/p>\n<p>En undtagelse herfra er sortering i forhold til felterne. Placer disse mellem &#8220;multi-v\u00e6rdi&#8221;-felterne og de n\u00f8jagtige felter for at reducere den n\u00f8dvendige sortering i hukommelsen.<\/p>\n<h2>Oversigt<\/h2>\n<p>For MongoDB er hastighed det vigtigste. For at returnere foresp\u00f8rgsler hurtigt udnytter MongoDB operatorer til at udf\u00f8re matematiske eller logiske opgaver. Forst\u00e5else af MongoDB-operatorer er simpelthen n\u00f8glen til at mestre MongoDB.<\/p>\n\n<p>Denne artikel fremh\u00e6vede nogle af de vigtigste MongoDB-operatorer, som du kan bruge p\u00e5 dine data, s\u00e5som sammenligningsoperat\u00f8rer, logiske operat\u00f8rer, metaoperatorer og projektionsoperat\u00f8rer for blot at n\u00e6vne nogle f\u00e5. Den hj\u00e6lper dig ogs\u00e5 med at forst\u00e5, hvordan du kan bruge MongoDB-operatorer og de bedste fremgangsm\u00e5der, der g\u00f8r det muligt for dig at f\u00e5 det bedste ud af dem.<\/p>\n<p>Blandt alle operatorer, hvilken(n) bruger du oftest og hvorfor? Del det i kommentarerne nedenfor &#8211; vi vil gerne h\u00f8re dine tanker!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I enhver virksomhed er data dit st\u00f8rste aktiv. Ved at analysere data kan du tr\u00e6ffe beslutninger om kundetendenser og forudsigelse af adf\u00e6rd. Dette \u00f8ger virksomhedens rentabilitet &#8230;<\/p>\n","protected":false},"author":117,"featured_media":45129,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[490,182,491,291,492],"topic":[746],"class_list":["post-45128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-development","tag-mongodb","topic-web-udviklingsvaerktoejer"],"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 typer Mongodb-operatorer, som du skal kende - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.\" \/>\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\/dk\/blog\/mongodb-operatorer\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 typer Mongodb-operatorer, som du skal kende\" \/>\n<meta property=\"og:description\" content=\"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:33:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-24T10:32:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/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=\"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 typer Mongodb-operatorer, som du skal kende\",\"datePublished\":\"2022-09-19T08:33:28+00:00\",\"dateModified\":\"2023-08-24T10:32:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\"},\"wordCount\":5557,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"development\",\"MongoDB\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\",\"name\":\"9 typer Mongodb-operatorer, som du skal kende - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg\",\"datePublished\":\"2022-09-19T08:33:28+00:00\",\"dateModified\":\"2023-08-24T10:32:14+00:00\",\"description\":\"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webudviklingsv\u00e6rkt\u00f8jer\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/web-udviklingsvaerktoejer\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"9 typer Mongodb-operatorer, som du skal kende\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"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\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 typer Mongodb-operatorer, som du skal kende - Kinsta\u00ae","description":"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.","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\/dk\/blog\/mongodb-operatorer\/","og_locale":"da_DK","og_type":"article","og_title":"9 typer Mongodb-operatorer, som du skal kende","og_description":"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.","og_url":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-09-19T08:33:28+00:00","article_modified_time":"2023-08-24T10:32:14+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Salman Ravoof","Estimeret l\u00e6setid":"34 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 typer Mongodb-operatorer, som du skal kende","datePublished":"2022-09-19T08:33:28+00:00","dateModified":"2023-08-24T10:32:14+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/"},"wordCount":5557,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","keywords":["datab","database","databases","development","MongoDB"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/","url":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/","name":"9 typer Mongodb-operatorer, som du skal kende - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","datePublished":"2022-09-19T08:33:28+00:00","dateModified":"2023-08-24T10:32:14+00:00","description":"Denne artikel fremh\u00e6ver nogle af de vigtigste MongoDB operators, der kan hj\u00e6lpe dig med at forbedre ydeevnen, og hvordan du bruger dem.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/09\/mongodb-operators.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/mongodb-operatorer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"Webudviklingsv\u00e6rkt\u00f8jer","item":"https:\/\/kinsta.com\/dk\/emner\/web-udviklingsvaerktoejer\/"},{"@type":"ListItem","position":3,"name":"9 typer Mongodb-operatorer, som du skal kende"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","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\/dk\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/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\/dk\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=45128"}],"version-history":[{"count":11,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45128\/revisions"}],"predecessor-version":[{"id":49980,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/45128\/revisions\/49980"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/45128\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/45129"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=45128"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=45128"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=45128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}