{"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\/fr\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb","title":{"rendered":"14 choses que j'aurais aim\u00e9 savoir avant de commencer \u00e0 travailler avec MongoDB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><b><i>La traduction de l'article a \u00e9t\u00e9 pr\u00e9par\u00e9e en pr\u00e9vision du lancement du cours <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\">Bases de donn\u00e9es non relationnelles<\/a><\/noindex>.<\/i><\/b><\/p>\n<p><img decoding=\"async\" alt=\"14 choses que j&#039;aurais aim\u00e9 savoir avant de commencer \u00e0 travailler avec MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9b4979be27e0090543b28150d90fa8df.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Principaux points :<\/p>\n<ul>\n<li>Il est essentiel de concevoir un sch\u00e9ma, m\u00eame s'il n'est pas obligatoire dans MongoDB.<\/li>\n<li>De m\u00eame, les index doivent correspondre \u00e0 votre sch\u00e9ma et \u00e0 vos mod\u00e8les d'acc\u00e8s. <\/li>\n<li>\u00c9vitez d'utiliser de grands objets et de grands tableaux.<\/li>\n<li>Soyez prudent avec les param\u00e8tres de MongoDB, notamment en ce qui concerne la s\u00e9curit\u00e9 et la fiabilit\u00e9.<\/li>\n<li>MongoDB n'a pas d'optimiseur de requ\u00eates, il faut donc \u00eatre prudent lors de l'ex\u00e9cution des op\u00e9rations de requ\u00eate.<\/li>\n<\/ul>\n<p>\nJe travaille avec des bases de donn\u00e9es depuis longtemps, mais je n'ai d\u00e9couvert MongoDB que r\u00e9cemment. Il y a plusieurs choses que j'aimerais savoir avant de commencer \u00e0 l'utiliser. Lorsqu'une personne a d\u00e9j\u00e0 de l'exp\u00e9rience dans un domaine, elle a des pr\u00e9jug\u00e9s sur ce que sont les bases de donn\u00e9es et ce qu'elles font. Dans l'espoir de faciliter la compr\u00e9hension pour d'autres, je pr\u00e9sente une liste des erreurs courantes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Cr\u00e9er un serveur MongoDB sans authentification<\/h3>\n<p>\nEn effet, MongoDB est install\u00e9 par d\u00e9faut sans authentification. Pour une station de travail accessible localement, cette pratique est normale. Mais \u00e9tant donn\u00e9 que MongoDB est un syst\u00e8me multi-utilisateur qui utilise de grandes quantit\u00e9s de m\u00e9moire, il est pr\u00e9f\u00e9rable de l'installer sur un serveur avec la quantit\u00e9 maximale de RAM possible dans vos conditions, m\u00eame si vous pr\u00e9voyez de l'utiliser uniquement pour le d\u00e9veloppement. L'installation sur un serveur via le port par d\u00e9faut peut poser probl\u00e8me, surtout si une requ\u00eate peut ex\u00e9cuter du code JavaScript (par exemple, <code>$where<\/code> comme id\u00e9e pour <noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">injection<\/a><\/noindex>). <\/p>\n<p>Il existe plusieurs m\u00e9thodes d'authentification, mais le plus simple est de d\u00e9finir un ID\/ mot de passe pour l'utilisateur. Utilisez cette id\u00e9e, en attendant de r\u00e9fl\u00e9chir \u00e0 une authentification plus fantaisiste bas\u00e9e sur <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/security-ldap-external\/\">LDAP<\/a><\/noindex>. En ce qui concerne la s\u00e9curit\u00e9, MongoDB doit \u00eatre mis \u00e0 jour en permanence et les journaux doivent toujours \u00eatre v\u00e9rifi\u00e9s pour d\u00e9tecter un acc\u00e8s non autoris\u00e9. Personnellement, j'aime choisir un autre port comme port par d\u00e9faut.<\/p>\n<h3>N'oubliez pas de lier la surface d'attaque \u00e0 MongoDB<\/h3>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/\">Liste de contr\u00f4le pour la s\u00e9curit\u00e9 de MongoDB<\/a><\/noindex> contient de bons conseils pour r\u00e9duire le risque d'intrusion dans le r\u00e9seau et de fuite de donn\u00e9es. Il est facile de balayer cette pr\u00e9occupation et de dire qu'un serveur de d\u00e9veloppement n'a pas besoin d'un niveau \u00e9lev\u00e9 de s\u00e9curit\u00e9. Cependant, la situation est plus complexe et concerne tous les serveurs MongoDB. En particulier, s'il n'y a pas de raison valable d'utiliser <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\">groupe<\/a><\/noindex><\/code> ou <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/query\/where\/#op._S_where\">$where<\/a><\/noindex>, il faut d\u00e9sactiver l'utilisation de code arbitraire en JavaScript en modifiant le fichier de configuration <code><noindex><a rel=\"nofollow\" href=\"https:\/\/lockmedown.com\/securing-node-js-mongodb-security-injection-attacks\/\">javascriptActiv\u00e9:false<\/a><\/noindex><\/code>. \u00c9tant donn\u00e9 que dans MongoDB standard, les fichiers de donn\u00e9es ne sont pas chiffr\u00e9s, il est sage de lancer MongoDB avec <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/administration\/security-checklist\/#run-mongodb-with-a-dedicated-user\">Utilisateur d\u00e9di\u00e9<\/a><\/noindex>, qui a un acc\u00e8s complet aux fichiers, avec un acc\u00e8s restreint uniquement pour lui et la possibilit\u00e9 d'utiliser ses propres outils de contr\u00f4le d'acc\u00e8s aux fichiers du syst\u00e8me d'exploitation.<\/p>\n<h3>Erreur lors de la conception du sch\u00e9ma<\/h3>\n<p>\nMongoDB n'utilise pas de sch\u00e9ma. Mais cela ne signifie pas qu'un sch\u00e9ma n'est pas n\u00e9cessaire. Si vous souhaitez simplement stocker des documents sans aucun sch\u00e9ma coh\u00e9rent, les sauvegarder peut \u00eatre rapide et simple, mais les extraire par la suite peut \u00eatre <noindex><a rel=\"nofollow\" href=\"https:\/\/www.compose.com\/articles\/mongodb-with-and-without-schemas\/\">extr\u00eamement difficile<\/a><\/noindex>. <\/p>\n<p>L'article classique \u00ab<i><noindex><a rel=\"nofollow\" href=\"https:\/\/www.mongodb.com\/blog\/post\/6-rules-of-thumb-for-mongodb-schema-design-part-1\">6 r\u00e8gles empiriques pour la conception de sch\u00e9mas MongoDB \u00bb<\/a><\/noindex><\/i> vaut la peine d'\u00eatre lu, et des fonctions telles que <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/schema-explorer\/\">Schema Explorer<\/a><\/noindex> dans l'outil tiers Studio 3T, devraient \u00eatre utilis\u00e9es pour des contr\u00f4les r\u00e9guliers des sch\u00e9mas.<\/p>\n<h3>N'oubliez pas l'ordre de tri<\/h3>\n<p>\nOublier l'ordre de tri peut provoquer la plus grande d\u00e9ception et prendre plus de temps que n'importe quelle autre configuration incorrecte. Par d\u00e9faut, MongoDB utilise <noindex><a rel=\"nofollow\" href=\"https:\/\/jira.mongodb.org\/browse\/SERVER-1920\">le tri binaire<\/a><\/noindex>. Mais il est peu probable qu'il soit utile \u00e0 quiconque. Les tris sensibles \u00e0 la casse, \u00e0 l'accent, et binaires \u00e9taient consid\u00e9r\u00e9s comme des curiosit\u00e9s anachroniques aux c\u00f4t\u00e9s des perles, des caftans et des moustaches boucl\u00e9es dans les ann\u00e9es 80. Aujourd'hui, leur utilisation est inacceptable. Dans la vie r\u00e9elle, \u00abmoto\u00bb est la m\u00eame chose que \u00abMoto\u00bb. Et \u00abBritannique\u00bb et \u00abbritannique\u00bb d\u00e9signent le m\u00eame lieu. Une lettre minuscule est simplement l'\u00e9quivalent minuscule d'une lettre majuscule. Et ne me faites pas parler du tri des diacritiques. Lors de la cr\u00e9ation d'une base de donn\u00e9es dans MongoDB, utilisez des param\u00e8tres de tri insensibles \u00e0 l'accent et <noindex><a rel=\"nofollow\" href=\"https:\/\/weblogs.sqlteam.com\/dang\/archive\/2009\/07\/26\/Collation-Hell-Part-1.aspx\">\u00e0 la casse<\/a><\/noindex>, qui correspondent \u00e0 la langue et <noindex><a rel=\"nofollow\" href=\"https:\/\/derickrethans.nl\/mongodb-collation-revised.html\">\u00e0 la culture des utilisateurs du syst\u00e8me<\/a><\/noindex>. Cela simplifiera consid\u00e9rablement la recherche dans les donn\u00e9es textuelles.<\/p>\n<h3>Cr\u00e9ation de collections avec de grands documents<\/h3>\n<p>\nMongoDB est capable de stocker de gros documents allant jusqu'\u00e0 16 Mo dans des collections, mais <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/gridfs\/#gridfs\">GridFS<\/a><\/noindex> est con\u00e7ue pour les documents de taille sup\u00e9rieure \u00e0 16 Mo. Cependant, m\u00eame si de grands documents peuvent y \u00eatre stock\u00e9s, ce n'est pas la meilleure pratique. MongoDB fonctionne mieux lorsque vous enregistrez des documents individuels qui ne p\u00e8sent que quelques kilo-octets, les consid\u00e9rant plut\u00f4t comme des lignes dans un tableau SQL \u00e9tendu. Les gros documents peuvent causer des probl\u00e8mes avec <noindex><a rel=\"nofollow\" href=\"https:\/\/www.reddit.com\/r\/mongodb\/comments\/573fqr\/question_mongodb_terrible_performance_for_a\/\">la performance<\/a><\/noindex>.<\/p>\n<h3>La cr\u00e9ation de documents contenant de grands tableaux <\/h3>\n<p>\nLes documents peuvent contenir des tableaux. Il est pr\u00e9f\u00e9rable que le nombre d'\u00e9l\u00e9ments dans le tableau soit bien en dessous d'un nombre \u00e0 quatre chiffres. Si des \u00e9l\u00e9ments sont fr\u00e9quemment ajout\u00e9s au tableau, il d\u00e9passera le document qui le contient, et il faudra le <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/data-model-operations\/#document-growth\">d\u00e9placer<\/a><\/noindex>, ce qui signifie qu'il faudra <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/write-performance\/#document-growth\">mettre \u00e0 jour les index<\/a><\/noindex>. Lors de la r\u00e9indexation d'un document avec un grand tableau, les index seront souvent r\u00e9\u00e9crits, car il existe une <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.mongodb.org\/manual\/core\/index-multikey\/\">entr\u00e9e<\/a><\/noindex>, qui conserve son index. Cette r\u00e9indexation a \u00e9galement lieu lorsque le document est ins\u00e9r\u00e9 ou supprim\u00e9. <\/p>\n<p>MongoDB dispose d'un appel\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/mmapv1\/#record-allocation-strategies\">\u00ab taux d'occupation \u00bb<\/a><\/noindex>, qui fournit de l'espace pour la croissance des documents afin de minimiser ce probl\u00e8me. <br \/>\nVous pourriez penser qu'il est possible de se passer d'indexation des tableaux. Malheureusement, en l'absence d'index, vous pourriez rencontrer d'autres probl\u00e8mes. \u00c9tant donn\u00e9 que les documents sont parcourus de d\u00e9but en fin, la recherche d'\u00e9l\u00e9ments \u00e0 la fin du tableau prendra plus de temps, et la plupart des op\u00e9rations li\u00e9es \u00e0 ce document seront <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\">lentes<\/a><\/noindex>. <\/p>\n<h3>N'oubliez pas que l'ordre des phases dans l'agr\u00e9gation compte<\/h3>\n<p>\nDans un syst\u00e8me de base de donn\u00e9es avec un optimiseurs de requ\u00eates, les requ\u00eates que vous \u00e9crivez sont des explications de ce que vous voulez obtenir, et non de la fa\u00e7on de l'obtenir. Cela fonctionne de mani\u00e8re analogue \u00e0 une commande au restaurant : g\u00e9n\u00e9ralement, vous commandez juste un plat sans donner d'instructions d\u00e9taill\u00e9es au chef.<\/p>\n<p>Dans MongoDB, vous instruisez le chef. Par exemple, assurez-vous que les donn\u00e9es passent par <code>reduce<\/code> le plus t\u00f4t possible dans le pipeline avec <code>$match<\/code> et <code>$project<\/code>, tandis que le tri n'intervient qu'apr\u00e8s. <code>reduce<\/code>, et que la recherche se d\u00e9roule exactement dans l'ordre dont vous avez besoin. La pr\u00e9sence d'un optimiseurs de requ\u00eates, qui \u00e9limine le travail superflu, ordonne de mani\u00e8re optimale les \u00e9tapes et s\u00e9lectionne le type de connexion, peut vous g\u00e2ter. Avec MongoDB, vous avez plus de contr\u00f4le sur le prix du confort.<\/p>\n<p>Des outils comme <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/\">Studio 3T<\/a><\/noindex> faciliteront la construction des requ\u00eates d'agr\u00e9gation dans <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/build-mongodb-aggregation-queries\/\">MongoDB<\/a><\/noindex>. La fonction Aggregation Editor vous permettra d'appliquer des op\u00e9rateurs de pipeline \u00e9tape par \u00e9tape, et \u00e9galement de v\u00e9rifier les donn\u00e9es d'entr\u00e9e et de sortie \u00e0 chaque \u00e9tape pour simplifier le d\u00e9bogage. <\/p>\n<h3>Utilisation d'une \u00e9criture rapide<\/h3>\n<p>\nNe jamais configurer dans MongoDB des param\u00e8tres d'\u00e9criture \u00e0 haute vitesse mais de faible fiabilit\u00e9. Ce mode <i>\u00abfile-and-forget\u00bb<\/i> semble rapide, car la commande retourne avant que l'\u00e9criture ne soit effectu\u00e9e. Si le syst\u00e8me \u00e9choue avant que les donn\u00e9es soient \u00e9crites sur le disque, elles seront perdues et se retrouveront dans un \u00e9tat incoh\u00e9rent. Heureusement, le MongoDB 64 bits inclut un journal. <\/p>\n<p>Les moteurs de stockage MMAPv1 et WiredTiger utilisent le journal pour \u00e9viter cela, bien que WiredTiger puisse se r\u00e9tablir jusqu'au dernier <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/wiredtiger\/#storage-wiredtiger-checkpoints\">point de contr\u00f4le<\/a><\/noindex>, si le journal est d\u00e9sactiv\u00e9.<\/p>\n<p>Le journal garantit que la base de donn\u00e9es est dans un \u00e9tat coh\u00e9rent apr\u00e8s la r\u00e9cup\u00e9ration et conserve toutes les donn\u00e9es jusqu'au moment de l'\u00e9criture dans le journal. La fr\u00e9quence des \u00e9critures est configur\u00e9e \u00e0 l'aide du param\u00e8tre <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#storage.journal.commitIntervalMs\">intervalDeValidationMs<\/a><\/noindex><\/code>. <\/p>\n<p>Pour vous assurer des \u00e9critures, assurez-vous que le journaling est activ\u00e9 dans le fichier de configuration <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/configuration-options\/#configuration-file\">(storage.journal.enabled<\/a><\/noindex>)<\/code>, et que la fr\u00e9quence des \u00e9critures correspond \u00e0 la quantit\u00e9 d'informations que vous pouvez vous permettre de perdre.<\/p>\n<h3>Tri sans index<\/h3>\n<p>\nLors de la recherche et de l'agr\u00e9gation, il est souvent n\u00e9cessaire de trier les donn\u00e9es. Esp\u00e9rons que cela se fait \u00e0 l'une des \u00e9tapes finales, apr\u00e8s le filtrage des r\u00e9sultats afin de r\u00e9duire le volume des donn\u00e9es \u00e0 trier. Et m\u00eame dans ce cas, vous aurez besoin d'un <noindex><a rel=\"nofollow\" href=\"https:\/\/studio3t.com\/knowledge-base\/articles\/mongodb-index-strategy\/\">index<\/a><\/noindex>. Vous pouvez utiliser un index simple ou compos\u00e9. <\/p>\n<p>S'il n'existe pas d'index appropri\u00e9, MongoDB s'en passera. Il existe une limite de m\u00e9moire de 32 Mo sur la taille totale de tous les documents dans <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.org\/manual\/reference\/limits\/#Sort-Operations\">l'op\u00e9ration de tri<\/a><\/noindex>, et si MongoDB atteint cette limite, elle renverra soit une erreur, soit <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sitepoint.com\/7-simple-speed-solutions-mongodb\/\">un ensemble de r\u00e9sultats vide<\/a><\/noindex>.<\/p>\n<h3>Recherche sans prise en charge des index<\/h3>\n<p>\nLes requ\u00eates de recherche remplissent une fonction similaire \u00e0 celle de l'op\u00e9ration JOIN dans SQL. Pour un meilleur fonctionnement, elles n\u00e9cessitent un index de valeur de cl\u00e9 utilis\u00e9 en tant que cl\u00e9 \u00e9trang\u00e8re. Cela n'est pas \u00e9vident car l'utilisation n'est pas refl\u00e9t\u00e9e dans <code>explain()<\/code>. Ces index sont un compl\u00e9ment \u00e0 l'index enregistr\u00e9 dans <code>explain()<\/code>, qui est utilis\u00e9 par les op\u00e9rateurs de pipeline <code>$match<\/code> et <code>$sort<\/code>, lorsqu'ils apparaissent au d\u00e9but du pipeline. Les index peuvent d\u00e9sormais couvrir n'importe quelle \u00e9tape <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/core\/aggregation-pipeline\/#aggregation-pipeline-operators-and-performance\">du pipeline d'agr\u00e9gation<\/a><\/noindex>. <\/p>\n<h3>L'abandon de l'utilisation des mises \u00e0 jour multiples<\/h3>\n<p>\nM\u00e9thode <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/\">db.collection.update()<\/a><\/noindex><\/code> est utilis\u00e9 pour modifier une partie d'un document existant ou l'ensemble du document, jusqu'\u00e0 le remplacer compl\u00e8tement en fonction du param\u00e8tre que vous avez d\u00e9fini <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#update-parameter\">update<\/a><\/noindex><\/code>. Il n'est pas aussi \u00e9vident qu'il ne traitera pas tous les documents de la collection, \u00e0 moins que vous ne d\u00e9finissiez le param\u00e8tre <code><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.mongodb.com\/manual\/reference\/method\/db.collection.update\/#multi-parameter\">multi<\/a><\/noindex><\/code> pour mettre \u00e0 jour tous les documents r\u00e9pondant aux crit\u00e8res de la requ\u00eate.<\/p>\n<h3>N'oubliez pas l'importance de l'ordre des cl\u00e9s dans une table de hachage<\/h3>\n<p>\nDans JSON, un objet est compos\u00e9 d'une collection non ordonn\u00e9e de z\u00e9ro ou plusieurs paires nom\/valeur, o\u00f9 le nom est une cha\u00eene et la valeur est une cha\u00eene, un nombre, un bool\u00e9en, z\u00e9ro, un objet ou un tableau.<\/p>\n<p>Malheureusement, BSON attache une grande importance \u00e0 l'ordre lors de la recherche. Dans MongoDB, l'ordre des cl\u00e9s \u00e0 l'int\u00e9rieur des objets int\u00e9gr\u00e9s <noindex><a rel=\"nofollow\" href=\"http:\/\/devblog.me\/wtf-mongo\">a de l'importance<\/a><\/noindex>, c'est-\u00e0-dire <code>{ firstname: \"Phil\", surname: \"factor\" }<\/code> n'est pas la m\u00eame chose que <code>{ { surname: \"factor\", firstname: \"Phil\" }<\/code>. Cela signifie que vous devez conserver l'ordre des paires nom\/valeur dans les documents si vous voulez \u00eatre assur\u00e9 de les retrouver.<\/p>\n<h3>Ne confondez pas <i>\"null\"<\/i> et <i>\"undefined\"<\/i><\/h3>\n<p>\nValeur <i>\"undefined\"<\/i> qui n'a jamais \u00e9t\u00e9 valide dans JSON, selon <noindex><a rel=\"nofollow\" href=\"http:\/\/www.ecma-international.org\/publications\/files\/ECMA-ST\/ECMA-404.pdf\">la norme officielle<\/a><\/noindex> JSON (ECMA-404, Section 5), m\u00eame s'il est utilis\u00e9 en JavaScript. De plus, pour BSON, il est obsol\u00e8te et se transforme en <code>$null<\/code>, ce qui n'est pas toujours une bonne solution. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/meteor\/meteor\/issues\/1646#issuecomment-29682964\">\u00c9vitez d'utiliser <i>\"undefined\"<\/i> dans MongoDB<\/a><\/noindex>.<\/p>\n<h3>Utilisation <code>$limit()<\/code> sans <code>$sort()<\/code><\/h3>\n<p>\nTr\u00e8s souvent, lorsque vous d\u00e9veloppez dans MongoDB, il est utile de simplement voir un \u00e9chantillon de r\u00e9sultat qui sera renvoy\u00e9 par la requ\u00eate ou l'agr\u00e9gation. Pour cette t\u00e2che, vous aurez besoin de <code>$limit()<\/code>, mais cela ne devrait jamais \u00eatre dans la version finale du code, \u00e0 moins que vous ne l'utilisiez avec <code>$sort<\/code>. Cette m\u00e9canique est n\u00e9cessaire, car sinon vous ne pouvez pas garantir l'ordre des r\u00e9sultats et vous ne pourrez pas consulter les donn\u00e9es de mani\u00e8re fiable. En haut du r\u00e9sultat, vous recevrez des enregistrements diff\u00e9rents en fonction du tri. Pour un fonctionnement fiable, les requ\u00eates et les agr\u00e9gations doivent \u00eatre d\u00e9terministes, c'est-\u00e0-dire produire les m\u00eames r\u00e9sultats \u00e0 chaque ex\u00e9cution. Le code dans lequel il y a <code>$limit()<\/code>, mais pas <code>$sort<\/code>, ne sera pas d\u00e9terministe et pourra par la suite g\u00e9n\u00e9rer des erreurs difficilement tra\u00e7ables.<\/p>\n<h3>Conclusion<\/h3>\n<p>\nLa seule fa\u00e7on de se d\u00e9sillusionner avec MongoDB est de la comparer directement avec un autre type de base de donn\u00e9es, comme un SGBD, ou d'aborder son utilisation avec des attentes sp\u00e9cifiques. C'est comme comparer une orange avec une fourchette. Les syst\u00e8mes de bases de donn\u00e9es poursuivent des objectifs pr\u00e9cis. Il est pr\u00e9f\u00e9rable de comprendre et d'\u00e9valuer ces diff\u00e9rences pour soi-m\u00eame. Il serait dommage de pousser les d\u00e9veloppeurs de MongoDB \u00e0 suivre le chemin qu'ils ont d\u00fb emprunter \u00e0 cause des SGBD. J'aimerais voir de nouvelles et int\u00e9ressantes fa\u00e7ons de r\u00e9soudre des probl\u00e8mes anciens, comme assurer l'int\u00e9grit\u00e9 des donn\u00e9es et cr\u00e9er des syst\u00e8mes de donn\u00e9es r\u00e9silients aux pannes et aux attaques malveillantes.<\/p>\n<p>L'introduction de la transactionnalit\u00e9 ACID dans MongoDB avec la version 4.0 est un bon exemple d'impl\u00e9mentation d'am\u00e9liorations importantes de mani\u00e8re innovante. Les transactions multidocument et multiop\u00e9rateurs sont d\u00e9sormais atomiques. Il est \u00e9galement possible de r\u00e9gler le temps n\u00e9cessaire pour obtenir des verrous et de terminer les transactions bloqu\u00e9es, ainsi que de modifier le niveau d'isolation.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/ZRL1\/\"><img decoding=\"async\" alt=\"14 choses que j&#039;aurais aim\u00e9 savoir avant de commencer \u00e0 travailler avec MongoDB\" src=\"\/wp-content\/uploads\/2020\/09\/9966ff2613efab52aac99c2a0eda5c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<h3>Lire aussi :<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/519340\/\">Comment charger des donn\u00e9es dans Google BigQuery<\/a><\/noindex><\/li>\n<\/ul>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/14-veshhej-kotorye-ya-hotel-by-znat-pered-nachalom-raboty-s-mongodb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47 14 choses que j'aimerais savoir avant de commencer \u00e0 travailler avec MongoDB | ProHoster","description":"La traduction de l'article a \u00e9t\u00e9 pr\u00e9par\u00e9e en pr\u00e9paration au lancement du cours \u00ab Bases de donn\u00e9es non relationnelles \u00bb.","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/95148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=95148"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/95148\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/95149"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=95148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=95148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=95148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}