Cet article explique le cadre d'agrégation de MongoDB, un outil basé sur des pipelines pour les transformations de données complexes. Il détaille en utilisant des étapes comme $ groupe, $ SOR
Le cadre d'agrégation MongoDB est un outil puissant pour effectuer des transformations de données complexes directement dans la base de données. Il utilise une approche basée sur des pipelines, où les données traversent une série d'étapes, effectuant chacune une opération spécifique. Ces étapes peuvent inclure le filtrage, le regroupement, le tri, la projection, etc. Illustrons avec un exemple. Imaginez que vous avez une collection appelée sales
avec des documents comme celui-ci:
<code class="json">{ "_id" : ObjectId("5f9f16c75474444444444444"), "item" : "ABC", "price" : 10, "quantity" : 2, "date" : ISODate("2024-01-15T00:00:00Z") } { "_id" : ObjectId("5f9f16c75474444444444445"), "item" : "XYZ", "price" : 20, "quantity" : 1, "date" : ISODate("2024-01-15T00:00:00Z") } { "_id" : ObjectId("5f9f16c75474444444444446"), "item" : "ABC", "price" : 10, "quantity" : 3, "date" : ISODate("2024-01-16T00:00:00Z") }</code>
Pour calculer les revenus totaux de chaque élément, vous utiliseriez le pipeline d'agrégation suivant:
<code class="javascript">db.sales.aggregate([ { $group: { _id: "$item", totalRevenue: { $sum: { $multiply: ["$price", "$quantity"] } } } }, { $sort: { totalRevenue: -1 } } ])</code>
Ce pipeline regroupe d'abord les documents par champ item
en utilisant $group
. Ensuite, pour chaque groupe, il calcule le totalRevenue
en utilisant $sum
et $multiply
pour multiplier le prix et la quantité. Enfin, il trie les résultats dans l'ordre descendant de totalRevenue
en utilisant $sort
. Cela montre comment plusieurs étapes peuvent être enchaînées pour des transformations complexes. D'autres étapes courantes incluent $match
(filtrage), $project
(sélection et renommer les champs), $unwind
(déconstruire des tableaux) et $lookup
(rejoindre d'autres collections - discuté plus loin).
Au-delà des requêtes simples comme trouver des documents correspondant aux critères spécifiques, le cadre d'agrégation excelle dans les scénarios nécessitant une manipulation et une analyse des données. Voici quelques cas d'utilisation courants:
L'optimisation des pipelines d'agrégation pour les grands ensembles de données est cruciale pour les performances. Voici quelques stratégies clés:
$match
, $sort
, $group
et $lookup
. Les index accélèrent considérablement la récupération des données.$match
au début du pipeline pour filtrer les documents indésirables dès que possible. Cela réduit la quantité de données traitées par les étapes suivantes.$sum
est généralement plus rapide que $reduce
pour les valeurs de addition.$project
pour réduire le volume de données traité.$lookup
: lors de la jointure de collections, assurez-vous que la collection jointe a un index approprié sur le champ de jointure. Envisagez d'utiliser $lookup
avec let
et pipeline
pour des conditions de jointure complexes.explain()
: Utilisez la méthode db.collection.aggregate(...).explain()
pour analyser le plan d'exécution et identifier les goulots d'étranglement potentiels. Oui, le cadre d'agrégation MongoDB prend en charge les jointures et les recherches d'autres collections à l'aide de l'étape $lookup
. $lookup
effectue une jointure extérieure gauche, apportant des données d'une autre collection basée sur une condition de jointure spécifiée.
Par exemple, considérez deux collections: customers
et orders
.
<code class="json">// customers collection { "_id" : 1, "name" : "John Doe" } { "_id" : 2, "name" : "Jane Smith" } // orders collection { "_id" : 101, "customer_id" : 1, "amount" : 100 } { "_id" : 102, "customer_id" : 1, "amount" : 200 } { "_id" : 103, "customer_id" : 2, "amount" : 50 }</code>
Pour récupérer les informations des clients avec leurs commandes, vous utiliseriez le pipeline d'agrégation suivant:
<code class="javascript">db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", as: "orders" } } ])</code>
Ce pipeline rejoint customers
et orders
les collections en fonction du champ _id
dans customers
et le champ customer_id
dans orders
. Le résultat comprendra les informations du client et un tableau de leurs commandes associées dans le champ orders
. N'oubliez pas de créer des index sur le champ _id
dans customers
et le champ customer_id
dans orders
de performances optimales. Des conditions de jointure plus complexes peuvent être réalisées en utilisant les options de let
et pipeline
dans l'étape $lookup
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!