Depuis des années, MongoDB est la base de données NoSQL incontournable pour les particuliers et les entreprises qui créent des applications à grande échelle. Il est open source, facilement évolutif et offre une haute disponibilité. Il prend également en charge les requêtes très complexes et le contrôle précis de la concurrence.
Cependant, les tâches nécessaires telles que l'installation de la base de données, son réglage pour maintenir des performances optimales sur de longues périodes et sa sécurisation ont tendance à nécessiter beaucoup d'efforts qualifiés et dévoués.
Heureusement, il existe une alternative plus simple : MongoDB Atlas, une version cloud entièrement gérée de la base de données.
Avec MongoDB Atlas, vous pouvez créer un cluster MongoDB sur n'importe quel fournisseur de cloud majeur de votre choix et commencer à utiliser ce cluster en quelques minutes. À l'aide de l'interface utilisateur basée sur un navigateur d'Atlas, vous pouvez également configurer intuitivement le cluster et surveiller ses performances.
Dans ce didacticiel, je vais vous montrer comment créer un cluster de niveau gratuit MongoDB Atlas et l'utiliser dans une application Python.
Prérequis
Avant de continuer, assurez-vous que les éléments suivants sont installés et configurés sur votre ordinateur :
- Python 3.4 ou version ultérieure
- pip 18.0 ou supérieur
1. Création d'un cluster
Pour pouvoir utiliser les services cloud de MongoDB, vous aurez besoin d'un compte MongoDB Atlas. Pour en créer un, rendez-vous sur sa page d'accueil et appuyez sur Commencer gratuitement bouton.
Après avoir rempli le court formulaire d'inscription, vous serez redirigé vers l'assistant de création de cluster. Dans sa première section, vous devrez choisir le fournisseur de cloud et la région que vous préférez.
Pour minimiser la latence du réseau, vous devriez idéalement choisir une région la plus proche de votre ordinateur. Pour l'instant, cependant, étant donné que nous créons un cluster de niveau gratuit, assurez-vous que la région que vous sélectionnez est celle qui dispose d'un niveau gratuit. De plus, si vous utilisez une machine virtuelle Google Cloud ou une instance Amazon EC2 comme environnement de développement, sélectionnez d'abord le fournisseur de cloud correspondant.
Au niveau de cluster section, sélectionnez la section M0 possibilité de créer votre cluster de niveau gratuit. Il offre 512 Mo d'espace de stockage, une version récente de MongoDB avec WiredTiger comme moteur de stockage, un jeu de répliques de trois nœuds et une généreuse bande passante de 10 Go par semaine.
Enfin, donnez un nom significatif au cluster et appuyez sur Créer un cluster bouton.
MongoDB Atlas prendra maintenant environ cinq minutes pour configurer votre cluster.
2. Configuration du cluster
Avant de commencer à utiliser le cluster, vous devrez fournir quelques détails liés à la sécurité, alors passez à la section Sécurité onglet.
Tout d'abord, dans les utilisateurs de MongoDB section, vous devez vous créer un nouvel utilisateur en appuyant sur Ajouter un nouvel utilisateur bouton. Dans la boîte de dialogue qui apparaît, saisissez le nom d'utilisateur et le mot de passe souhaités, sélectionnez Lire et écrire dans n'importe quelle base de données privilège, et appuyez sur Ajouter un utilisateur bouton.
Ensuite, dans la liste blanche IP , vous devez fournir une liste d'adresses IP à partir desquelles vous accéderez au cluster. Pour l'instant, il suffit de fournir l'adresse IP actuelle de votre ordinateur.
Appuyez sur Ajouter une adresse IP pour créer une nouvelle entrée d'adresse IP. Dans la boîte de dialogue qui apparaît, appuyez sur Ajouter l'adresse IP actuelle bouton pour remplir automatiquement l'entrée de la liste blanche domaine. De plus, si vous n'avez pas d'adresse IP statique, c'est une bonne idée de marquer qu'il s'agit d'une entrée temporaire en cochant la case Enregistrer en tant que liste blanche temporaire option. Enfin, appuyez sur Confirmer pour ajouter l'entrée.
3. Obtenir la chaîne de connexion
Vous aurez besoin d'une chaîne de connexion valide pour vous connecter à votre cluster à partir de votre application. Pour l'obtenir, rendez-vous dans la Présentation et appuyez sur Connecter bouton.
Dans la boîte de dialogue qui s'ouvre, sélectionnez Connectez votre application et appuyez sur J'utilise le pilote 3.6 ou ultérieur bouton. Vous devriez maintenant pouvoir voir votre chaîne de connexion. Il n'aura pas votre mot de passe réel, vous devrez donc le saisir manuellement. Après cela, notez la chaîne afin de pouvoir l'utiliser plus tard.
4. Installation du pilote Python
Pour pouvoir interagir avec votre cluster MongoDB Atlas par programmation, vous devez avoir un pilote MongoDB installé sur votre ordinateur. Pour le langage de programmation Python, PyMongo est le pilote le plus populaire disponible aujourd'hui. La méthode recommandée pour l'installer sur votre ordinateur est d'utiliser le pip
module comme indiqué ci-dessous :
python3 -m pip install pymongo --user
Vous avez peut-être remarqué que votre chaîne de connexion MongoDB Atlas est mongodb+srv://
URI. Pour permettre au pilote de fonctionner avec les enregistrements DNS SRV, vous devez également installer le dnspython
module. Voici comment :
python3 -m pip install dnspython --user
5. Connexion au cluster
Vous pouvez désormais utiliser votre cluster MongoDB depuis n'importe quelle application Python. Pour suivre avec moi, créez un nouveau script Python et ouvrez-le à l'aide de n'importe quel éditeur de code.
Dans le script, pour pouvoir interagir avec le cluster, vous aurez besoin d'une instance de MongoClient
classe. Comme seul argument à son constructeur, transmettez votre chaîne de connexion.
import pymongo my_client = pymongo.MongoClient( 'mongodb+srv://alice:[email protected]/test?retryWrites=true' )
Le constructeur ci-dessus revient immédiatement et ne génère aucune erreur. Par conséquent, pour vérifier si vous avez réussi à établir une connexion, je vous suggère d'essayer d'effectuer une opération sur le cluster. Un appel au server_info()
méthode, qui vous donne divers détails sur votre instance MongoDB, suffira.
S'il n'y a pas d'erreurs dans votre chaîne de connexion, l'appel à server_info()
méthode réussira. Cependant, si le nom d'utilisateur ou le mot de passe que vous avez spécifié est incorrect, vous rencontrerez un OperationFailure
Erreur. Le code suivant vous montre comment l'attraper :
try: print("MongoDB version is %s" % my_client.server_info()['version']) except pymongo.errors.OperationFailure as error: print(error) quit(1)
Vous pouvez maintenant continuer et essayer d'exécuter votre script.
6. Insertion de documents
La chaîne de connexion par défaut que vous obtenez de l'interface Web de MongoDB Atlas mentionne une base de données nommée test
. Continuons à utiliser la même base de données. Voici comment vous pouvez en obtenir une référence :
my_database = my_client.test
Une base de données MongoDB est composée d'une ou plusieurs collections, qui ne sont que des groupes de documents BSON (abréviation de JSON binaire). Votre cluster de niveau gratuit sur MongoDB Atlas peut avoir un maximum de 500 collections.
Pour un exemple réaliste, créons une nouvelle collection nommée foods
. Avec PyMongo, vous n'avez pas besoin d'appeler explicitement une méthode pour le faire. Vous pouvez simplement le référencer comme s'il existait déjà.
my_collection = my_database.foods
Il convient de mentionner que le code ci-dessus ne crée pas les foods
collecte immédiatement. Il est créé uniquement après que vous y avez ajouté un document. Créons et ajoutons maintenant un nouveau document contenant les données nutritionnelles d'un aliment.
Utilisation de insert_one()
est le moyen le plus simple d'ajouter un document à une collection. Pour spécifier le contenu du document, vous transmettez un dictionnaire Python à la méthode. L'exemple de code suivant vous montre comment :
my_collection.insert_one({ "_id": 1, "name": "pizza", "calories": 266, "fats": { "saturated": 4.5, "trans": 0.2 }, "protein": 11 })
L'ajout de documents un par un peut être inefficace. Avec le insert_many()
méthode, vous pouvez ajouter plusieurs documents à votre collection à la fois. Il attend un tableau de dictionnaires en entrée. Le code suivant ajoute deux autres documents à la collection :
my_collection.insert_many([ { "_id": 2, "name": "hamburger", "calories": 295, "protein": 17, "fats": { "saturated": 5.0, "trans": 0.8 }, }, { "_id": 3, "name": "taco", "calories": 226, "protein": 9, "fats": { "saturated": 4.4, "trans": 0.5 }, } ])
Le _id
champ que vous voyez dans les documents ci-dessus est un champ utilisé comme clé primaire par MongoDB. En tant que tel, il est immuable et doit être présent dans tous les documents MongoDB. Si vous oubliez de l'inclure lors de la création de votre document, PyMongo l'ajoutera automatiquement pour vous et lui attribuera une valeur unique générée automatiquement.
7. Exécution de requêtes
Lorsque vous avez ajouté quelques documents à votre collection, vous pouvez exécuter des requêtes dessus en appelant le find()
méthode, qui renvoie un Cursor
objet sur lequel vous pouvez itérer. Si vous ne lui transmettez aucun argument, find
renvoie tous les documents de la collection.
Le code suivant vous montre comment imprimer les noms de tous les aliments présents dans notre collection :
my_cursor = my_collection.find() for item in my_cursor: print(item["name"]) # Output is: # pizza # hamburger # taco
Si vous voulez le find()
pour renvoyer uniquement les documents qui correspondent à des critères spécifiques, vous devez lui transmettre un dictionnaire Python. Par exemple, si vous souhaitez rechercher le document dont le name
champ est défini sur "pizza", vous pouvez utiliser le code suivant :
my_cursor = my_collection.find({ "name": "pizza" })
Pour des requêtes plus complexes, vous pouvez utiliser les opérateurs de requête nommés intuitivement de MongoDB dans les dictionnaires que vous transmettez à find()
méthode. Par exemple, le code suivant vous montre comment utiliser le $lt
opérateur pour trouver des documents dont les calories
champ est défini sur une valeur inférieure à 280 :
my_cursor = my_collection.find({ "calories": { "$lt": 280 } }) for item in my_cursor: print("Name: %s, Calories: %d" % (item["name"], item["calories"])) # Output is: # Name: pizza, Calories: 266 # Name: taco, Calories: 226
En utilisant la notation par points, vous pouvez également utiliser des champs imbriqués dans vos requêtes. Le code suivant vous montre comment trouver des documents dont le trans
champ, qui est à l'intérieur du fats
champ, est défini sur une valeur supérieure ou égale à 0,5 :
my_cursor = my_collection.find({ "fats.trans": { "$gte": 0.5 } }) for item in my_cursor: print("Name: %s, Trans fats: %.2f" % (item["name"], item["fats"]["trans"])) # Output is: # Name: hamburger, Trans fats: 0.80 # Name: taco, Trans fats: 0.50
8. Mise à jour et suppression de documents
Très similaire à insert_one()
et insert_many()
les méthodes sont update_one()
et update_many()
méthodes, que vous pouvez utiliser pour modifier le contenu des documents qui se trouvent déjà dans votre collection. Les deux méthodes de mise à jour, en plus des nouvelles données, nécessitent une requête pour se concentrer sur les documents qui doivent être modifiés.
Vous pouvez utiliser divers opérateurs de mise à jour dans vos méthodes de mise à jour. Le plus couramment utilisé est $set
, qui vous permet d'ajouter de nouveaux champs ou de mettre à jour les valeurs de champs existants. Le code suivant vous montre comment ajouter deux nouveaux champs nommés fiber
et sugar
au document dont le name
le champ est défini sur "taco":
my_collection.update_one( { "name": "taco" }, # query { "$set": { # new data "fiber": 3.95, "sugar": 0.9 } } )
Si la requête que vous transmettez à update_one()
renvoie plusieurs documents, seul le premier document est mis à jour. Le update_many()
la méthode n'a pas cette limitation.
Enfin, en utilisant le delete_one()
et delete_many()
méthodes, vous pouvez supprimer des documents dans vos collections. Les deux méthodes nécessitent une requête pour déterminer quels documents doivent être supprimés. Voici comment supprimer tous les documents dont les calories
champ est défini sur une valeur inférieure à 300 :
my_collection.delete_many({ "calories": { "$lt": 300 } }) # Deletes all the three documents