{"id":95148,"date":"2020-09-25T19:43:09","date_gmt":"2020-09-25T17:43:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb"},"modified":"2020-09-25T19:43:09","modified_gmt":"2020-09-25T17:43:09","slug":"14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","title":{"rendered":"14 saker jag \u00f6nskar att jag visste innan jag b\u00f6rjade arbeta med MongoDB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>\u00d6vers\u00e4ttningen av artikeln \u00e4r framtagen inf\u00f6r kursstarten <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\">\u00bbIcke-relationella databaser\u00ab<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"14 saker jag \u00f6nskar att jag visste innan jag b\u00f6rjade arbeta med MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9b4979be27e0090543b28150d90fa8df.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Huvudpunkter:<\/p>\n<ul>\n<li>Det \u00e4r mycket viktigt att utforma en skiss, \u00e4ven om det inte \u00e4r obligatoriskt i MongoDB.<\/li>\n<li>P\u00e5 samma s\u00e4tt b\u00f6r indexen matcha din skiss och \u00e5tkomstm\u00f6nster. <\/li>\n<li>Undvik att anv\u00e4nda stora objekt och stora arrayer.<\/li>\n<li>Var f\u00f6rsiktig med inst\u00e4llningarna i MongoDB, speciellt n\u00e4r det g\u00e4ller s\u00e4kerhet och p\u00e5litlighet.<\/li>\n<li>Det finns ingen fr\u00e5gaoptimerare i MongoDB, s\u00e5 var f\u00f6rsiktig n\u00e4r du utf\u00f6r f\u00f6rfr\u00e5gningsoperationer.<\/li>\n<\/ul>\n<p>\nJag har arbetat med databaser l\u00e4nge, men uppt\u00e4ckte MongoDB f\u00f6rst nyligen. Det finns n\u00e5gra saker som jag \u00f6nskar att jag hade vetat innan jag b\u00f6rjade anv\u00e4nda den. N\u00e4r man har erfarenhet inom ett specifikt omr\u00e5de, f\u00e5r man f\u00f6rutfattade meningar om vad databaser \u00e4r och vad de g\u00f6r. F\u00f6r att underl\u00e4tta f\u00f6rst\u00e5elsen f\u00f6r andra, presenterar jag en lista \u00f6ver vanliga misstag.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Att skapa en MongoDB-server utan autentisering<\/h3>\n<p>\nTyv\u00e4rr installeras MongoDB som standard utan autentisering. F\u00f6r en arbetsstation med lokal \u00e5tkomst \u00e4r detta normalt. Men eftersom MongoDB \u00e4r ett flervalsystem som g\u00e4rna anv\u00e4nder stora m\u00e4ngder minne, \u00e4r det b\u00e4ttre att installera den p\u00e5 en server med s\u00e5 mycket RAM som m\u00f6jligt, \u00e4ven om du bara ska anv\u00e4nda den f\u00f6r utveckling. Installation p\u00e5 server genom standardport kan bli problematisk, s\u00e4rskilt om f\u00f6rfr\u00e5gningar kan utf\u00f6ra vilken kod som helst p\u00e5 javascript (t.ex. <code>$where<\/code> som id\u00e9 f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">injektion<\/a><\/noindex>). <\/p>\n<p>Det finns flera autentiseringsmetoder, men det enklaste \u00e4r att st\u00e4lla in ID\/l\u00f6senord f\u00f6r anv\u00e4ndaren. Anv\u00e4nd denna id\u00e9 medan du funderar p\u00e5 en mer invecklad autentisering baserad p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/security-ldap-external\/\">LDAP<\/a><\/noindex>. N\u00e4r det kommer till s\u00e4kerhet b\u00f6r MongoDB h\u00e5llas uppdaterad, och loggar b\u00f6r alltid kontrolleras f\u00f6r obeh\u00f6rig \u00e5tkomst. Jag gillar till exempel att v\u00e4lja en annan port \u00e4n standardporten.<\/p>\n<h3>Gl\u00f6m inte att koppla attackytan till MongoDB<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/\">Checklista f\u00f6r s\u00e4kerhet i MongoDB<\/a><\/noindex> Inneh\u00e5ller bra r\u00e5d f\u00f6r att minska risken f\u00f6r n\u00e4tintr\u00e5ng och datal\u00e4ckor. Det \u00e4r l\u00e4tt att avf\u00e4rda och s\u00e4ga att en utvecklingsserver inte beh\u00f6ver h\u00f6g s\u00e4kerhetsniv\u00e5. Men det \u00e4r inte s\u00e5 enkelt och detta g\u00e4ller alla MongoDB-servrar. S\u00e4rskilt om det inte finns n\u00e5gon stark anledning att anv\u00e4nda <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/command\/mapReduce\/#dbcmd.mapReduce\">mapReduce<\/a><\/noindex><\/code>, <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/command\/group\/#dbcmd.group\">grupp<\/a><\/noindex><\/code> eller <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/query\/where\/#op._S_where\">$where<\/a><\/noindex>, b\u00f6r anv\u00e4ndningen av godtycklig JavaScript-kod st\u00e4ngas av genom att ange detta i konfigurationsfilen <code><noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">javascriptAktiverat:false<\/a><\/noindex><\/code>. Eftersom standard MongoDB-datafiler inte \u00e4r krypterade, \u00e4r det rimligt att k\u00f6ra MongoDB med <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/#run-mongodb-with-a-dedicated-user\">Dedikerad anv\u00e4ndare<\/a><\/noindex>, som har full \u00e5tkomst till filerna, med begr\u00e4nsad \u00e5tkomst endast f\u00f6r sig sj\u00e4lv och m\u00f6jlighet att anv\u00e4nda sina egna \u00e5tkomstkontrollverktyg i operativsystemet.<\/p>\n<h3>Fel vid schemadesign<\/h3>\n<p>\nMongoDB anv\u00e4nder ingen schema. Men det betyder inte att schema \u00e4r on\u00f6digt. Om du bara vill lagra dokument utan n\u00e5gon sammanh\u00e4ngande schema, kan du snabbt och enkelt spara dem, men att extrahera dem senare kan vara <noindex><a rel=\"nofollow\" href=\"https:\/\/www.compose.com\/articles\/mongodb-with-and-without-schemas\/\">j\u00e4vligt sv\u00e5rt<\/a><\/noindex>. <\/p>\n<p>Den klassiska artikeln \u201c<i><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/blog\/post\/6-rules-of-thumb-for-mongodb-schema-design-part-1\">6 empiriska regler f\u00f6r att designa MongoDB-scheman\u201d<\/a><\/noindex><\/i> \u00e4r v\u00e4rt att l\u00e4sa, och funktioner som <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/schema-explorer\/\">Schema Explorer<\/a><\/noindex> i det externa verktyget Studio 3T, \u00e4r v\u00e4rt att anv\u00e4nda f\u00f6r regelbundna schemakontroller.<\/p>\n<h3>Gl\u00f6m inte bort sorteringsordningen<\/h3>\n<p>\nAtt gl\u00f6mma bort sorteringsordningen kan leda till stor besvikelse och f\u00f6rlora mer tid \u00e4n med n\u00e5gon annan felaktig konfiguration. Som standard anv\u00e4nder MongoDB <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1920\">bin\u00e4r sortering<\/a><\/noindex>. Men det \u00e4r osannolikt att det \u00e4r till n\u00e5gon nytta. Skiftl\u00e4gesk\u00e4nsliga, diakritiska, bin\u00e4ra sorteringar ans\u00e5gs vara underliga anachronismer tillsammans med p\u00e4rlor, kaftaner och krullade mustascher redan p\u00e5 80-talet. Nu \u00e4r deras anv\u00e4ndning of\u00f6rl\u00e5tlig. I verkliga livet \u00e4r \"motorcykel\" samma sak som \"Motorcykel\". Och \"Britania\" och \"britania\" \u00e4r samma plats. Liten bokstav \u00e4r helt enkelt en versal motsvarighet. Och l\u00e5t mig inte ens b\u00f6rja prata om sortering av diakritiska tecken. N\u00e4r du skapar en databas i MongoDB, anv\u00e4nd sorteringsalternativ utan h\u00e4nsyn till diakritiska och <noindex><a rel=\"nofollow\" href=\"https:\/\/weblogs.sqlteam.com\/dang\/archive\/2009\/07\/26\/Collation-Hell-Part-1.aspx\">skiftl\u00e4gen<\/a><\/noindex>, som motsvarar spr\u00e5ket och <noindex><a rel=\"nofollow\" href=\"https:\/\/derickrethans.nl\/mongodb-collation-revised.html\">kulturen hos systemets anv\u00e4ndare<\/a><\/noindex>. Detta g\u00f6r det betydligt enklare att s\u00f6ka bland str\u00e4ngdata.<\/p>\n<h3>Att skapa samlingar med stora dokument<\/h3>\n<p>\nMongoDB kan hantera stora dokument p\u00e5 upp till 16 MB i samlingar, och <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/gridfs\/#gridfs\">GridFS<\/a><\/noindex> \u00e4r avsedd f\u00f6r dokument som \u00e4r st\u00f6rre \u00e4n 16 MB. Men bara f\u00f6r att stora dokument kan lagras d\u00e4r, betyder det inte att det \u00e4r en bra id\u00e9 att lagra dem d\u00e4r. MongoDB fungerar b\u00e4st om du sparar enskilda dokument som \u00e4r n\u00e5gra kilobyte stora, och behandlar dem mer som rader i en bred SQL-tabell. Stora dokument kan orsaka problem med <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/mongodb\/comments\/573fqr\/question_mongodb_terrible_performance_for_a\/\">prestanda<\/a><\/noindex>.<\/p>\n<h3>Att skapa dokument med stora matriser <\/h3>\n<p>\nDokument kan inneh\u00e5lla arrayer. Det \u00e4r b\u00e4st om antalet element i arrayen \u00e4r l\u00e5ngt ifr\u00e5n tusentals. Om element ofta l\u00e4ggs till i arrayen kan den \u00f6verskrida det dokument som inneh\u00e5ller den, och d\u00e5 m\u00e5ste den <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/data-model-operations\/#document-growth\">flyttas<\/a><\/noindex>, vilket inneb\u00e4r att du beh\u00f6ver <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/write-performance\/#document-growth\">uppdatera och index<\/a><\/noindex>. Vid omindexering av ett dokument med en stor array skrivs indexen ofta \u00f6ver, eftersom det finns <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/index-multikey\/\">en post<\/a><\/noindex>, som lagrar dess index. S\u00e5dan omindexering sker ocks\u00e5 n\u00e4r dokumentet infogas eller tas bort. <\/p>\n<p>I MongoDB finns det s\u00e5 kallat <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/mmapv1\/#record-allocation-strategies\">\u00abutfyllnadsfaktor\u00bb<\/a><\/noindex>, som ger utrymme f\u00f6r att dokumenten ska v\u00e4xa f\u00f6r att minimera detta problem. <br \/>\nDu kan t\u00e4nka att det g\u00e5r bra utan att indexera arrayer. Tyv\u00e4rr kan bristen p\u00e5 index leda till andra problem. Eftersom dokumenten genomg\u00e5s fr\u00e5n b\u00f6rjan till slut, kommer s\u00f6kningar efter element i slutet av arrayen att ta mer tid, och de flesta operationer som r\u00f6r s\u00e5dana dokument kommer att vara <noindex><a rel=\"nofollow\" href=\"http:\/\/grokbase.com\/t\/gg\/mongodb-user\/128r0h5gzw\/inserting-into-300-000-size-embedded-array-is-slow-even-w-o-indexes\">l\u00e5ngsamma<\/a><\/noindex>. <\/p>\n<h3>Kom ih\u00e5g att ordningen f\u00f6r stegen i aggregation \u00e4r viktig<\/h3>\n<p>\nI en databas med en fr\u00e5geoptimerare \u00e4r de fr\u00e5gor du skriver f\u00f6rklaringar av vad du vill ha, och inte hur du vill ha det. Den h\u00e4r mekanismen fungerar p\u00e5 ett s\u00e4tt som liknar att l\u00e4gga en best\u00e4llning i en restaurang: vanligtvis best\u00e4ller du bara en r\u00e4tt, snarare \u00e4n att ge detaljerade instruktioner till kocken.<\/p>\n<p>I MongoDB instruerar du kocken. Till exempel, se till att data passerar genom <code>reduce<\/code> s\u00e5 tidigt som m\u00f6jligt i pipelinen med hj\u00e4lp av <code>$match<\/code> och <code>$project<\/code>, och sorteringen sker f\u00f6rst efter\u00e5t. <code>reduce<\/code>, och att s\u00f6kningen sker precis i den ordning som du beh\u00f6ver. Att ha en fr\u00e5geoptimerare som tar bort on\u00f6digt arbete, optimerar stegen och v\u00e4ljer typ av anslutning kan vara en lyx. I MongoDB f\u00e5r du mer kontroll till priset av bekv\u00e4mlighet.<\/p>\n<p>Verktyg som <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/\">Studio 3T<\/a><\/noindex> f\u00f6renklar konstruktionen av aggregationsfr\u00e5gor i <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/build-mongodb-aggregation-queries\/\">MongoDB<\/a><\/noindex>. Aggregation Editor-funktionen l\u00e5ter dig till\u00e4mpa pipeline-operat\u00f6rer steg f\u00f6r steg och kontrollera ing\u00e5ngs- och utdata i varje steg f\u00f6r att f\u00f6renkla fels\u00f6kning. <\/p>\n<h3>Anv\u00e4ndning av snabb skrivning<\/h3>\n<p>\nInstallera aldrig h\u00f6ghastighetsinloggningsinst\u00e4llningar i MongoDB med l\u00e5g tillf\u00f6rlitlighet. Detta l\u00e4ge <i>\u00abfile-and-forget\u00bb<\/i> verkar snabbt eftersom kommandot \u00e5terv\u00e4nder innan skrivningen genomf\u00f6rs. Om systemet kraschar innan data skrivs till disken g\u00e5r de f\u00f6rlorade och hamnar i ett inkonsekvent tillst\u00e5nd. Lyckligtvis ing\u00e5r journalf\u00f6ring i 64-bitars MongoDB. <\/p>\n<p>Lagringsmotorerna MMAPv1 och WiredTiger anv\u00e4nder journalf\u00f6ring f\u00f6r att f\u00f6rhindra detta, \u00e4ven om WiredTiger kan \u00e5terh\u00e4mta sig till den senaste konsekventa <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/wiredtiger\/#storage-wiredtiger-checkpoints\">kontrollpunkten<\/a><\/noindex>, om journalf\u00f6ringen st\u00e4ngs av.<\/p>\n<p>Journalf\u00f6ring garanterar att databasen \u00e4r i ett konsekvent tillst\u00e5nd efter \u00e5terst\u00e4llning och beh\u00e5ller all data fram till den tidpunkt d\u00e5 den loggas. Frekvensen f\u00f6r loggning st\u00e4lls in med parametern <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#storage.journal.commitIntervalMs\">commitIntervalMs<\/a><\/noindex><\/code>. <\/p>\n<p>F\u00f6r att vara s\u00e4ker p\u00e5 inloggningar, se till att journalf\u00f6ringen \u00e4r aktiverad i konfigurationsfilen <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#configuration-file\">(storage.journal.enabled<\/a><\/noindex>)<\/code>, och att loggningsfrekvensen motsvarar den m\u00e4ngd information som du har r\u00e5d att f\u00f6rlora.<\/p>\n<h3>Sortering utan index<\/h3>\n<p>\nVid s\u00f6kning och aggregering uppst\u00e5r ofta behovet av att sortera data. F\u00f6rhoppningsvis g\u00f6rs detta vid ett av de slutliga stegen, efter att resultatet har filtrerats f\u00f6r att minska volymen av sorterad data. Och \u00e4ven i s\u00e5 fall beh\u00f6ver du <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/mongodb-index-strategy\/\">ett index<\/a><\/noindex>. Du kan anv\u00e4nda ett enkelt eller sammansatt index. <\/p>\n<p>Om det inte finns n\u00e5got l\u00e4mpligt index kan MongoDB klara sig utan det. Det finns en minnesbegr\u00e4nsning p\u00e5 32 MB f\u00f6r den totala storleken p\u00e5 alla dokument i <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.org\/manual\/reference\/limits\/#Sort-Operations\">sorteringsoperationen<\/a><\/noindex>, och om MongoDB n\u00e5r denna gr\u00e4ns kommer den antingen att ge ett felmeddelande eller returnera <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sitepoint.com\/7-simple-speed-solutions-mongodb\/\">en tom resultatsats<\/a><\/noindex>.<\/p>\n<h3>S\u00f6kning utan indexst\u00f6d<\/h3>\n<p>\nS\u00f6kfr\u00e5gor utf\u00f6r en funktion som liknar JOIN-operationen i SQL. F\u00f6r att fungera b\u00e4ttre beh\u00f6ver de en index f\u00f6r nyckelv\u00e4rdet som anv\u00e4nds som en extern nyckel. Detta \u00e4r inte uppenbart, eftersom anv\u00e4ndningen inte \u00e5terspeglas i <code>explain()<\/code>. S\u00e5dana index \u00e4r ett komplement till indexet som \u00e4r skrivet i <code>explain()<\/code>, vilket i sin tur anv\u00e4nds av pipelineoperat\u00f6rer <code>$match<\/code> och <code>$sort<\/code>, n\u00e4r de upptr\u00e4der i b\u00f6rjan av pipelinen. Index kan nu omfatta vilken fas som helst <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/aggregation-pipeline\/#aggregation-pipeline-operators-and-performance\">i aggregationspipen<\/a><\/noindex>. <\/p>\n<h3>Avst\u00e5 fr\u00e5n att anv\u00e4nda fleruppdateringar<\/h3>\n<p>\nMetod <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/\">db.collection.update()<\/a><\/noindex><\/code> som anv\u00e4nds f\u00f6r att \u00e4ndra en del av ett befintligt dokument eller hela dokumentet, upp till fullst\u00e4ndig ers\u00e4ttning beroende p\u00e5 det parameter du angivit <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#update-parameter\">update<\/a><\/noindex><\/code>. Det \u00e4r inte s\u00e5 uppenbart att det inte kommer att bearbeta alla dokument i samlingen, f\u00f6rr\u00e4n du st\u00e4ller in parametern <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#multi-parameter\">multi<\/a><\/noindex><\/code> f\u00f6r att uppdatera alla dokument som uppfyller s\u00f6kkriterierna.<\/p>\n<h3>T\u00e4nk p\u00e5 vikten av ordningen p\u00e5 nycklar i hash-tabellen.<\/h3>\n<p>\nI JSON best\u00e5r ett objekt av en osorterad samling som inneh\u00e5ller noll eller fler namn\/v\u00e4rde-par, d\u00e4r namnet \u00e4r en str\u00e4ng och v\u00e4rdet \u00e4r en str\u00e4ng, ett nummer, ett booleskt v\u00e4rde, noll, ett objekt eller en array.<\/p>\n<p>Tyv\u00e4rr l\u00e4gger BSON stor vikt vid ordningen vid s\u00f6kning. I MongoDB har ordningen p\u00e5 nycklar inne i inb\u00e4ddade objekt <noindex><a rel=\"nofollow\" href=\"http:\/\/devblog.me\/wtf-mongo\">betydelse<\/a><\/noindex>, dvs. <code>{ firstname: \"Phil\", surname: \"factor\" }<\/code> \u00e4r inte detsamma som <code>{ { surname: \"factor\", firstname: \"Phil\" }<\/code>. Det betyder att du m\u00e5ste beh\u00e5lla ordningen p\u00e5 namn\/v\u00e4rde-par i dokumenten om du vill vara s\u00e4ker p\u00e5 att du hittar dem.<\/p>\n<h3>F\u00f6rv\u00e4xla inte <i>\u00abnull\u00bb<\/i> och <i>\u00abundefined\u00bb<\/i><\/h3>\n<p>\nV\u00e4rde <i>\u00abundefined\u00bb<\/i> har aldrig varit till\u00e5tet i JSON, enligt <noindex><a rel=\"nofollow\" href=\"http:\/\/www.ecma-international.org\/publications\/files\/ECMA-ST\/ECMA-404.pdf\">den officiella standarden<\/a><\/noindex> JSON (ECMA-404, Sektion 5), trots att det anv\u00e4nds i JavaScript. Dessutom \u00e4r det f\u00f6r BSON f\u00f6r\u00e5ldrat och konverteras till <code>$null<\/code>, vilket inte alltid \u00e4r en bra l\u00f6sning. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/meteor\/meteor\/issues\/1646#issuecomment-29682964\">Undvik att anv\u00e4nda <i>\u00abundefined\u00bb<\/i> i MongoDB<\/a><\/noindex>.<\/p>\n<h3>Anv\u00e4ndning <code>$limit()<\/code> utan <code>$sort()<\/code><\/h3>\n<p>\nMycket ofta, n\u00e4r du utvecklar i MongoDB, \u00e4r det bra att se ett exempel p\u00e5 resultatet som kommer att returneras fr\u00e5n en fr\u00e5ga eller aggregation. F\u00f6r detta \u00e4ndam\u00e5l kommer du att ha nytta av <code>$limit()<\/code>, men det b\u00f6r aldrig finnas i den slutliga versionen av koden, s\u00e5vida du inte anv\u00e4nder det framf\u00f6r <code>$sort<\/code>. Den h\u00e4r mekanismen \u00e4r n\u00f6dv\u00e4ndig eftersom du annars inte kan garantera resultatordningen och inte kan utf\u00f6ra p\u00e5litliga datavisningar. I den \u00f6vre delen av resultatet kommer du att f\u00e5 olika poster beroende p\u00e5 sortering. F\u00f6r att fungera p\u00e5litligt m\u00e5ste fr\u00e5gor och aggregeringar vara deterministiska, det vill s\u00e4ga ge samma resultat varje g\u00e5ng de k\u00f6rs. Kod som har <code>$limit()<\/code>, men inte <code>$sort<\/code>, kommer inte att vara deterministisk och kan senare orsaka fel som \u00e4r sv\u00e5ra att sp\u00e5ra.<\/p>\n<h3>Slutsats<\/h3>\n<p>\nDet enda s\u00e4ttet att bli besviken p\u00e5 MongoDB \u00e4r att j\u00e4mf\u00f6ra den direkt med en annan typ av databas, s\u00e5som RDBMS, eller att n\u00e4rma sig anv\u00e4ndningen utifr\u00e5n vissa f\u00f6rv\u00e4ntningar. Det \u00e4r som att j\u00e4mf\u00f6ra en apelsin med en gaffel. Databassystem har specifika m\u00e5l. Det \u00e4r b\u00e4st att bara f\u00f6rst\u00e5 och uppskatta dessa skillnader f\u00f6r sig sj\u00e4lv. Det skulle vara en skam att pressa utvecklarna av MongoDB f\u00f6r v\u00e4gen de tvingades g\u00e5 med RDBMS. Jag vill se nya och intressanta s\u00e4tt att l\u00f6sa gamla problem, som att s\u00e4kerst\u00e4lla dataintegritet och att skapa datorsystem som \u00e4r motst\u00e5ndskraftiga mot fel och attacker fr\u00e5n illvilliga akt\u00f6rer.<\/p>\n<p>Implementeringen av ACID-transaktionalitet i MongoDB version 4.0 \u00e4r ett bra exempel p\u00e5 hur viktiga f\u00f6rb\u00e4ttringar kan inf\u00f6ras p\u00e5 ett innovativt s\u00e4tt. Multidokument- och multioperationstransaktioner \u00e4r nu atom\u00e4ra. M\u00f6jligheten att reglera den tid som beh\u00f6vs f\u00f6r att f\u00e5 l\u00e5s och avsluta h\u00e4ngande transaktioner, samt att \u00e4ndra isoleringsniv\u00e5n, har ocks\u00e5 lagts till.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\"><img decoding=\"async\" alt=\"14 saker jag \u00f6nskar att jag visste innan jag b\u00f6rjade arbeta med MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9966ff2613efab52aac99c2a0eda5c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<h3>L\u00e4s mer:<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/519340\/\">Hur man laddar upp data till Google BigQuery<\/a><\/noindex><\/li>\n<\/ul>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/520412\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b: \u041a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u0443 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 MongoDB \u043e\u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. \u0418\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432. \u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 MongoDB, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 MongoDB [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95149,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95148","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd4714 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0437\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-25T17:43:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-25T17:43:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd4714 saker jag skulle vilja veta innan jag b\u00f6rjade jobba med MongoDB | ProHoster","description":"\u00d6vers\u00e4ttningen av artikeln har f\u00f6rberetts med anledning av starten av kursen \"Icke-relationella databaser\".","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd4714 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0437\u043d\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 MongoDB | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0434\u0432\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 \u00ab\u041d\u0435\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb.","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-25T17:43:09+00:00","article:modified_time":"2020-09-25T17:43:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95148","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:11:32","updated":"2022-10-03 07:39:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/95148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=95148"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/95148\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/95149"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=95148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=95148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=95148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}