Εάν το MapReduce ήταν το αγαπημένο σας, τώρα θα μπορούσε να είναι η ώρα να μεταβείτε στον αγωγό συγκέντρωσης του MongoDB για την αντιμετώπιση περίπλοκων λειτουργιών.
Ο αγωγός συγκέντρωσης είναι ο προτεινόμενος τρόπος εκτέλεσης σύνθετων ερωτημάτων στο MongoDB. Εάν χρησιμοποιείτε το MapReduce της MongoDB, καλύτερα να μεταβείτε στη διοχέτευση συγκέντρωσης για πιο αποτελεσματικούς υπολογισμούς.
Τι είναι το Aggregation στο MongoDB και πώς λειτουργεί;
Ο αγωγός συγκέντρωσης είναι μια διαδικασία πολλαπλών σταδίων για την εκτέλεση προηγμένων ερωτήματα στο MongoDB. Επεξεργάζεται δεδομένα μέσω διαφορετικών σταδίων που ονομάζονται αγωγός. Μπορείτε να χρησιμοποιήσετε τα αποτελέσματα που δημιουργούνται από ένα επίπεδο ως πρότυπο λειτουργίας σε ένα άλλο.
Για παράδειγμα, μπορείτε να μεταφέρετε το αποτέλεσμα μιας λειτουργίας αντιστοίχισης σε ένα άλλο στάδιο για ταξινόμηση με αυτή τη σειρά μέχρι να λάβετε το επιθυμητό αποτέλεσμα.
Κάθε στάδιο ενός αγωγού συγκέντρωσης διαθέτει έναν τελεστή MongoDB και δημιουργεί ένα ή περισσότερα μετασχηματισμένα έγγραφα. Ανάλογα με το ερώτημά σας, ένα επίπεδο μπορεί να εμφανιστεί πολλές φορές στη διοχέτευση. Για παράδειγμα, μπορεί να χρειαστεί να χρησιμοποιήσετε το
$count ή $ταξινόμηση ο χειριστής περνά περισσότερες από μία φορές κατά μήκος του αγωγού συγκέντρωσης.Τα στάδια του αγωγού συγκέντρωσης
Ο αγωγός συγκέντρωσης διοχετεύει δεδομένα μέσω πολλαπλών σταδίων σε ένα μόνο ερώτημα. Υπάρχουν πολλά στάδια και μπορείτε να βρείτε τα στοιχεία τους στο Τεκμηρίωση MongoDB.
Ας ορίσουμε μερικά από τα πιο συχνά χρησιμοποιούμενα παρακάτω.
Το $match Stage
Αυτό το στάδιο σάς βοηθά να ορίσετε συγκεκριμένες συνθήκες φιλτραρίσματος πριν ξεκινήσετε τα άλλα στάδια συγκέντρωσης. Μπορείτε να το χρησιμοποιήσετε για να επιλέξετε τα αντίστοιχα δεδομένα που θέλετε να συμπεριλάβετε στη διοχέτευση συγκέντρωσης.
Το $group Stage
Το ομαδικό στάδιο διαχωρίζει τα δεδομένα σε διαφορετικές ομάδες με βάση συγκεκριμένα κριτήρια χρησιμοποιώντας ζεύγη κλειδιού-τιμής. Κάθε ομάδα αντιπροσωπεύει ένα κλειδί στο έγγραφο εξόδου.
Για παράδειγμα, σκεφτείτε τα ακόλουθα εκπτώσεις δειγμα δεδομένων:
Χρησιμοποιώντας τη γραμμή συνάθροισης, μπορείτε να υπολογίσετε τον συνολικό αριθμό πωλήσεων και τις κορυφαίες πωλήσεις για κάθε τμήμα προϊόντος:
{
$group: {
_id: $Section,
total_sales_count: {$sum: $Sold},
top_sales: {$max: $Amount},
}
}
ο _id: $Section ζεύγος ομαδοποιεί το έγγραφο εξόδου με βάση τις ενότητες. Με τον καθορισμό των top_sales_count και top_sales πεδία, το MongoDB δημιουργεί νέα κλειδιά με βάση τη λειτουργία που ορίζεται από το aggregator. αυτό μπορεί να είναι $sum, $min, $max, ή $μέσο.
Το $skip Stage
Μπορείτε να χρησιμοποιήσετε το $παράβλεψη στάδιο για να παραλείψετε έναν καθορισμένο αριθμό εγγράφων στην έξοδο. Συνήθως έρχεται μετά τη φάση των ομίλων. Για παράδειγμα, εάν περιμένετε δύο έγγραφα εξόδου αλλά παραλείψετε ένα, η συγκέντρωση θα παράγει μόνο το δεύτερο έγγραφο.
Για να προσθέσετε ένα στάδιο παράλειψης, εισαγάγετε το $παράβλεψη λειτουργία στον αγωγό συγκέντρωσης:
...,
{
$skip: 1
},
Το $sort Stage
Το στάδιο ταξινόμησης σάς επιτρέπει να τακτοποιήσετε τα δεδομένα σε φθίνουσα ή αύξουσα σειρά. Για παράδειγμα, μπορούμε να ταξινομήσουμε περαιτέρω τα δεδομένα στο προηγούμενο παράδειγμα ερωτήματος με φθίνουσα σειρά για να προσδιορίσουμε ποια ενότητα έχει τις υψηλότερες πωλήσεις.
Πρόσθεσε το $ταξινόμηση τελεστής στο προηγούμενο ερώτημα:
...,
{
$sort: {top_sales: -1}
},
Το $limit Stage
Η λειτουργία ορίου συμβάλλει στη μείωση του αριθμού των εγγράφων εξόδου που θέλετε να εμφανίζει ο αγωγός συγκέντρωσης. Για παράδειγμα, χρησιμοποιήστε το $όριο χειριστή για να επιστραφεί το τμήμα με τις υψηλότερες πωλήσεις από το προηγούμενο στάδιο:
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
Το παραπάνω επιστρέφει μόνο το πρώτο έγγραφο. αυτή είναι η ενότητα με τις υψηλότερες πωλήσεις, καθώς εμφανίζεται στην κορυφή της ταξινομημένης παραγωγής.
Το $project Stage
ο $έργο Το στάδιο σάς επιτρέπει να διαμορφώσετε το έγγραφο εξόδου όπως θέλετε. Χρησιμοποιώντας την $έργο τελεστή, μπορείτε να καθορίσετε ποιο πεδίο θα συμπεριληφθεί στην έξοδο και να προσαρμόσετε το όνομα του κλειδιού του.
Για παράδειγμα, ένα δείγμα εξόδου χωρίς το $έργο Το στάδιο μοιάζει με αυτό:
Ας δούμε πώς μοιάζει με το $έργο στάδιο. Για να προσθέσετε το $έργο στον αγωγό:
...,{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
Εφόσον έχουμε ομαδοποιήσει προηγουμένως τα δεδομένα με βάση τις ενότητες προϊόντων, τα παραπάνω περιλαμβάνουν κάθε ενότητα προϊόντος στο έγγραφο εξόδου. Εξασφαλίζει επίσης ότι ο συνολικός αριθμός πωλήσεων και οι κορυφαίες πωλήσεις εμφανίζονται στην παραγωγή ως TotalSold και TopSale.
Η τελική έξοδος είναι πολύ πιο καθαρή σε σύγκριση με την προηγούμενη:
The $unwind Stage
ο $ξετυλίγομαι Το στάδιο αναλύει έναν πίνακα μέσα σε ένα έγγραφο σε μεμονωμένα έγγραφα. Πάρτε τα παρακάτω Παραγγελίες δεδομένα, για παράδειγμα:
Χρησιμοποιήστε το $ξετυλίγομαι στάδιο για να αποδομήσει το είδη πίνακα πριν από την εφαρμογή άλλων σταδίων συνάθροισης. Για παράδειγμα, ξετυλίγοντας το είδη Ο πίνακας έχει νόημα εάν θέλετε να υπολογίσετε τα συνολικά έσοδα για κάθε προϊόν:
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
Ακολουθεί το αποτέλεσμα του παραπάνω ερωτήματος συγκέντρωσης:
Πώς να δημιουργήσετε έναν αγωγό συγκέντρωσης στο MongoDB
Ενώ η διοχέτευση συγκέντρωσης περιλαμβάνει πολλές λειτουργίες, τα προηγούμενα στάδια σάς δίνουν μια ιδέα για το πώς να τις εφαρμόσετε στη διοχέτευση, συμπεριλαμβανομένου του βασικού ερωτήματος για καθεμία.
Χρησιμοποιώντας το προηγούμενο εκπτώσεις δείγμα δεδομένων, ας δούμε μερικά από τα στάδια που συζητήθηκαν παραπάνω σε ένα κομμάτι για μια ευρύτερη άποψη του αγωγού συγκέντρωσης:
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}},
{
"$sort": { "top_sales": -1 }
},{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
Η τελική έξοδος μοιάζει με κάτι που έχετε δει προηγουμένως:
Aggregation Pipeline vs. ΜΕΙΩΣΗ ΧΑΡΤΗ
Μέχρι την κατάργησή του, ξεκινώντας από το MongoDB 5.0, ο συμβατικός τρόπος για τη συγκέντρωση δεδομένων στο MongoDB ήταν μέσω του MapReduce. Αν και Το MapReduce έχει ευρύτερες εφαρμογές πέρα από το MongoDB, είναι λιγότερο αποτελεσματικό από τον αγωγό συνάθροισης, απαιτώντας δέσμες ενεργειών τρίτων για τη σύνταξη του χάρτη και τη μείωση των συναρτήσεων ξεχωριστά.
Ο αγωγός συγκέντρωσης, από την άλλη πλευρά, είναι συγκεκριμένος μόνο για το MongoDB. Παρέχει όμως έναν καθαρότερο και πιο αποτελεσματικό τρόπο για την εκτέλεση σύνθετων ερωτημάτων. Εκτός από την απλότητα και την επεκτασιμότητα των ερωτημάτων, τα επιλεγμένα στάδια διοχέτευσης καθιστούν την έξοδο πιο προσαρμόσιμη.
Υπάρχουν πολλά άλλα διαφορές μεταξύ του αγωγού συγκέντρωσης και του MapReduce. Θα τα δείτε καθώς μεταβαίνετε από το MapReduce στον αγωγό συγκέντρωσης.
Κάντε αποτελεσματικά τα ερωτήματα μεγάλων δεδομένων στο MongoDB
Το ερώτημά σας πρέπει να είναι όσο το δυνατόν πιο αποτελεσματικό εάν θέλετε να εκτελέσετε εις βάθος υπολογισμούς σε πολύπλοκα δεδομένα στο MongoDB. Ο αγωγός συγκέντρωσης είναι ιδανικός για προηγμένες ερωτήσεις. Αντί να χειρίζεστε δεδομένα σε ξεχωριστές λειτουργίες, οι οποίες συχνά μειώνουν την απόδοση, η συνάθροιση σάς επιτρέπει να τα συσκευάσετε όλα μέσα σε μια ενιαία διοχέτευση απόδοσης και να τα εκτελέσετε μία φορά.
Ενώ η διοχέτευση συγκέντρωσης είναι πιο αποτελεσματική από το MapReduce, μπορείτε να κάνετε τη συγκέντρωση ταχύτερη και πιο αποτελεσματική με την ευρετηρίαση των δεδομένων σας. Αυτό περιορίζει τον όγκο των δεδομένων που χρειάζεται να σαρώσει το MongoDB κατά τη διάρκεια κάθε σταδίου συγκέντρωσης.