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.
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 :
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.
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).
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 :
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.
$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);$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);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 :
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 :
MongoDB\Driver\BulkWriteCommandexempleManager ::executeBulkWriteCommand()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.
$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]