Les remarques suivantes sont merdiques. Désolé pour le dérangement.
Présentation de MongoDB
Seront ensuite présentés les logiciels nécessaires pour faire tourner MongoDB.
Je complèterais, en disant que "MongoDB" est un terme désignant en fait un ensemble d'outils et que nous allons revenir sur chacun d'eux par la suite.
Fonctionnalités principales
Une collection est simplement une liste de documents.
N'est-ce pas plutôt un ensemble de documents ? Autrement dit, Mongo indexe-t-il les documents d'une collection ?
On aura par exemple une collection client, une collection arbres, etc.
Je me posais justement la question : y a-t-il une convention concernant le nombre (singulier ou pluriel) du nom d'une collection ?
Un document JSON est délimité par des accolades { document }
Ca fait bizarre de commencer par ça. Je ferais plutôt un truc du genre : "Un document JSON est une liste (voir remarque ci-dessous) de clés auxquelles sont associées des valeurs. Il est délimité par des accolades, de la manière suivante :".
une liste de clés auxquelles sont associés des valeurs
Je préciserais de plus que les clés sont nécessairement des chaînes.
Beaucoup de langages informatiques utilisent le paradigme de la programmation orientée objets. Ces langages manipulent des objets, qui vont avoir plusieurs propriétés, certaines de ces propriétés étant elles-mêmes des objets ou des listes d'objets. Dans MongoDB, un document est le pendant d'un objet. On peut stocker directement des documents complexes dans Mongo.
Je ne suis pas sûr que ça aide les débutants à comprendre.
Si on peut stocker des documents complètement différents dans une collection, pourquoi ne pas tout stocker dans une seule collection ? Pourquoi même avoir des collections, et pas tout simplement un ensemble de documents ?
L'exemple ne me semble pas assez précis et je ne suis pas certain de bien le comprendre : si je mélange stylos et feuilles dans un tiroir mais que je n'en ai qu'un de chaque, cela ne jouera pas sur mon temps de recherche ; ainsi, c'est plus le nombre que le type des données qui joue sur l'efficacité, non ? Par exemple, je ne vois pas pourquoi rechercher un document nommé "Aragorn" prendrait plus de temps dans la première collection que dans la seconde :
| {
"latitude": 0,
"longitude": 0,
"population": 5000
},
{
"nom": "Aragorn",
"genre": 0, // Homme
"arme": ["épée"]
}
|
| {
"nom": "Frodon",
"genre": 0,
"arme": ["lance-pierres"]
},
{
"nom": "Aragorn",
"genre": 0, // Homme
"arme": ["épée"]
}
|
Comptes-tu dédier un chapitre/extrait à la conception d'une base Mongo ? Par exemple, je me demande s'il est préférable de créer des collections garçons
et filles
ou d'en créer une personnes
avec un champ pour le genre. J'imagine que ça dépend si mes recherches porteront ou non sur plusieurs genres (autrement dit, sur les personnes en générale et pas seulement sur que des garçons ou que des filles). Le cas échéant, partager en deux collections ralentira les recherches (il faudra sonder deux collections au lieu d'une). Dans le cas contraire, si filles et garçons sont clairement séparés au niveau des recherches, les mettre dans la même collection augmente le nombre d'éléments de celle-ci et ralentit de facto les recherches.
Ce paragraphe est une conversation avec moi-même mais permet d'éclairer un peu ma remarque ci-dessus. Du moins, c'est plus clair pour moi maintenant.
Une autre question que je me pose à propos des collections est : à quel point factoriser ? Si j'ai une collection de personnages, chacun ayant un champ ville
contenant un document, me faut-il créer une collection villes
, sachant que beaucoup de personnages pourront habiter la même ville ?
On peut faire des recherches par comparaison directe ("tous les livres de Charles Dickens" par exemple), mais aussi en faisant des comparaisons
"On peut faire des recherches par comparaison directe mais aussi en faisant des comparaisons" fait bizarre.
de manière ordonnée. Ainsi, quand la requête se fait sur la portion en question, il est plus facile de retrouver les documents qui correspondent au critère demandé
Quand le critère de recherche est le même que celui d'indexation, non ? A priori, ranger mes documents selon leur champ nom
n'accélère pas ma recherche si celle-ci se fait sur un autre champ.
plusieurs copies, placées sur des serveurs. différents
Il y a un point (".") gênant.
gérer ces ensembles de copies, appelés "réplicats"
Ce sont les ensembles qui sont appelés "réplicats" ou les copies elles-mêmes ?
D'ailleurs, tu n'as pas parlé plus haut d'ensembles. Tu as juste dit qu'on copiait la base et la stockait sur d'autres serveurs.
en créant facilement un ensemble de fragments (en anglais, "shards"). Chaque fragment contient alors un sous-ensemble des données
Je pense que tu introduis le terme "fragments" un peu trop brutalement. Comme j'ignore ce que c'est exactement, je ne peux pas proposer de formulation exacte, mais je ferais un truc du genre : "en créant facilement un ensemble de TODO, appelés "fragments" (en anglais, "shards"). Chaque fragment contient alors un sous-ensemble des données".
Fonctionnalités absentes ou restreintes
MongoDB ne permet pas de telles transactions.
Pourquoi donc ? Ca ne semble pas compliqué à implémenter pourtant, si ?
lorsque l'on enregistre des changements dans un document, on peut être sûr que tous les changements seront effectués, qu'aucun ne le sera.
Il manque un "ou".
On a bien une garantie d'atomicité avec MongoDB, mais elle est plus restreinte que dans les bases de données relationnelles, et n'est pas faite au même niveau.
Je préciserais. Par "plus restreinte", tu veux dire que l'atomicité n'est vérifiée que pour un seul document ? Que signifie alors "au même niveau" ?
sans étape intermédiaire dans laquelle les données sont invalides
Je préciserais. Je ne suis pas du tout un expert, mais j'imagine qu'il y a nécessairement un moment où les données sont invalides. Seulement, on ne peut y accéder.
Une fois le changement effectué, toute transaction sur la base de données ne doit avoir accès qu'au nouvel état valide.
"Une fois le changement effectué, toute opération sur la base de données ne doit pouvoir se faire que sur le nouvel état valide." ? Le terme "transaction" est déjà utilisé pour désigner un ensemble atomique d'opérations.
Par défaut, MongoDB garantit la cohérence des données. Cependant, dans certaines configurations, MongoDB peut être cohérente au final.
Au final de quoi ?
Imaginons qu'on veuille modifier tous les documents d'une collection pour leur ajouter un champ.
Tu dis en introduction de cet extrait que les propriétés ACID sont vérifiées par les SGBDR. Là, tu parles d'une base NoSQL. Je formulerais ainsi : "Toute opération sur les données doit être isolée des autres opérations potentielles, ce qui n'est pas complètement respecté par Mongo. En effet, imaginons".
Si pendant que cette opération se déroule, on tente de modifier un certain document
Je remplacerais "modifier un certain document" par une opération précise, du genre "soustraire 42 à l'un de ses champs". En effet, quand tu parles de "modification" par la suite, on ne sait plus trop si tu fais référence à l'ajout d'un champ à tous les documents ou à l'opération effectuée pendant cet ajout. Tu pourras alors clairement parler d'"ajout du champ" ou de "la soustraction".
qui garde une trace de chaque opération d'écriture réalisée
"à réaliser" plutôt, non ? Enfin pour moi, une opération d'écriture est une écriture sur le disque, pas seulement dans le journal. Mais peut-être me trompé-je.
Toutes les 60 secondes (par défaut), MongoDB applique les opérations du journal aux données sur le disque.
Cela signifie que si j'insère un document dans ma base maintenant, il est possible que ce ne soit pas vraiment fait avant une minute ? Ca craint pour la cohérence là, non ?
Modèle client - serveur
Il est possible (et même courant) d'avoir plusieurs clients différents communiquant avec le même serveur
Ce n'est pas très clair : parles-tu de logiciels clients différents ou d'instances démarrées de ces logiciels ?
Installation et démarrage
Je préciserais qu'il s'agit ici d'installer tous les composants (ou alors je n'ai pas compris).
Il suffira de le préciser au démarrage du serveur.
"comme nous le voyons plus bas." ?
Présentation du shell Mongo
Vous pouvez donc écrire des instructions en JS, elles s'exécuteront sans problème.
Comme c'est la première fois qu'on joue avec le shell, j'afficherais le résultat des commandes. Par exemple :
Pour quitter mongo, vous pouvez soit fermer votre utilitaire de ligne de commande, soit utiliser la fonction quit().
Moi, je fais Ctrl+C.
Sinon, "Pour quitter mongo" n'est pas très précis. En l'occurrence, quit()
n'est valable que pour le client. Oui c'est évident, mais tu auras des lecteurs noobs.