Meilleur support du pipeline d'agrégation dans le pilote MongoDB PHP

DEV - 17/03
Ce tutoriel a été écrit par Andreas Braun. Le cadre d'agrégation est un outil puissant dans votre ...

Ce tutoriel a été écrit par Andreas Braun.

Le cadre d'agrégation est un outil puissant dans votre boîte à outils MongoDB. Il vous permet d'exécuter des requêtes complexes sur vos données, de façonner et de modifier des documents en fonction de vos besoins. Cette puissance passe par de nombreuses étapes et opérateurs de pipelines différents, ce qui présente à son tour un certain défi d'apprentissage. MongoDB Compass comprend un constructeur de pipelines d'agrégation qui vous permet de voir les résultats en temps réel pour chaque étape et corriger les erreurs dès le début. Une fois votre pipeline terminé, vous pouvez exporter le pipeline vers votre langue et l'utiliser dans votre code. Dans le pilote PHP, ce pipeline vivrait comme un tableau, complètement non typé, et parfois avec une structure relativement complexe d'étapes et d'opérateurs. Prenons ce pipeline de l'un de mes projets comme exemple:

$ pipeline = [['$ groupe' => ['_id' => ['année' => ['$ an' => '$ ReportDate'], 'Month' => ['$ mois' => '$ ReportDate'], 'FuelType' => '$ FuelType', 'Brand' => '$ Station.Brand'], '=>> [$ min' = '$ ['$ max' => '$ prix'], 'moyen' => ['$ avg' => '$ prix'], 'count' => ['$ sum' => 1],],], ['$ groupe' => ['_id' => ['année' => '$ _id.year', 'mois' => '$ _id. => ['$ sum' => '$ Count'], 'Prix' => ['$ push' => ['k' => '$ _id.fueltype', 'v' => ['le plus bas' => '$ la plus basse', 'le plus haut' => '$ Highst', 'Moyen' => '$ moyen', 'Span' => [$ soustraire '=> [$ ],],], ['$ addFields' => ['prix' => ['$ arraytoObject' => '$ prix']]], ['$ groupe' => ['_id' => ['année' => '$ _id.year', 'mois' => '$ _id.month',], 'marques' => [$ push '=> [' brand '=>' $ _id. 'count' => '$ count', 'prix' => '$ prix',],],],], ['$ addfields' => ['marques' => ['$ sortarray' => ['entrée' => '$ marques', 'sortby' => ['count' => -1],],],], ['$ sort' => ['' _id. => 1]],];
Entrez le mode de sortie en mode plein écran

C'est beaucoup de logique! Pour mieux comprendre ce que fait ce pipeline, regardons un seul document source:

{"ReportDate": "2024-10-22T13: 15: 03 + 02: 00", "Station": {"Brand": "Acme Corp." }, "FuelType": "diesel", "prix": "1.759"}
Entrez le mode de sortie en mode plein écran

J'ai laissé de côté certains champs que nous n'utilisons pas pour le moment. Le pipeline d'agrégation regroupe tous ces documents, produisant un document pour chaque mois:

{"_id": {"année": 2024, "Mois": 10}, "marques": [{"Brand": "Acme Corp.", "Count": 1, "Prix": {"diesel": {"le plus bas": "759,"
Entrez le mode de sortie en mode plein écran

Sans entrer dans plus de détails à ce sujet, même si nous devions commenter des parties du pipeline d'agrégation pour expliquer ce qu'elle fait, il y aura toujours une charge cognitive élevée lors de la traversée du pipeline d'agrégation. L'une des raisons est que la seule façon d'exprimer le langage spécifique au domaine (DSL) du domaine d'agrégation est via des tableaux non typés, et aucun éditeur PHP ne peut fournir beaucoup d'aide au-delà de la mise en évidence de la syntaxe. Associez cela à quelques niveaux de nidification, et vous avez le genre de code que vous pouvez écrire, mais pas lire. Nous pourrions commencer par refactorisation du code, mais essayons plutôt de nous éloigner des structures du tableau et d'utiliser une meilleure solution.

Présentation du générateur de pipeline d'agrégation

Auparavant publié en tant que package autonome, la version 1.21 du pilote MongoDB PHP comprend désormais un constructeur complet de pipeline d'agrégation. Au lieu d'écrire des tableaux complexes, vous pouvez utiliser des méthodes d'usine pour générer des étapes de pipeline et des opérateurs. Voici le même pipeline qu'auparavant, cette fois écrite avec le constructeur de pipeline d'agrégation:

Utilisez MongoDB \ Builder \ Accumulateur; Utilisez MongoDB \ Builder \ Expression; Utilisez MongoDB \ Builder \ Pipeline; Utilisez MongoDB \ Builder \ Stage; Utiliser la fonction mongodb \ objet; $ pipeline = new Pipeline (stage :: groupe (_id: objet (année: expression :: an (expression :: dateFieldPath ('reportDate')), mois: expression :: mois (expression :: dateFieldPath ('reportDate')), fuelType: expression :: fieldpath ('fueltype'), marque: expression: fieldpath ('stare.brand'),),) Accumulateur :: Min (expression :: doubleFieldPath ('Price')), le plus haut: accumulateur :: max (expression :: doublefieldpath ('prix')), moyenne: accumulateur :: avg (expression :: doublefieldpath ('prix')), comptage: accumulateur: sum (1),), stade :: groupe (_id: objet (année: Expression :: fieldpath ('_ id.y: OBJ Expression :: fieldPath ('_ id.month'), marque: expression :: fieldpath ('_ id.brand'),), count: accumulateur :: sum (expression :: intFieldPath ('count')), prix: accumulateur :: p...
[Courte citation de 8% de l'article original]
Loading...