Premiers pas avec MongoDB BulkWrite en PHP

DEV - 29/01
Ce tutoriel a été écrit par James Shisiah. MongoDB est une base de données NoSQL orientée document avec un...

Ce tutoriel a été écrit par James Shisiah.

MongoDB est une base de données NoSQL orientée document avec un schéma flexible conçu pour stocker, interroger et manipuler de gros volumes de données. Pour le développement PHP, nous disposons du pilote PHP officiel MongoDB, qui se compose d'une extension PHP ainsi que d'une bibliothèque de haut niveau (mongodb/mongodb) qui expose une API propre pour interagir avec les collections, les documents et les fonctionnalités avancées de base de données, y compris la recherche en texte intégral et sémantique sur MongoDB Atlas.

Avec la bibliothèque, vous disposez d'outils pour les opérations de base de données standard telles que les insertions, les mises à jour et les suppressions. De plus, il prend en charge les opérations d'écriture en masse via l'API MongoDB BulkWrite. MongoDB BulkWrite est une commande qui permet à une application d'envoyer une liste mixte d'opérations d'écriture à un serveur MongoDB en une seule requête réseau. Les opérations d'écriture incluent les commandes d'insertion, de mise à jour, de remplacement et de suppression.

Dans ce guide, nous explorerons l'API MongoDB BulkWrite et ses améliorations de performances, et nous montrerons comment gérer des opérations groupées mixtes avec un exemple de code à l'aide de la bibliothèque PHP.

Conditions préalables

  • PHP installé (>= 8.1 requis)
  • Serveur de base de données MongoDB (Atlas pour une configuration facile) — ou localement si vous préférez, via le fichier docker-compose.yml fourni
  • PIE (un programme d'installation PHP moderne pour les extensions) : utilisé pour installer l'extension PHP MongoDB
  • Composer pour gérer les dépendances PHP, utilisé pour installer mongodb/mongodb

Pourquoi utiliser BulkWrite pour les opérations par lots ?

De nombreuses applications réelles nécessitent l'insertion, la mise à jour ou la suppression d'un grand nombre de documents à la fois. Les exemples incluent :

  • Importation groupée de milliers d'enregistrements à partir d'un fichier CSV, par exemple des fichiers journaux.
  • Mise à jour massive des prix des produits.
  • Synchronisation des données client à partir de systèmes externes.
  • Nettoyage des entrées anciennes ou inactives.
  • Migrations de données et mises à jour massives.

L'utilisation d'opérations d'écriture individuelles (insertOne, updateOne, etc.) pour chaque enregistrement entraîne des pénalités de performances car chaque écriture est envoyée séparément sur le réseau.

Comment l'API BulkWrite de MongoDB résout ce problème

  • Performances améliorées : plusieurs opérations sont regroupées en un seul lot et envoyées ensemble, réduisant ainsi le temps passé sur l'aller-retour du réseau.
  • Moins d'appels réseau : au lieu de 1 000 opérations, qui feraient 1 000 requêtes, BulkWrite peut toutes les envoyer en une seule requête.
  • Idéal pour les importations, les mises à jour et le nettoyage de données : que vous insériez de nouvelles données, mettiez à jour des enregistrements existants ou effectuiez des suppressions, BulkWrite peut gérer toutes les opérations de manière efficace et atomique au niveau du document.

Comparaison des anciennes et des nouvelles API BulkWrite en PHP

Avant de poursuivre le didacticiel, examinons les différentes API fournies par MongoDB pour travailler avec des opérations d'écriture en masse volumineuses. L'API BulkWrite effectue des opérations d'écriture en masse à deux niveaux. L'ancienne API effectue des opérations d'écriture au niveau de la collection, tandis que la nouvelle API les effectue au niveau du cluster MongoDB (client).

Ancienne API BulkWrite (niveau de collecte)

Au niveau de la collection, vous pouvez effectuer des opérations d'écriture en masse sur une seule collection. L'ancienne implémentation d'écriture en masse de MongoDB fournit deux API associées :

  • MongoDB\Driver\Manager ::executeBulkWrite()
  • MongoDB\Collection::bulkWrite()

Collection ::bulkWrite()est un wrapper pratique fourni par la bibliothèque PHP de haut niveau. En interne, il prépare unMongoDB\Driver\BulkWriteobjet et l'exécute viaManager ::executeBulkWrite(), fournissant automatiquement l'espace de noms correct. Autrement dit,Collection ::bulkWrite()l'objet fournit un espace de noms ainsi que des opérations d'écriture dansManager ::executeBulkWrite(), rendant votre code plus lisible.

LeCollection ::écriture en masseLa méthode effectue un appel à la base de données pour chaque type d’opération d’écriture. Il peut effectuer plusieurs opérations d'insertion en un seul appel, mais il effectue deux appels distincts à la base de données pour une opération d'insertion et une opération de remplacement. Bien que cela soit efficace lors de l'exécution d'une opération groupée pour un type d'opération d'écriture (par exemple, l'insertion de milliers de lignes à partir d'un fichier CSV), si vous combinez des insertions et des mises à jour dans un tableau d'opérations, des appels distincts à la base de données seront effectués pour chaque type (insertion et mise à jour). Explorons des exemples d'extraits de code avec les anciennes API d'écriture groupée.

Exemple de code avec Manager::executeBulkWrite()

$bulk = nouveau MongoDB\Driver\BulkWrite ; $bulk->insert(['name' => 'Alice']); $bulk->update(['email' => '[email protected]'], ['$set' => ['active' => true]]); $bulk->delete(['status' => 'inactif']); $manager = nouveau MongoDB\Driver\Manager($mongoDBuri); $result = $manager->executeBulkWrite('bulkwritedb.users', $bulk);
Entrer en mode plein écran Quitter le mode plein écran

Exemple de code avec Collection::bulkwrite()

$client = nouveau MongoDB\Client($mongoDBuri); $database = $client->selectDatabase('bulkwritedb'); $collection = $database->selectCollection('utilisateurs'); $opérations = [ ['insertOne' => [['name' => 'Alice', 'age' => 25]]], ['insertOne' => [['name' => 'Bob', 'age' => 30]]], ['insertOne' => [['name' => 'Charlie', 'age' => 28]]], ]; $result = $collection->bulkWrite($opérations);
Entrer en mode plein écran Quitter le mode plein écran

Dans cet exemple, Collection::bulkWrite() fournit en interne l'espace de noms Bulkwritedb.users à Manager::executeBulkWrite(), qui effectue ensuite l'appel à la base de données.

Gardez à l’esprit les points suivants lorsque vous travaillez avec les anciennes API d’écriture groupée :

  • Fonctionne sur un seul espace de noms
  • Renvoie un seul objet de résultat d'écriture
  • Peut échouer si la réponse du serveur dépasse la taille maximale du document BSON
  • Bien adapté aux opérations en petits et moyens lots

Nouvelle API BulkWrite (niveau cluster/client)

La nouvelle API MongoDB BulkWrite effectue des appels au niveau client, vous permettant d'effectuer des opérations sur plusieurs collections et bases de données dans le même cluster. La nouvelle API Bulkwrite est exposée via la méthode MongoDB\Client::bulkWrite() et fonctionne avec MongoDB Server version 8.0 ou ultérieure. Si vous utilisez toujours une ancienne version de MongoDB, c'est votre signe pour effectuer la mise à niveau. Par exemple, les opérations BulkWrite sur MongoDB 8.0 peuvent s'exécuter jusqu'à 56 % plus rapidement que les opérations BulkWrite sur MongoDB 7.0. La nouvelle API effectue toutes les opérations d'écriture (insertions, mises à jour, remplacement et suppression) en un seul appel à la base de données, contrairement à l'ancienne API, qui effectue des appels différents pour chaque type d'opération d'écriture. Il suit le chemin d'exécution suivant :

  • Crée unMongoDB\Driver\BulkWriteCommandexemple
  • L'exécute viaManager ::executeBulkWriteCommand()
  • Renvoie les résultats à l'aide d'un curseur (l'ancienne API ne renvoie pas les résultats à l'aide d'un curseur)

En renvoyant les résultats via un curseur, MongoDB peut diffuser les réponses de manière incrémentielle plutôt que d'envoyer un seul document BSON potentiellement volumineux. Cela nous permet de contourner les limitations de l’ancienne API BulkWrite et de gérer ainsi en toute sécurité des opérations en masse beaucoup plus importantes. Votre application aura une meilleure résilience lors d’importations et de migrations importantes.

Exemple de code avec MongoDB\Client::bulkWrite()

$client = nouveau MongoDB\Client($mongoDBuri); // Créez le ClientBulkWrite pour votre collection 'users' $usersCollection = $client->bulkwritedb->users; $bulkWrite = MongoDB\ClientBulkWrite::createWithCollection($usersCollection); //...
[Courte citation de 8% de l'article original]
Loading...