{"id":45696,"date":"2022-09-19T08:39:12","date_gmt":"2022-09-19T08:39:12","guid":{"rendered":"https:\/\/kinsta.com\/se\/?p=45696&#038;preview=true&#038;preview_id=45696"},"modified":"2023-04-14T13:06:39","modified_gmt":"2023-04-14T13:06:39","slug":"mongodb-operatorer","status":"publish","type":"post","link":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/","title":{"rendered":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till"},"content":{"rendered":"<p>I alla f\u00f6retag s\u00e5 \u00e4r data den st\u00f6rsta tillg\u00e5ngen. Genom att analysera data s\u00e5 kan du exempelvis fatta beslut om kundtrender och beteendef\u00f6ruts\u00e4gelser. Som ett resultat s\u00e5 \u00f6kar f\u00f6retagets l\u00f6nsamhet och effektivt beslutsfattande.<\/p>\n<p>Utan <a href=\"https:\/\/kinsta.com\/blog\/open-source-database\/\">databasprogramvara<\/a>\u00a0s\u00e5 skulle en enkel uppgift som att hitta genomsnittet av alla v\u00e4rden i ett system fullt av poster vara tr\u00e5kig. Lyckligtvis s\u00e5 har databaser gjort analysen av data enklare och snabbare med hj\u00e4lp av funktioner och operat\u00f6rer.<\/p>\n\n<p>Den h\u00e4r artikeln kommer att kasta lite ljus \u00f6ver de operat\u00f6rer som anv\u00e4nds i databasprogramvaran 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>Vad \u00e4r MongoDB-operat\u00e4rer?<\/h2>\n<p><a href=\"https:\/\/kinsta.com\/blog\/what-is-mongodb\/\">MongoDB<\/a> \u00e4r en NoSQL-databasprogramvara som hanterar dokumentorienterad information.<\/p>\n<p>En av MongoDB\u2019s viktigaste egenskaper \u00e4r exempelvis dess snabbhet. F\u00f6r att returnera beg\u00e4randen snabbare s\u00e5 kan MongoDB exempelvis anv\u00e4nda operat\u00f6rer f\u00f6r att utf\u00f6ra specifika funktioner.<\/p>\n<p>Operatorer \u00e4r speciella symboler som hj\u00e4lper kompilatorer att utf\u00f6ra matematiska eller logiska uppgifter. MongoDB erbjuder flera typer av operat\u00f6rer f\u00f6r att interagera med databasen.<\/p>\n<h2>MongoDB\u2019s operat\u00f6rstyper<\/h2>\n<p>Det finns nio typer av operat\u00f6rer, var och en ben\u00e4mnd efter sin funktion. Logiska operat\u00f6rer anv\u00e4nder exempelvis logiska operationer. F\u00f6r att utf\u00f6ra dem s\u00e5 m\u00e5ste du anv\u00e4nda ett specifikt nyckelord och f\u00f6lja syntaxen. De \u00e4r dock ganska l\u00e4tta att f\u00f6lja!<\/p>\n<p>I slutet av artikeln s\u00e5 kommer du att k\u00e4nna till grunderna f\u00f6r varje operat\u00f6r och dess funktioner.<\/p>\n<h3>Logiska operat\u00f6rer<\/h3>\n<p>Logiska operat\u00f6rer anv\u00e4nds ofta f\u00f6r att filtrera data utifr\u00e5n givna villkor. Som ett resultat av dessa s\u00e5 blir det \u00e4ven m\u00f6jligt att utv\u00e4rdera m\u00e5nga villkor, vilket vi kommer att diskutera n\u00e4rmare.<\/p>\n<p>Nedan s\u00e5 f\u00f6ljer n\u00e5gra logiska operat\u00f6rer som du kan anv\u00e4nda:<\/p>\n<h4>$and<\/h4>\n<p>Ett &#8221;and&#8221;-villkor utf\u00f6r en logisk &#8221;and&#8221;-operation p\u00e5 en matris med tv\u00e5 eller flera uttryck. Det v\u00e4ljer de dokument d\u00e4r <em>alla<\/em> villkor i uttrycken \u00e4r uppfyllda.<\/p>\n<p>Detta \u00e4r standardsyntaxen f\u00f6r uttrycket <code>$and<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $and: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] } <\/code> Om vi exempelvis vill v\u00e4lja dokument d\u00e4r priset \u00e4r 10 dollar och kvantiteten \u00e4r mindre \u00e4n 15 s\u00e5 kan vi ange f\u00f6ljande fr\u00e5ga:<\/pre>\n<pre><code class=\"language-php\">db.inventory.find( { $and: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<h4>$or<\/h4>\n<p>Ett &#8221;or&#8221;-villkor utf\u00f6r en logisk &#8221;or&#8221;-operation p\u00e5 en matris med tv\u00e5 eller flera uttryck. Det v\u00e4ljer de dokument d\u00e4r minst ett av uttrycken \u00e4r sant.<\/p>\n<p>Detta \u00e4r standardsyntaxen f\u00f6r uttrycket <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Om vi exempelvis vill v\u00e4lja dokument d\u00e4r priset \u00e4r 10 dollar eller kvantiteten \u00e4r mindre \u00e4n 15 s\u00e5 kan vi ange f\u00f6ljande fr\u00e5ga:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>Vi beh\u00f6ver inte begr\u00e4nsa uttrycket till tv\u00e5 kriterier &#8211; vi kan l\u00e4gga till fler. Med nedanst\u00e5ende fr\u00e5ga s\u00e5 v\u00e4ljs exempelvis de dokument d\u00e4r priset \u00e4r 10 dollar, kvantiteten \u00e4r mindre \u00e4n 15 eller taggen \u00e4r station\u00e4r:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>N\u00e4r dessa klausuler k\u00f6rs s\u00e5 utf\u00f6r MongoDB antingen en samlingsskanning eller en indexskanning. Om alla index har st\u00f6d f\u00f6r klausulerna s\u00e5 anv\u00e4nder MongoDB index f\u00f6r att kontrollera ett <code>$or<\/code> -uttryck. I annat fall s\u00e5 anv\u00e4nds ist\u00e4llet en samlingsavl\u00e4sning.<\/p>\n<p>Men om du vill testa kriterierna i samma f\u00e4lt s\u00e5 b\u00f6r du kanske anv\u00e4nda operat\u00f6ren <code>$in<\/code> i st\u00e4llet f\u00f6r <code>$or<\/code>. Om du exempelvis vill ha en samling dokument d\u00e4r kvantiteten \u00e4r antingen 10 eller 20 s\u00e5 kan du beh\u00f6va k\u00f6ra nedanst\u00e5ende <code>$in<\/code>-fr\u00e5ga ist\u00e4llet:<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>Vi kommer att behandla <code>$in<\/code>-operat\u00f6ren n\u00e4rmare senare.<\/p>\n<h4>$nor<\/h4>\n<p>Den h\u00e4r operat\u00f6ren utf\u00f6r en logisk &#8221;nor&#8221;-operation p\u00e5 en matris med hj\u00e4lp av ett eller flera uttryck. D\u00e4refter s\u00e5 v\u00e4ljer den de dokument som inte uppfyller beg\u00e4rande-uttrycken. F\u00f6renklat s\u00e5 kan man s\u00e4ga att den g\u00f6r motsatsen till villkoret <code>$or<\/code>.<\/p>\n<p>Detta \u00e4r den allm\u00e4nna syntaxen:<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>L\u00e5t oss betrakta f\u00f6ljande fr\u00e5ga:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Denna fr\u00e5ga v\u00e4ljer exempelvis de dokument som inkluderar:<\/p>\n<ul>\n<li>ett v\u00e4rde i prisf\u00e4ltet som inte \u00e4r lika med 3,99 dollar och ett f\u00f6rs\u00e4ljningsv\u00e4rde som inte \u00e4r lika med sant, eller<\/li>\n<li>ett v\u00e4rde i prisf\u00e4ltet som inte \u00e4r lika med 3,99 dollar och ett tomt eller obefintligt f\u00f6rs\u00e4ljningsf\u00e4lt, eller<\/li>\n<li>inget prisf\u00e4lt och ett f\u00f6rs\u00e4ljningsf\u00e4lt som inte \u00e4r sant, eller<\/li>\n<li>varken prisf\u00e4ltet eller f\u00f6rs\u00e4ljningsf\u00e4ltet har fyllts i eller \u00e4r n\u00e4rvarande.<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Operat\u00f6ren utf\u00f6r en logisk &#8221;not&#8221;-operation p\u00e5 en matris f\u00f6r det angivna uttrycket. Den v\u00e4ljer sedan de dokument som inte matchar fr\u00e5geuttrycken. Detta inkluderar de dokument som inte inkluderar f\u00e4ltet.<\/p>\n<p>Detta \u00e4r den allm\u00e4nna syntaxen:<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Ta exempelvis f\u00f6ljande fr\u00e5ga:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Denna fr\u00e5ga skulle v\u00e4lja ut de dokument som inneh\u00e5ller:<\/p>\n<ul>\n<li>ett prisf\u00e4lt vars v\u00e4rde \u00e4r st\u00f6rre \u00e4n eller lika med 3,99 dollar, och<\/li>\n<li>ett prisf\u00e4lt som inte \u00e4r ifyllt eller som inte finns.<\/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> skiljer sig fr\u00e5n operat\u00f6ren <code>$gte<\/code>. <code>{ $gte: 3.99 }<\/code> och returnerar endast de dokument d\u00e4r prisf\u00e4ltet finns och d\u00e4r dess v\u00e4rde \u00e4r st\u00f6rre \u00e4n eller lika med 3,99 dollar (operat\u00f6ren<code> $not<\/code> returnerar \u00e4ven de dokument d\u00e4r prisf\u00e4ltet inte finns).<\/p>\n<\/aside>\n\n<h3>J\u00e4mf\u00f6relseoperatorer<\/h3>\n<p>J\u00e4mf\u00f6relseoperatorer kan exempelvis anv\u00e4ndas f\u00f6r att j\u00e4mf\u00f6ra v\u00e4rden i ett eller flera dokument.<\/p>\n<p>Nedan s\u00e5 finns ett kodprov p\u00e5 en enkel inventariesamling f\u00f6r en stormarknad:<\/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 kommer fram\u00f6ver att anv\u00e4nda det h\u00e4r exemplet medan vi beskriver varje j\u00e4mf\u00f6relseoperat\u00f6r i detalj.<\/p>\n<h4>Lika med ($eq)<\/h4>\n<p>Den h\u00e4r operat\u00f6ren matchar v\u00e4rden som \u00e4r lika med det givna v\u00e4rdet:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Om vi exempelvis vill h\u00e4mta ett specifikt dokument fr\u00e5n inventariesamlingen som har det exakta kvantitetsv\u00e4rdet &#8221;20&#8221;, s\u00e5 skulle vi ange f\u00f6ljande kommando:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>Fr\u00e5gan skulle ge f\u00f6ljande resultat:<\/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\u00f6rre \u00e4n ($gt)<\/h4>\n<p>Operat\u00f6ren matchar om v\u00e4rdena \u00e4r st\u00f6rre \u00e4n det angivna v\u00e4rdet:<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>I det h\u00e4r exemplet s\u00e5 h\u00e4mtar vi de dokument d\u00e4r kvantiteten \u00e4r st\u00f6rre \u00e4n 15:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>Beg\u00e4randet skulle ge f\u00f6ljande:<\/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 \u00e4n ($lt)<\/h4>\n<p>Operat\u00f6ren matchar om v\u00e4rdena \u00e4r mindre \u00e4n det angivna v\u00e4rdet:<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Vi letar efter de dokument som \u00e4r mindre \u00e4n 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>Beg\u00e4randet skulle ge f\u00f6ljande resultat:<\/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\u00f6rre \u00e4n eller lika med ($gte)<\/h4>\n<p>Operat\u00f6ren matchar n\u00e4r v\u00e4rdena \u00e4r st\u00f6rre \u00e4n eller lika med det angivna v\u00e4rdet:<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>I det h\u00e4r exemplet s\u00e5 h\u00e4mtar vi de dokument d\u00e4r kvantiteten \u00e4r st\u00f6rre \u00e4n eller lika med 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Denna fr\u00e5ga skulle ge f\u00f6ljande:<\/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 \u00e4n eller lika med ($lte)<\/h4>\n<p>Operat\u00f6ren matchar endast om v\u00e4rdena \u00e4r mindre \u00e4n eller lika med det angivna v\u00e4rdet:<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Vi letar efter dokumenten med en kvantitet som \u00e4r mindre \u00e4n eller lika med 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Vi kan f\u00f6rv\u00e4nta oss att denna fr\u00e5ga returnerar f\u00f6ljande:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>In ($in)<\/h4>\n<p>Operat\u00f6ren returnerar de dokument som matchar de angivna v\u00e4rdena:<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>V\u00e4rdet f\u00f6r ett f\u00e4lt \u00e4r lika med alla v\u00e4rden i den angivna matrisen. Om du exempelvis vill h\u00e4mta dokumenten med v\u00e4rdena &#8221;30&#8221; och &#8221;15&#8221; i inventariesamlingen s\u00e5 g\u00f6r du s\u00e5 h\u00e4r:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>Utmatningen skulle vara:<\/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>Inte i ($nin)<\/h4>\n<p>Den h\u00e4r operat\u00f6ren returnerar de dokument som inte matchar de givna v\u00e4rdena. H\u00e4r \u00e4r den grundl\u00e4ggande syntaxen f\u00f6r operat\u00f6ren <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> v\u00e4ljer de dokument d\u00e4r:<\/p>\n<ul>\n<li>f\u00e4ltv\u00e4rdet inte finns i den angivna matrisen, eller<\/li>\n<li>f\u00e4ltet inte finns.<\/li>\n<\/ul>\n<p>Om f\u00e4ltet inneh\u00e5ller matriser, s\u00e5 kommer det att v\u00e4lja matriser d\u00e4r inget element som anges i v\u00e4rdeavsnittet finns. Vi vill exempelvis v\u00e4lja de dokument d\u00e4r kvantiteten inte \u00e4r lika med 20 eller 15.<\/p>\n<p>Dessutom s\u00e5 matchar den \u00e4ven dokument som inte har n\u00e5got f\u00e4lt f\u00f6r kvantitet:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>Resultatet skulle bli:<\/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>Inte lika ($ne)<\/h4>\n<p>Operat\u00f6ren <code>$ne<\/code> returnerar de dokument d\u00e4r det angivna v\u00e4rdet inte \u00e4r lika:<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Vi vill exempelvis v\u00e4lja alla dokument d\u00e4r kvantiteten inte \u00e4r lika med 20:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>Resultatet skulle bli:<\/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>I ovanst\u00e5ende utdata s\u00e5 kan vi se att fr\u00e5gan kommer att v\u00e4lja dokument som inte har ett kvantitetsf\u00e4lt.<\/p>\n<h3>Operatorer f\u00f6r element<\/h3>\n<p>Operat\u00f6rerna f\u00f6r elementfr\u00e5gor kan identifiera dokument med hj\u00e4lp av dokumentets f\u00e4lt. Elementoperat\u00f6rerna best\u00e5r av <code>$exist<\/code> och <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Den h\u00e4r operat\u00f6ren matchar exempelvis dokument som har ett angivet f\u00e4lt. Operat\u00f6ren har ett boolskt v\u00e4rde som kan vara antingen <code>true<\/code> eller <code>false<\/code>.<\/p>\n<p>Om det anses vara <code>true<\/code>\u00a0s\u00e5 matchar det de dokument som inneh\u00e5ller det f\u00e4ltet, inklusive dokument d\u00e4r f\u00e4ltv\u00e4rdet \u00e4r noll. Om &lt;boolean&gt; \u00e4r <code>false<\/code>, s\u00e5 returnerar fr\u00e5gan endast de dokument som inte inneh\u00e5ller f\u00e4ltet.<\/p>\n<p>H\u00e4r \u00e4r standardsyntaxen:<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } } )<\/code><\/pre>\n<p>L\u00e5t oss ta ett exempel d\u00e4r vi har insamlingsdata f\u00f6r en matris som heter &#8221;bagofmarbles&#8221;, d\u00e4r varje bag inneh\u00e5ller kulor av olika f\u00e4rger:<\/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>L\u00e5t oss exempelvis s\u00e4ga att vi vill ha en fr\u00e5ga som endast returnerar de bags d\u00e4r det finns r\u00f6da kulor. Detta inneb\u00e4r att vi m\u00e5ste ange det boolska v\u00e4rdet som <code>true<\/code>. L\u00e5t oss ta en titt:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>Som ett resultat s\u00e5 blir resultatet dokument som inneh\u00e5ller f\u00e4ltet &#8221;red&#8221;, \u00e4ven om v\u00e4rdet var <code>null<\/code>. Det skulle dock inte best\u00e5 av de dokument d\u00e4r f\u00e4ltet &#8221;red&#8221; inte ens existerar:<\/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>Om vi bara vill ha de bags d\u00e4r r\u00f6da kulor inte ens finns som f\u00e4lt s\u00e5 kan vi ange nedanst\u00e5ende fr\u00e5ga:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>Resultatet skulle best\u00e5 av de dokument som inte inneh\u00e5ller f\u00e4ltet &#8221;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>Denna operat\u00f6r matchar dokument enligt den angivna f\u00e4lttypen. Detta \u00e4r exempelvis anv\u00e4ndbart n\u00e4r du har mycket ostrukturerade data eller n\u00e4r datatyperna inte \u00e4r f\u00f6ruts\u00e4gbara. Dessa f\u00e4lttyper \u00e4r specificerade BSON-typer och kan definieras antingen genom typnummer eller alias.<\/p>\n<p>Detta \u00e4r den allm\u00e4nna syntaxen f\u00f6r <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>L\u00e5t oss s\u00e4ga att vi har en adressbok som inkluderar dokumenten nedan:<\/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>N\u00e4r vi tittar p\u00e5 dokumenten ovan s\u00e5 har postnumret olika datatyper. Detta inkluderar exempelvis l\u00e5nga, dubbla, heltal och str\u00e4ngv\u00e4rden.<\/p>\n<p>Om vi endast vill ha de dokument som har en viss datatyp som postnummer &#8211; l\u00e5t oss ta str\u00e4ng i det h\u00e4r fallet &#8211; m\u00e5ste vi ange f\u00f6ljande fr\u00e5ga i kompilatorn:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Detta skulle ge f\u00f6ljande dokument:<\/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>Det finns dessutom en &#8221;number&#8221;-typ som inneh\u00e5ller alla l\u00e5nga, heltal eller dubbla v\u00e4rden som en matris som inkluderar ett element av de angivna typerna:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Utmatning:<\/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>Om dokumenten har en matrisf\u00e4ltstyp s\u00e5 returnerar operat\u00f6ren <code>$type<\/code> de dokument d\u00e4r minst ett matriselement matchar den typ som har \u00f6verl\u00e4mnats till operat\u00f6ren.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Fr\u00e5n och med MongoDB 3.6 och senare s\u00e5 returnerar s\u00f6kningar efter <code>$type: \"array\"<\/code> dokument d\u00e4r f\u00e4ltet i sig \u00e4r en matris. N\u00e4r samma fr\u00e5ga anv\u00e4ndes, s\u00e5 returnerade de tidigare versionerna dock dokument d\u00e4r f\u00e4ltet var en matris och minst ett element var av datatypen array.<\/p>\n<\/aside>\n\n<h3>Array-operatorer<\/h3>\n<p>MongoDB best\u00e5r \u00e4ven av matris-operat\u00f6rer f\u00f6r att s\u00f6ka efter dokument som inneh\u00e5ller matriser.<\/p>\n<p>Det finns tre prim\u00e4ra operat\u00f6rer: <code>$all<\/code>, <code>$elemMatch<\/code> och <code>$size<\/code>. Vi kommer att diskutera var och en av dem i detalj nedan.<\/p>\n<h4>$all<\/h4>\n<p>Operat\u00f6ren <code>$all<\/code> v\u00e4ljer de dokument d\u00e4r ett f\u00e4ltv\u00e4rde \u00e4r en matris som inneh\u00e5ller de angivna elementen:<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>L\u00e5t oss exempelvis s\u00e4ga att vi har en samling dokument f\u00f6r en kl\u00e4dbutik med f\u00f6ljande under inventering.<\/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 vill h\u00e4mta alla dokument (i det h\u00e4r fallet kl\u00e4derna) fr\u00e5n inventarief\u00f6rteckningen som \u00e4r kopplade till taggarna &#8221;trendy&#8221; och &#8221;y2k&#8221;. I nedanst\u00e5ende fr\u00e5ga s\u00e5 anv\u00e4nds operat\u00f6ren <code>$all<\/code> d\u00e4r v\u00e4rdet av f\u00e4ltet tags \u00e4r en matris vars element inkluderar &#8221;y2k&#8221; och &#8221;trendy&#8221;:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>Ovanst\u00e5ende s\u00f6kning ger f\u00f6ljande resultat:<\/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>I exemplet ovan s\u00e5 ser vi \u00e4ven att operat\u00f6ren <code>$all<\/code> helt enkelt utf\u00f6r samma funktion som operationen <code>$and<\/code>.<\/p>\n<p>Alternativt s\u00e5 kan vi anv\u00e4nda nedanst\u00e5ende fr\u00e5ga som skulle ge ett liknande resultat som ovanst\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>Operat\u00f6ren <code>$elemMatch<\/code> matchar dokument som inneh\u00e5ller ett matrisf\u00e4lt med minst ett element som matchar alla angivna fr\u00e5gekriterier:<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Vi kan anv\u00e4nda j\u00e4mf\u00f6relseoperat\u00f6rer som <code>$lte<\/code> och <code>$gte<\/code>. Om vi endast anger ett enda fr\u00e5gevillkor i <code>$elemMatch<\/code>, och inte anv\u00e4nder operat\u00f6rerna <code>$not<\/code> eller <code>$ne<\/code>, s\u00e5 kan vi dock utel\u00e4mna <code>$elemMatch<\/code> eftersom den i huvudsak skulle utf\u00f6ra samma funktion.<\/p>\n<p>Det finns ytterligare n\u00e5gra saker att t\u00e4nka p\u00e5 n\u00e4r man anv\u00e4nder den h\u00e4r operat\u00f6ren:<\/p>\n<ul>\n<li>Du kan inte ange ett <code>$where<\/code>-uttryck i en <code>$elemMatch<\/code>-operation.<\/li>\n<li>Du kan inte ange ett <code>$text<\/code>-fr\u00e5geuttryck i en <code>$elemMatch<\/code>-operation.<\/li>\n<\/ul>\n<p>Vi har exempelvis f\u00f6ljande dokument i samlingen av studentresultat:<\/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\u00f6ljande fr\u00e5ga matchar endast de dokument d\u00e4r resultatmatrisen inneh\u00e5ller minst ett element som b\u00e5de \u00e4r st\u00f6rre \u00e4n eller lika med 90 och mindre \u00e4n 95:<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>V\u00e5r fr\u00e5ga returnerar f\u00f6ljande dokument, eftersom elementet 92 \u00e4r b\u00e5de st\u00f6rre \u00e4n eller lika med 90 och mindre \u00e4n 95:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>Operat\u00f6ren <code>$size<\/code> returnerar de dokument d\u00e4r matrisens storlek motsvarar det antal element som anges i argumentet:<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>H\u00e4r \u00e4r ett exempel:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Detta skulle mata ut alla dokument i den angivna samlingen d\u00e4r f\u00e4ltet \u00e4r en matris med 2 element: <code>{ field: [ orange, apple] }<\/code> och <code>{ field: [ blue, red] }<\/code>, men inte <code>{ field: blue}<\/code> eller <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Vi kan ange ett specifikt v\u00e4rde som storlek men inte ange intervall av v\u00e4rden som storlek.<\/p>\n<h3>Geospatiala operatorer<\/h3>\n<p>MongoDB g\u00f6r det exempelvis m\u00f6jligt att lagra geospatiala data i form av GeoJSON-typer. GeoJSON \u00e4r ett \u00f6ppet standardformat som bygger p\u00e5 JavaScript object notation och som kan representera geografiska egenskaper och st\u00f6dja icke-spatiala attribut. Det finns tv\u00e5 typer av geospatiala operat\u00f6rer som vi kommer att prata om i den h\u00e4r artikeln: geometrispecifikatorer och fr\u00e5geselektorer.<\/p>\n<h4>$geometri<\/h4>\n<p>Den h\u00e4r operat\u00f6ren n\u00e4mner GeoJSON-geometri f\u00f6r anv\u00e4ndning med f\u00f6ljande geospatiala fr\u00e5geoperat\u00f6rer: <code>$geoIntersects<\/code> <code>$geoWithin<\/code><code>$nearSphere<\/code> <code>$near<\/code> <code>$geometry<\/code>. Den anv\u00e4nder EPSG:4326 som standardkoordinatreferenssystem (CRS).<\/p>\n<p>Om man vill n\u00e4mna GeoJSON-objekt med standard CRS s\u00e5 kan man anv\u00e4nda f\u00f6ljande utdrag f\u00f6r <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>Vill du n\u00e4mna en GeoJSON-polygon med en enkelringad GeoJSON-polygon som har ett skr\u00e4ddarsytt MongoDB CRS? D\u00e5 kan du exempelvis anv\u00e4nda f\u00f6ljande utdrag (du kan bara anv\u00e4nda detta f\u00f6r <code>$geoWithin<\/code> och <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>Operat\u00f6ren <code>$polygon<\/code> kan anv\u00e4ndas f\u00f6r att ange en polygon f\u00f6r en geospatial <code>$geoWithin<\/code>-fr\u00e5ga p\u00e5 \u00e4ldre koordinatpar. Denna fr\u00e5ga kommer sedan att \u00e5terge de par som ligger inom polygonens gr\u00e4nser. <code> $polygon<\/code> kommer dock inte att s\u00f6ka efter n\u00e5gra GeoJSON-objekt. F\u00f6r att definiera en polygon s\u00e5 m\u00e5ste du ange en matris av koordinatpunkter enligt f\u00f6ljande:<\/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>H\u00e4r \u00e4r den sista punkten implicit kopplad till den f\u00f6rsta. Du kan n\u00e4mna s\u00e5 m\u00e5nga punkter eller sidor som du vill.<\/p>\n<p>F\u00f6ljande fr\u00e5ga ger exempelvis alla dokument vars koordinater ligger inom den polygon som definieras av [0,0], [1,5] och [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>Den h\u00e4r operat\u00f6ren kan anv\u00e4ndas f\u00f6r att v\u00e4lja dokument med geodata som helt och h\u00e5llet ing\u00e5r i en viss form. Den angivna formen kan antingen vara en GeoJSON-multipolygon, en GeoJSON-polygon (antingen flerringad eller enkelringad) eller en form som kan definieras med hj\u00e4lp av \u00e4ldre koordinatpar.<\/p>\n<p>Operat\u00f6ren <code>$geoWithin<\/code> kommer att utnyttja operat\u00f6ren <code>$geometry<\/code> f\u00f6r att n\u00e4mna GeoJSON-objektet.<\/p>\n<p>F\u00f6r att n\u00e4mna GeoJSON-multipolyjoner eller polygoner via standardkoordinat-referenssystemet (CRS) s\u00e5 kan du anv\u00e4nda syntaxen nedan:<\/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>F\u00f6r <code>$geoWithin<\/code>-beg\u00e4randen som n\u00e4mner GeoJSON-geometrier med omr\u00e5den som \u00e4r st\u00f6rre \u00e4n ett enda halvklot, skulle anv\u00e4ndningen av standard CRS leda till beg\u00e4randen om de kompletterande geometrierna.<\/p>\n<p>F\u00f6r att n\u00e4mna en GeoJSON-polygon med en enkelringad GeoJSON-polygon med ett anpassat MongoDB CRS s\u00e5 kan du anv\u00e4nda den prototyp som n\u00e4mns nedan i <code>$geometry<\/code>-uttrycket:<\/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>F\u00f6ljande exempel plockar alla lokdata som finns inom en GeoJSON-polygon, d\u00e4r polygonens area \u00e4r mindre \u00e4n arean av en enda hemisf\u00e4r:<\/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 anv\u00e4nda <code>$box<\/code> f\u00f6r att ange en rektangel f\u00f6r en geospatial <code>$geoWithin<\/code>-fr\u00e5ga f\u00f6r att tillhandah\u00e5lla dokument som ligger inom rektangelns gr\u00e4nser. Allt enligt deras punktbaserade lokaliseringsdata. N\u00e4r du anv\u00e4nder <code>$geoWithin<\/code> med <code>$box<\/code>\u00a0s\u00e5 f\u00e5r du dokument som baseras p\u00e5 fr\u00e5gekoordinater. I det h\u00e4r scenariot s\u00e5 kommer <code>$geoWithin<\/code> inte att fr\u00e5ga efter n\u00e5gra GeoJSON-former.<\/p>\n<p>F\u00f6r att utnyttja operat\u00f6ren <code>$box<\/code>\u00a0s\u00e5 m\u00e5ste du n\u00e4mna rektangelns \u00f6vre h\u00f6gra och nedre v\u00e4nstra h\u00f6rn i ett matrisobjekt:<\/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>Den ovann\u00e4mnda fr\u00e5gan kommer att ber\u00e4kna avst\u00e5ndet genom att anv\u00e4nda platt geometri. F\u00f6ljande fr\u00e5ga returnerar alla dokument som ligger inom den ruta som 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 anv\u00e4nda <code>$nearSphere<\/code> f\u00f6r att n\u00e4mna en punkt som en geospatial fr\u00e5ga returnerar dokumenten f\u00f6r fr\u00e5n n\u00e4rmast till l\u00e4ngst bort.<\/p>\n<p>MongoDB anv\u00e4nder sf\u00e4risk geometri f\u00f6r att ber\u00e4kna avst\u00e5nden f\u00f6r <code>$nearSphere<\/code>. Det beh\u00f6vs ett geospatialt index enligt f\u00f6ljande:<\/p>\n<ol>\n<li>2d-index f\u00f6r platsdata som beskrivs som \u00e4ldre koordinatpar. F\u00f6r att utnyttja ett 2d-index f\u00f6r GeoJSON-punkter s\u00e5 m\u00e5ste du generera indexet f\u00f6r koordinatf\u00e4ltet i GeoJSON-objektet.<\/li>\n<li>2dsphere-index f\u00f6r platsdata som beskrivs som GeoJSON-punkter.<\/li>\n<\/ol>\n<p>Den som vill n\u00e4mna en GeoJSON-punkt kan anv\u00e4nda f\u00f6ljande syntax:<\/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>H\u00e4r \u00e4r <code>$minDistance<\/code> och <code>$maxDistance<\/code> valfria. <code>$minDistance<\/code> kan begr\u00e4nsa resultaten till de dokument som ligger n\u00e4rmast det angivna avst\u00e5ndet fr\u00e5n centrum. Du kan anv\u00e4nda <code>$maxDistance<\/code> f\u00f6r b\u00e5da indexen.<\/p>\n<p>T\u00e4nk nu p\u00e5 en samling &#8221;platser&#8221; som best\u00e5r av dokument med ett f\u00e4lt f\u00f6r plats som har ett 2dsphere-index. F\u00f6ljande exempel skulle ge de punkter vars l\u00e4ge ligger minst 2 000 meter och h\u00f6gst 6 000 meter fr\u00e5n den punkt som du v\u00e4ljer, ordnade fr\u00e5n n\u00e4rmast till l\u00e4ngst bort:<\/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>Med operat\u00f6ren <code>$geoIntersects<\/code>\u00a0s\u00e5 kan du v\u00e4lja dokument vars geodata sk\u00e4r ett visst GeoJSON-objekt (dvs. d\u00e4r konvergensen mellan det angivna objektet och datan inte \u00e4r tom). Operat\u00f6ren <code>$geometry<\/code> anv\u00e4nds f\u00f6r att specificera GeoJSON-objektet.<\/p>\n<p>Om man vill n\u00e4mna GeoJSON multipolygoner eller polygoner genom standardkoordinat-referenssystemet (CRS) s\u00e5 kan man anv\u00e4nda f\u00f6ljande syntax:<\/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\u00f6ljande instans anv\u00e4nder <code>$geoIntersects<\/code> f\u00f6r att v\u00e4lja ut alla lokdata som sk\u00e4r polygonen som beskrivs av koordinatmatrisen:<\/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>Operat\u00f6ren <code>$center<\/code> n\u00e4mner en cirkel f\u00f6r en <code>$geoWithin<\/code>-fr\u00e5ga som returnerar de koordinatpar som ligger inom cirkelns gr\u00e4nser.<\/p>\n<p><code>$center<\/code> returnerar inte GeoJSON-objekt. F\u00f6r att utnyttja operat\u00f6ren <code>$center<\/code>\u00a0s\u00e5 m\u00e5ste du ange en matris som inneh\u00e5ller:<\/p>\n<ol>\n<li>Cirkelns radie, m\u00e4tt i de enheter som anv\u00e4nds i koordinatsystemet.<\/li>\n<li>Rutn\u00e4tskoordinaterna f\u00f6r cirkelns mittpunkt.<\/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>Exemplet nedan returnerar alla dokument som har koordinater som kan hittas inom cirkeln med centrum p\u00e5 [2,3] och med en radie 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>Projektionsoperatorer<\/h3>\n<p>Du kan anv\u00e4nda projektionsoperatorer f\u00f6r att n\u00e4mna de f\u00e4lt som returneras av en operation. MongoDB\u2019s projektionsoperat\u00f6rer g\u00f6r det m\u00f6jligt att anv\u00e4nda funktionen <code>find()<\/code> med argument f\u00f6r datafiltrering. Detta hj\u00e4lper anv\u00e4ndarna att extrahera endast de dataf\u00e4lt som kr\u00e4vs fr\u00e5n ett dokument. Som ett resultat s\u00e5 g\u00e5r det allts\u00e5 att projicera transparenta och koncisa data utan att p\u00e5verka den totala databasprestandan.<\/p>\n<h4>$elemMatch (projektion)<\/h4>\n<p>Operat\u00f6ren <code>$elemMatch<\/code> ansvarar f\u00f6r att begr\u00e4nsa inneh\u00e5llet i ett f\u00e4lt fr\u00e5n s\u00f6kresultatet s\u00e5 att det endast inneh\u00e5ller det f\u00f6rsta elementet som matchar villkoret <code>$elemMatch<\/code>.<\/p>\n<p>H\u00e4r \u00e4r n\u00e5gra saker som du m\u00e5ste t\u00e4nka p\u00e5 innan du anv\u00e4nder <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>Fr\u00e5n och med MongoDB 4.4 s\u00e5 returnerar <code>$elemMatch<\/code>-projektionen av ett befintligt f\u00e4lt, oavsett ordning p\u00e5 f\u00e4lten i dokumentet, f\u00e4ltet efter andra befintliga f\u00e4lt.<\/li>\n<li>B\u00e5de operat\u00f6rerna <code>$elemMatch<\/code> och <code>$<\/code> visar det f\u00f6rsta matchande elementet fr\u00e5n en matris baserat p\u00e5 ett angivet villkor. Operat\u00f6ren <code>$<\/code> skulle projicera det f\u00f6rsta matchande elementet i matrisen fr\u00e5n varje dokument i en samling baserat p\u00e5 ett visst villkor fr\u00e5n fr\u00e5geformuleringen. Operat\u00f6ren <code>$elemMatch<\/code>-projektionen tar ist\u00e4llet ett uttryckligt argument f\u00f6r villkoret. P\u00e5 s\u00e5 s\u00e4tt kan du projicera utifr\u00e5n ett villkor som inte finns i fr\u00e5gan, eller projicera utifr\u00e5n olika f\u00e4lt i matrisens inb\u00e4ddade dokument.<\/li>\n<\/ul>\n<p>Du b\u00f6r \u00e4ven vara medveten om f\u00f6ljande begr\u00e4nsningar innan du anv\u00e4nder <code>$elemMatch<\/code>-operat\u00f6ren p\u00e5 dina data:<\/p>\n<ul>\n<li>Du kan inte n\u00e4mna ett <code>$text<\/code>-fr\u00e5geuttryck i en <code>$elemMatch<\/code>-operator.<\/li>\n<li><code>db.collection.find()<\/code>-operationer p\u00e5 vyer har inte st\u00f6d f\u00f6r <code>$elemMatch<\/code>-projektionsoperat\u00f6ren.<\/li>\n<\/ul>\n<p>.<\/p>\n<p>F\u00f6ljande exempel p\u00e5 <code>$elemMatch<\/code>-projektionsoperat\u00f6ren utg\u00e5r fr\u00e5n en samling <code>schools<\/code> med f\u00f6ljande dokument:<\/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 det h\u00e4r fallet s\u00e5 s\u00f6ker <code>find()<\/code>-operationen efter alla dokument d\u00e4r v\u00e4rdet i f\u00e4ltet postnummer \u00e4r 63110. Projiceringen <code>$elemMatch<\/code> skulle endast \u00e5terge det f\u00f6rsta matchande elementet i matrisen <code>students<\/code> d\u00e4r f\u00e4ltet <code>school<\/code> har v\u00e4rdet 103:<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>S\u00e5 h\u00e4r skulle resultatet se ut:<\/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>Operat\u00f6ren <code>$slice<\/code>-projektion kan anv\u00e4ndas f\u00f6r att ange hur m\u00e5nga element i en matris som ska \u00e5terges i s\u00f6kresultatet:<\/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>Den kan \u00e4ven uttryckas p\u00e5 f\u00f6ljande s\u00e4tt:<\/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>F\u00f6r att demonstrera samma sak s\u00e5 kan du skapa en exempelsamling av tweets med f\u00f6ljande dokument:<\/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\u00f6ljande operation skulle anv\u00e4nda <code>$slice<\/code>-projektionsoperat\u00f6ren p\u00e5 matrisen tweets f\u00f6r att \u00e5terge matrisen med de tv\u00e5 f\u00f6rsta elementen. Om en matris inneh\u00e5ller mindre \u00e4n tv\u00e5 element s\u00e5 returneras alla element i matrisen:<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Denna operation skulle ge f\u00f6ljande dokument:<\/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>$ (projektion)<\/h4>\n<p>Operat\u00f6ren <code>$<\/code> begr\u00e4nsar inneh\u00e5llet i en matris s\u00e5 att det f\u00f6rsta elementet som matchar matrisens fr\u00e5gevillkor returneras. Du kan anv\u00e4nda <code>$<\/code> i projektionsdokumentet f\u00f6r <code>find()<\/code>-metoden eller <code>findOne()<\/code>-metoden n\u00e4r du endast beh\u00f6ver ett visst matriselement i valda dokument.<\/p>\n<p>S\u00e5 h\u00e4r ser syntaxen f\u00f6r operat\u00f6ren <code>$<\/code> ut:<\/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 det h\u00e4r exemplet s\u00e5 best\u00e5r samlingen <code>students<\/code> av f\u00f6ljande dokument:<\/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 f\u00f6ljande fr\u00e5ga s\u00e5 returnerar projektionen <code>{ \"grades.$\": 1 }<\/code> endast det f\u00f6rsta elementet som \u00e4r st\u00f6rre \u00e4n eller lika med 89 f\u00f6r f\u00e4ltet <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>Denna operation returnerar f\u00f6ljande dokument:<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Utv\u00e4rderingsoperatorer<\/h3>\n<p>Du kan anv\u00e4nda MongoDB\u2019s utv\u00e4rderingsoperat\u00f6rer f\u00f6r att bed\u00f6ma den \u00f6vergripande datastrukturen eller enskilda f\u00e4lt i ett dokument.<\/p>\n<p>L\u00e5t oss titta p\u00e5 n\u00e5gra vanliga MongoDB-utv\u00e4rderingsoperat\u00f6rer.<\/p>\n<h4>$mod<\/h4>\n<p>Du kan anv\u00e4nda den h\u00e4r operat\u00f6ren f\u00f6r att matcha dokument d\u00e4r ett specificerat f\u00e4lts v\u00e4rde \u00e4r lika med \u00e5terstoden efter att ha dividerats med ett specificerat v\u00e4rde:<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>L\u00e5t oss s\u00e4ga att du har en tabell med bilar av olika m\u00e4rken som du \u00e4ger i ditt utst\u00e4llningsrum. F\u00f6ljande fr\u00e5ga skulle ge dig alla bilm\u00e4rken vars lagernummer inneh\u00e5ller 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>\u00a0s\u00e5 kan du matcha de dokument som matchar det angivna JSON-schemat. MongoDB\u2019s implementering av JSON-schemat inkluderar till\u00e4gget av nyckelordet <code>bsonType<\/code>, som l\u00e5ter dig anv\u00e4nda alla BSON-typer inom <code>$jsonSchema<\/code>-operat\u00f6ren.<\/p>\n<p><code>bsonType<\/code> kan acceptera samma str\u00e4ngalias som du anv\u00e4nder f\u00f6r operat\u00f6ren <code>type<\/code>. S\u00e5 h\u00e4r skulle syntaxen f\u00f6r <code>$jsonSchema<\/code> se ut:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>H\u00e4r \u00e4r JSON-objektet formaterat enligt <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">JSON-standardens utkast 4<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>H\u00e4r \u00e4r ett exempel som visar hur <code>$jsonSchema<\/code> fungerar:<\/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 \u00e4ven anv\u00e4nda <code>$jsonSchema<\/code> i en dokumentvalidering f\u00f6r att tvinga fram det angivna schemat vid uppdatering och ins\u00e4ttning:<\/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>T\u00e4nk p\u00e5 att det finns flera saker som inte st\u00f6ds av operat\u00f6ren <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>Helhetstypen. Du m\u00e5ste anv\u00e4nda BSON-typen long eller int med nyckelordet bsonType.<\/li>\n<li>Ok\u00e4nda nyckelord.<\/li>\n<li>L\u00e4nkning av egenskaper och JSON-schemats hypermedia, tillsammans med anv\u00e4ndningen av JSON-referenser och JSON-pointers.<\/li>\n<\/ol>\n<h4>text<\/h4>\n<p>Operat\u00f6ren <code>$text<\/code> skulle leta efter en text i inneh\u00e5llet i det angivna f\u00e4ltet, indexerat med ett textindex:<\/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 det h\u00e4r fallet s\u00e5 kommer f\u00f6ljande kodutdrag att g\u00e5 igenom tabellen f\u00f6r att filtrera bort alla bilar som inneh\u00e5ller texten &#8221;Porsche&#8221;:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>Operat\u00f6ren <code>$regex<\/code> erbjuder regulj\u00e4ra uttryck f\u00f6r att matcha str\u00e4ngar i s\u00f6kfr\u00e5gor. MongoDB utnyttjar regulj\u00e4ra uttryck som \u00e4r kompatibla med Perl:<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>F\u00f6ljande exempel skulle hj\u00e4lpa till att filtrera bort alla bilar som inneh\u00e5ller str\u00e4ngen &#8221;$78900&#8221;:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>Operat\u00f6ren <code>$expr<\/code> g\u00f6r det m\u00f6jligt att utnyttja aggregeringsuttryck i fr\u00e5gespr\u00e5ket:<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Du kan \u00e4ven anv\u00e4nda <code>$expr<\/code> f\u00f6r att bygga fr\u00e5geuttryck som j\u00e4mf\u00f6r f\u00e4lt fr\u00e5n samma dokument i ett <code>$match<\/code>-steg. Om <code>$match<\/code>-stadiet r\u00e5kar vara en del av ett <code>$lookup<\/code>-stadium s\u00e5 kan <code>$expr<\/code> j\u00e4mf\u00f6ra f\u00e4lt med hj\u00e4lp av let-variabler.<\/p>\n<h4>$where<\/h4>\n<p>Du kan utnyttja operat\u00f6ren <code>$where<\/code> f\u00f6r att antingen skicka en str\u00e4ng som inneh\u00e5ller en fullst\u00e4ndig JavaScript-funktion eller ett JavaScript-uttryck till fr\u00e5gesystemet. Operat\u00f6ren <code>$where<\/code> ger st\u00f6rre flexibilitet men kr\u00e4ver att databasen behandlar JavaScript-funktionen eller uttrycket f\u00f6r varje dokument i samlingen. Du kan h\u00e4nvisa till det h\u00e4r dokumentet i JavaScript-funktionen eller -uttrycket genom att antingen anv\u00e4nda\u00a0<code>obj<\/code> eller <code>this<\/code>.<\/p>\n<p>H\u00e4r \u00e4r ett exempel p\u00e5 syntaxen:<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>Det finns n\u00e5gra viktiga \u00f6verv\u00e4ganden att t\u00e4nka p\u00e5 innan vi g\u00e5r in p\u00e5 ett exempel n\u00e4r vi anv\u00e4nder <code>$where<\/code>-operat\u00f6ren:<\/p>\n<ul>\n<li>Du b\u00f6r endast anv\u00e4nda <code>$where<\/code>-operat\u00f6ren f\u00f6r att s\u00f6ka efter dokument p\u00e5 h\u00f6gsta niv\u00e5. Operat\u00f6ren <code>$where<\/code> fungerar inte i ett n\u00e4stlat dokument, som i en <code>$elemMatch<\/code>-fr\u00e5ga.<\/li>\n<li>Generellt sett s\u00e5 b\u00f6r du endast anv\u00e4nda <code>$where<\/code>\u00a0n\u00e4r du inte kan uttrycka din fr\u00e5ga med en annan operat\u00f6r. Om du m\u00e5ste anv\u00e4nda <code>$where<\/code>, se till att du inkluderar minst en annan standardfr\u00e5geoperator f\u00f6r att filtrera resultatm\u00e4ngden. Om du anv\u00e4nder <code>$where<\/code> oberoende av varandra s\u00e5 kr\u00e4vs det en samlingsskanning f\u00f6r att den ska kunna utf\u00f6ras korrekt.<\/li>\n<\/ul>\n<p>.<\/p>\n<p>H\u00e4r \u00e4r ett exempel f\u00f6r att illustrera detta:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Bitvisa operatorer<\/h3>\n<p>Bitvisa operat\u00f6rer returnerar data baserat p\u00e5 villkor f\u00f6r bitpositioner. Enkelt uttryckt s\u00e5 anv\u00e4nds de f\u00f6r att matcha numeriska eller bin\u00e4ra v\u00e4rden d\u00e4r n\u00e5gon bit fr\u00e5n en upps\u00e4ttning bitpositioner har v\u00e4rdet 1 eller 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Denna operat\u00f6r matchar alla dokument d\u00e4r alla bitpositioner som anges i fr\u00e5gan \u00e4r inst\u00e4llda (dvs. 1) i f\u00e4ltet:<\/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>F\u00e4ltv\u00e4rdet ska antingen vara en BinData-instans eller numeriskt f\u00f6r att <code>$bitsAllSet<\/code> ska matcha det aktuella dokumentet.<\/p>\n<p>I f\u00f6ljande exempel s\u00e5 utnyttjar vi en samling med f\u00f6ljande dokument:<\/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>I den fr\u00e5ga som n\u00e4mns nedan s\u00e5 anv\u00e4nds operat\u00f6ren <code>$bitsAllSet<\/code> f\u00f6r att testa om f\u00e4lt a har bitar som \u00e4r inst\u00e4llda p\u00e5 position 1 och position 5. Den minst signifikanta biten skulle vara p\u00e5 position 0:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } })<\/code><\/pre>\n<p>Denna fr\u00e5ga skulle matcha f\u00f6ljande dokument:<\/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>Operat\u00f6ren <code>$bitsAllClear<\/code> kommer att matcha dokument d\u00e4r alla bitpositioner som anges i fr\u00e5gan \u00e4r klara 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 anv\u00e4nder exemplet f\u00f6r <code>$bitsAllSet<\/code> h\u00e4r f\u00f6r att visa hur <code>$bitsAllClear<\/code> anv\u00e4nds. F\u00f6ljande fr\u00e5ga skulle anv\u00e4nda denna operat\u00f6r f\u00f6r att kontrollera om f\u00e4lt a har bitar som \u00e4r klara i positionerna 1 och 5:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Denna fr\u00e5ga skulle matcha f\u00f6ljande dokument:<\/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>Det finns olika fr\u00e5gemodifierare som g\u00f6r att du kan \u00e4ndra beteendet eller resultatet av en fr\u00e5ga i MongoDB. Drivrutinens gr\u00e4nssnitt kan exempelvis tillhandah\u00e5lla mark\u00f6rmetoder som omsluter dem f\u00f6r din anv\u00e4ndning.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB har avskrivit <code>$hint<\/code> sedan v3.2. Men den h\u00e4r operat\u00f6ren kan fortfarande finnas tillg\u00e4nglig f\u00f6r MongoDB-drivrutiner som Go, Java, Scala, Ruby, Swift osv. Den kan tvinga s\u00f6koptimeraren att utnyttja ett specifikt index f\u00f6r att uppfylla s\u00f6kningen, som sedan kan n\u00e4mnas antingen med dokument eller med indexnamn.<\/p>\n<p>Du kan \u00e4ven anv\u00e4nda operat\u00f6ren <code>$hint<\/code> f\u00f6r att testa indexeringsstrategier och fr\u00e5geprestanda. Ta exempelvis f\u00f6ljande operation:<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Den h\u00e4r operationen skulle returnera alla dokument i samlingen som kallas <code>users<\/code> genom att utnyttja indexet f\u00f6r f\u00e4ltet <code>age<\/code>.<\/p>\n<p>Du kan \u00e4ven n\u00e4mna en ledtr\u00e5d genom att anv\u00e4nda n\u00e5gon av f\u00f6ljande 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>Om det finns ett indexfilter f\u00f6r fr\u00e5geformen s\u00e5 skulle MongoDB helt enkelt ignorera <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>Med operat\u00f6ren <code>$comment<\/code>\u00a0s\u00e5 kan du bifoga en kommentar till en fr\u00e5ga i alla sammanhang som <code>$query<\/code> kan f\u00f6rekomma i. Eftersom kommentarer sprids till profilloggen s\u00e5 kan det bli l\u00e4ttare att tolka och sp\u00e5ra din profil om du l\u00e4gger till en kommentar.<\/p>\n<p>Du kan anv\u00e4nda <code>$comment<\/code> p\u00e5 tre olika s\u00e4tt:<\/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>Om du vill bifoga kommentarer till fr\u00e5geuttryck i andra sammanhang, exempelvis med <code>db.collection.update()<\/code>, s\u00e5 kan du anv\u00e4nda fr\u00e5geoperat\u00f6ren\u00a0<code>$comment<\/code> i st\u00e4llet f\u00f6r metaoperatorn.<\/p>\n<h4>$max<\/h4>\n<p>Du kan n\u00e4mna ett <code>$max<\/code>-v\u00e4rde f\u00f6r att ange den exklusiva \u00f6vre gr\u00e4nsen f\u00f6r ett visst index f\u00f6r att begr\u00e4nsa resultaten av <code>find()<\/code>. Den h\u00e4r operat\u00f6ren anger den \u00f6vre gr\u00e4nsen f\u00f6r alla nycklar i en viss ordning i indexet.<\/p>\n<p>Mongosh ger dig f\u00f6ljande <code>max()<\/code>-omslagsmetod:<\/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 \u00e4ven n\u00e4mna <code>$max<\/code> med f\u00f6ljande tv\u00e5 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>Om du exempelvis vill specificera den exklusiva \u00f6vre gr\u00e4nsen s\u00e5 kan du t\u00e4nka p\u00e5 f\u00f6ljande operationer p\u00e5 en samling som heter collection och som inneh\u00e5ller ett 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>Denna operation begr\u00e4nsar s\u00f6kningen till de dokument d\u00e4r f\u00e4ltet \u00e5lder \u00e4r mindre \u00e4n 100 och tvingar fram en s\u00f6kplan som skannar indexet <code>{ age: 1 }<\/code> fr\u00e5n <code>minKey<\/code> till 100.<\/p>\n<h4>$explain<\/h4>\n<p>Denna operat\u00f6r ger dig information om fr\u00e5geplanen. Den returnerar ett dokument som beskriver de index och processer som anv\u00e4nds f\u00f6r att returnera fr\u00e5gan. Detta kan vara anv\u00e4ndbart n\u00e4r du f\u00f6rs\u00f6ker att optimera en fr\u00e5ga.<\/p>\n<p>Du kan n\u00e4mna operat\u00f6ren <code>$explain<\/code> i n\u00e5gon av f\u00f6ljande former:<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>B\u00e4sta praxis f\u00f6r MongoDB-operatorer<\/h2>\n<p>I det h\u00e4r avsnittet s\u00e5 tar vi en titt p\u00e5 n\u00e5gra av de b\u00e4sta metoderna n\u00e4r du anv\u00e4nder dessa MongoDB-operat\u00f6rer.<\/p>\n<h3>Inb\u00e4ddning och h\u00e4nvisning<\/h3>\n<p>Inb\u00e4ddning \u00e4r en naturlig f\u00f6rl\u00e4ngning av datamodellering. Det g\u00f6r att du kan undvika applikations-f\u00f6rbindelser. Som ett resultat s\u00e5 kan uppdateringar och s\u00f6kningar minskas.<\/p>\n<p>Du kan b\u00e4dda in data med en 1:1-relation i ett enda dokument. Med detta sagt s\u00e5 kan data med m\u00e5nga :1-relationer d\u00e4r &#8221;m\u00e5nga&#8221; objekt visas med sina \u00f6verordnade dokument ocks\u00e5 vara bra kandidater.<\/p>\n<p>Att lagra dessa typer av data i samma dokument l\u00e5ter som ett klokt val. Inb\u00e4ddning ger dock b\u00e4ttre prestanda f\u00f6r l\u00e4soperationer med denna typ av datalokalisering.<\/p>\n<p>Inb\u00e4ddade datamodeller kan \u00e4ven hj\u00e4lpa utvecklare att uppdatera associerade data i en enda skrivoperation. Detta fungerar eftersom skrivningar i enskilda dokument \u00e4r transaktionsbaserade.<\/p>\n<p>Du b\u00f6r \u00f6verv\u00e4ga att anv\u00e4nda referenstagning f\u00f6r f\u00f6ljande scenarier:<\/p>\n<ul>\n<li>N\u00e4r du uppdaterar ett dokumentsegment och det forts\u00e4tter att bli l\u00e4ngre, medan resten av dokumentet \u00e4r statiskt.<\/li>\n<li>N\u00e4r ett dokument n\u00e5s men inneh\u00e5ller data som s\u00e4llan anv\u00e4nds. Inb\u00e4ddning skulle bara \u00f6ka kraven p\u00e5 minnet, s\u00e5 referensering \u00e4r mer meningsfullt.<\/li>\n<li>N\u00e4r dokumentstorleken \u00f6verskrider MongoDB\u2019s dokumentgr\u00e4ns p\u00e5 16 MB. Detta kan h\u00e4nda n\u00e4r man modellerar m\u00e5nga :1-relationer (till exempel <em>anst\u00e4llda:avdelning<\/em><span style=\"font-size: 1rem\">).<\/span><\/li>\n<\/ul>\n<h3>Unders\u00f6k profilering och fr\u00e5gem\u00f6nster<\/h3>\n<p>F\u00f6r de flesta utvecklare s\u00e5 \u00e4r det f\u00f6rsta steget f\u00f6r att <a href=\"https:\/\/kinsta.com\/se\/blog\/prestanta-testnings-verktyg\/\">optimera prestandan<\/a> att f\u00f6rst\u00e5 de faktiska och f\u00f6rv\u00e4ntade fr\u00e5gem\u00f6nstren. N\u00e4r du v\u00e4l k\u00e4nner till applikationens fr\u00e5gem\u00f6nster tillr\u00e4ckligt v\u00e4l s\u00e5 kan du g\u00f6ra din datamodell och v\u00e4lja l\u00e4mpliga index.<\/p>\n<p>MongoDB-utvecklare har tillg\u00e5ng till olika kraftfulla verktyg som l\u00e5ter dem f\u00f6rb\u00e4ttra prestandan. Detta betyder dock inte att fr\u00e5geprofiler och m\u00f6nster kan ignoreras.<\/p>\n<p>Ett enkelt s\u00e4tt att \u00f6ka prestandan \u00e4r exempelvis att analysera dina fr\u00e5gem\u00f6nster och f\u00f6rst\u00e5 var du kan b\u00e4dda in data. Andra s\u00e4tt att f\u00f6rb\u00e4ttra MongoDB\u2019s prestanda efter att ha identifierat dina viktigaste fr\u00e5gem\u00f6nster \u00e4r bland annat:<\/p>\n<ul>\n<li>Se till att du har index f\u00f6r alla f\u00e4lt som du fr\u00e5gar mot.<\/li>\n<li>Lagra resultaten av frekventa underfr\u00e5gor p\u00e5 dokument f\u00f6r att minska l\u00e4slasten.<\/li>\n<li>Ta en titt p\u00e5 dina loggar f\u00f6r att leta efter l\u00e5ngsamma beg\u00e4randen och kontrollera sedan dina index.<\/li>\n<\/ul>\n<h3>Granska indexering och modellering av data<\/h3>\n<p>N\u00e4r du g\u00f6r din datamodell s\u00e5 kommer du att best\u00e4mma hur du ska modellera relationer mellan data. Att v\u00e4lja n\u00e4r du ska b\u00e4dda in ett dokument i st\u00e4llet f\u00f6r att skapa en referens \u00f6ver separata dokument i olika samlingar \u00e4r exempelvis ett exempel p\u00e5 till\u00e4mpningsspecifika \u00f6verv\u00e4ganden.<\/p>\n<p>En stor f\u00f6rdel med JSON-dokument \u00e4r att de l\u00e5ter utvecklare modellera data utifr\u00e5n applikationens krav. Att b\u00e4dda in underdokument och matriser hj\u00e4lper dig att modellera komplexa relationer mellan data genom att utnyttja enkla textdokument.<\/p>\n<p>Du kan \u00e4ven anv\u00e4nda MongoDB f\u00f6r att modellera f\u00f6ljande:<\/p>\n<ul>\n<li>Geospatiala data<\/li>\n<li>Tabeller, platta strukturer och kolumnstrukturer<\/li>\n<li>Enkla nyckel-v\u00e4rdepar<\/li>\n<li>Tidsseriedata<\/li>\n<li>Kanter och noder i anslutna grafiska datastrukturer och liknande<\/li>\n<\/ul>\n<h3>\u00d6vervaka delning och replikering<\/h3>\n<p>Replikering kan vara avg\u00f6rande f\u00f6r att f\u00f6rb\u00e4ttra prestandan eftersom den \u00f6kar tillg\u00e4ngligheten till data genom horisontell skalning. Som ett resultat av detta s\u00e5 kan du f\u00e5 b\u00e4ttre prestanda och \u00f6kad s\u00e4kerhet genom redundans.<\/p>\n<p>Prestanda\u00f6vervakning kan vara besv\u00e4rlig och kr\u00e4va extra resurser och tid f\u00f6r att s\u00e4kerst\u00e4lla en smidig funktion. Du kan utnyttja de verktyg f\u00f6r prestanda\u00f6vervakning som finns p\u00e5 marknaden och som tillgodoser dina specifika behov.<\/p>\n<p><a href=\"https:\/\/kinsta.com\/se\/apm-verktyg\/\">Kinsta APM<\/a> kan exempelvis samla in tidsst\u00e4mplad information om MySQL-databasfr\u00e5gor, PHP-processer, externa HTTP-anrop och mycket annat p\u00e5 din WordPress-webbplats. Du kan \u00e4ven anv\u00e4nda det h\u00e4r kostnadsfria verktyget f\u00f6r att fels\u00f6ka:<\/p>\n<ul>\n<li>L\u00e5nga API-anrop<\/li>\n<li>L\u00e5nga externa webbadress-f\u00f6rfr\u00e5gningar<\/li>\n<li>L\u00e5ngsamma databasfr\u00e5gor f\u00f6r att n\u00e4mna n\u00e5gra.<\/li>\n<\/ul>\n<p>I MongoDB s\u00e5 kan replikering \u00e5stadkommas med hj\u00e4lp av replikaupps\u00e4ttningar. Som ett resultat av dessa s\u00e5 kan utvecklare kopiera data fr\u00e5n en prim\u00e4r nod eller server till flera sekund\u00e4ra noder eller servrar. Detta g\u00f6r att replikeringen kan k\u00f6ra vissa fr\u00e5gor p\u00e5 sekund\u00e4ra enheter i st\u00e4llet f\u00f6r p\u00e5 den prim\u00e4ra. D\u00e5 kan exempelvis konflikter undvikas och det kan bli en b\u00e4ttre belastningsutj\u00e4mning.<\/p>\n<p>Sharded-kluster i MongoDB \u00e4r ett annat s\u00e4tt att potentiellt f\u00f6rb\u00e4ttra prestandan. I likhet med replikering s\u00e5 kan sharding exempelvis anv\u00e4ndas f\u00f6r att f\u00f6rdela stora datam\u00e4ngder p\u00e5 flera servrar.<\/p>\n<p>Genom att utnyttja en shardnyckel s\u00e5 kan utvecklare kopiera shards eller datam\u00e4ngder \u00f6ver flera servrar. Som ett resultat s\u00e5 kan servrarna arbeta tillsammans f\u00f6r att anv\u00e4nda alla data.<\/p>\n<p>Sharding har en hel del f\u00f6rdelar, bland annat horisontell skalning f\u00f6r skrivningar\/l\u00e4sningar, h\u00f6gre tillg\u00e4nglighet och \u00f6kad lagringskapacitet.<\/p>\n<h3>Best\u00e4mma minnesanv\u00e4ndning<\/h3>\n<p>MongoDB presterar b\u00e4st n\u00e4r en applikations arbetsupps\u00e4ttning (dvs. ofta \u00e5tkomna data och index) f\u00e5r plats i minnet utan problem. \u00c4ven om andra faktorer \u00e4r avg\u00f6rande f\u00f6r prestandan s\u00e5 \u00e4r RAM-storleken den viktigaste f\u00f6r instansstorleken.<\/p>\n<p>N\u00e4r en applikations arbetsm\u00e4ngd exempelvis ryms i RAM s\u00e5 m\u00e5ste l\u00e4saktiviteten fr\u00e5n disken vara l\u00e5g. Men om arbetsupps\u00e4ttningen \u00f6verskrider instansserverns RAM eller storlek s\u00e5 blir det problem. Som ett resultat s\u00e5 kommer l\u00e4saktiviteten att b\u00f6rja skjuta i h\u00f6jden.<\/p>\n<p>Om du ser detta h\u00e4nda s\u00e5 kan du kanske l\u00f6sa problemet genom att flytta \u00f6ver till en st\u00f6rre instans som har mer minne.<\/p>\n<h3>Placera f\u00e4lt med flera v\u00e4rden i slutet<\/h3>\n<p>Om du exempelvis indexerar ett par f\u00e4lt och ett av de f\u00e4lt som du vill s\u00f6ka efter anv\u00e4nder en av dessa &#8221;multi-value&#8221;-operat\u00f6rer, s\u00e5 b\u00f6r du placera dem i slutet av indexet. Du m\u00e5ste ordna indexet s\u00e5 att de f\u00e4lt som fr\u00e5gar efter exakta v\u00e4rden kommer f\u00f6rst och att operat\u00f6rerna med flera v\u00e4rden visas sist i indexet.<\/p>\n<p>Ett undantag fr\u00e5n detta skulle vara att sortera mot f\u00e4lten. Placera dessa mellan &#8221;flerv\u00e4rdes&#8221;- och exakta f\u00e4lt f\u00f6r att minska den m\u00e4ngd sortering i minnet som kr\u00e4vs.<\/p>\n<h2>Sammanfattning<\/h2>\n<p>F\u00f6r MongoDB s\u00e5 \u00e4r snabbhet det viktigaste. MongoDB anv\u00e4nder operat\u00f6rer f\u00f6r att utf\u00f6ra matematiska eller logiska uppgifter. Som ett resultat s\u00e5 returneras fr\u00e5gor v\u00e4ldigt snabbt. F\u00f6rst\u00e5elsen av MongoDB\u2019s operat\u00f6rer \u00e4r helt enkelt nyckeln till att beh\u00e4rska MongoDB.<\/p>\n\n<p>Den h\u00e4r artikeln belyser n\u00e5gra av de viktigaste MongoDB-operat\u00f6rerna som du kan anv\u00e4nda p\u00e5 dina data. Detta g\u00e4ller exempelvis j\u00e4mf\u00f6relseoperat\u00f6rer, logiska operat\u00f6rer, metaoperat\u00f6rer och projektionsoperat\u00f6rer, f\u00f6r att n\u00e4mna n\u00e5gra. Den hj\u00e4lper dig \u00e4ven att f\u00f6rst\u00e5 hur du kan anv\u00e4nda MongoDB-operatorer och de b\u00e4sta metoderna som g\u00f6r att du kan f\u00e5 ut s\u00e5 mycket som m\u00f6jligt av dem.<\/p>\n<p>Bland alla operat\u00f6rerna, vilken eller vilka anv\u00e4nder du oftast och varf\u00f6r? Dela med dig i kommentarerna nedan &#8211; vi vill g\u00e4rna h\u00f6ra dina tankar!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I alla f\u00f6retag s\u00e5 \u00e4r data den st\u00f6rsta tillg\u00e5ngen. Genom att analysera data s\u00e5 kan du exempelvis fatta beslut om kundtrender och beteendef\u00f6ruts\u00e4gelser. Som ett resultat &#8230;<\/p>\n","protected":false},"author":117,"featured_media":45697,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[715,169,592,323,642],"topic":[],"class_list":["post-45696","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-development","tag-mongodb"],"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 av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till<\/title>\n<meta name=\"description\" content=\"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.\" \/>\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\/se\/blog\/mongodb-operatorer\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till\" \/>\n<meta property=\"og:description\" content=\"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstasweden\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:39:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-14T13:06:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/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=\"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_se\" \/>\n<meta name=\"twitter:label1\" content=\"Skriven av\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Ber\u00e4knad l\u00e4stid\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 minuter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till\",\"datePublished\":\"2022-09-19T08:39:12+00:00\",\"dateModified\":\"2023-04-14T13:06:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\"},\"wordCount\":6270,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"development\",\"MongoDB\"],\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\",\"url\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\",\"name\":\"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/se\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg\",\"datePublished\":\"2022-09-19T08:39:12+00:00\",\"dateModified\":\"2023-04-14T13:06:39+00:00\",\"description\":\"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#breadcrumb\"},\"inLanguage\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/se\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/se\/#website\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/se\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/se\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/se\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/se\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstasweden\/\",\"https:\/\/x.com\/kinsta_se\",\"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\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@id\":\"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till","description":"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.","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\/se\/blog\/mongodb-operatorer\/","og_locale":"sv_SE","og_type":"article","og_title":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till","og_description":"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.","og_url":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstasweden\/","article_published_time":"2022-09-19T08:39:12+00:00","article_modified_time":"2023-04-14T13:06:39+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.","twitter_image":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_se","twitter_misc":{"Skriven av":"Salman Ravoof","Ber\u00e4knad l\u00e4stid":"34 minuter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till","datePublished":"2022-09-19T08:39:12+00:00","dateModified":"2023-04-14T13:06:39+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/"},"wordCount":6270,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","keywords":["datab","database","databases","development","MongoDB"],"inLanguage":"sv-SE","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/","url":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/","name":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till","isPartOf":{"@id":"https:\/\/kinsta.com\/se\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","datePublished":"2022-09-19T08:39:12+00:00","dateModified":"2023-04-14T13:06:39+00:00","description":"Denna artikel belyser n\u00e5gra av MongoDB\u2019s nyckeloperat\u00f6rer som kan hj\u00e4lpa dig att f\u00f6rb\u00e4ttra prestandan. Vi visar hur du anv\u00e4nder den.","breadcrumb":{"@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#breadcrumb"},"inLanguage":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#primaryimage","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2022\/09\/mongodb-operators.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/se\/blog\/mongodb-operatorer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/se\/"},{"@type":"ListItem","position":2,"name":"9 typer av Mongodb-operat\u00f6rer som du beh\u00f6ver k\u00e4nna till"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/se\/#website","url":"https:\/\/kinsta.com\/se\/","name":"Kinsta\u00ae","description":"Snabba, s\u00e4kra, premium hosting-l\u00f6sningar","publisher":{"@id":"https:\/\/kinsta.com\/se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sv-SE"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/se\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/se\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/se\/wp-content\/uploads\/sites\/9\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/se\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstasweden\/","https:\/\/x.com\/kinsta_se","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\/se\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"sv-SE","@id":"https:\/\/kinsta.com\/se\/#\/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\/se\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45696","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/comments?post=45696"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45696\/revisions"}],"predecessor-version":[{"id":52149,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/posts\/45696\/revisions\/52149"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/translations\/dk"},{"href":"https:\/\/kinsta.com\/se\/wp-json\/kinsta\/v1\/posts\/45696\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media\/45697"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/media?parent=45696"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/tags?post=45696"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/se\/wp-json\/wp\/v2\/topic?post=45696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}