Πώς να χρησιμοποιήσετε το $lookup στο MongoDB

Το MongoDB είναι μια δημοφιλής βάση δεδομένων NoSQL που αποθηκεύει δεδομένα σε συλλογές. Οι συλλογές MongoDB αποτελούνται από ένα ή περισσότερα έγγραφα που περιέχουν τα πραγματικά δεδομένα σε μορφή JSON. Τα έγγραφα είναι συγκρίσιμα με σειρές σε παραδοσιακές σχεσιακές βάσεις δεδομένων SQL, ενώ οι συλλογές είναι ανάλογες με τους πίνακες.

Μια βασική λειτουργία στις βάσεις δεδομένων είναι η δυνατότητα υποβολής ερωτημάτων στα δεδομένα που είναι αποθηκευμένα στη βάση δεδομένων. Η αναζήτηση δεδομένων επιτρέπει την ανάκτηση συγκεκριμένων πληροφοριών, την ανάλυση δεδομένων, την αναφορά δεδομένων και επίσης την ενοποίηση δεδομένων.

Για να είναι δυνατή η αποτελεσματική αναζήτηση μιας βάσης δεδομένων, είναι σημαντικό να μπορούμε να συνδυάζουμε δεδομένα από πολλούς πίνακες, στην περίπτωση βάσεων δεδομένων SQL ή πολλαπλών συλλογών σε βάσεις δεδομένων NOSQL, σε ένα ενιαίο σύνολο αποτελεσμάτων.

Στο MongoDB $lookup οι χρήστες να συνδυάζουν πληροφορίες από δύο συλλογές κατά την υποβολή ερωτημάτων. Εκτελεί το ισοδύναμο μιας αριστερής εξωτερικής ένωσης σε μια βάση δεδομένων SQL.

Χρήση και στόχος του $lookup

Μια σημαντική λειτουργία των βάσεων δεδομένων είναι η επεξεργασία δεδομένων για τη λήψη ουσιαστικών πληροφοριών από τα ακατέργαστα δεδομένα.

Για παράδειγμα, εάν διευθύνετε μια επιχείρηση εστιατορίου, μπορεί να θέλετε να αναλύσετε τα δεδομένα του εστιατορίου σας για να μάθετε πόσα φτιάχνετε καθημερινά, ποια τρόφιμα είναι κατά παραγγελία τα Σαββατοκύριακα ή ακόμα και πόσα φλιτζάνια καφέ πουλάτε σε κάθε ώρα της ημέρας.

Για τέτοιες ανάγκες, απλά ερωτήματα βάσης δεδομένων δεν αρκούν. Πρέπει να εκτελέσετε σύνθετα ερωτήματα στα δεδομένα που έχετε αποθηκεύσει. Για την αντιμετώπιση τέτοιων αναγκών, το MongoDB διαθέτει ένα χαρακτηριστικό που ονομάζεται αγωγός συγκέντρωσης.

Ένας αγωγός συγκέντρωσης είναι ένα σύστημα που αποτελείται από συνθέσιμες λειτουργίες που ονομάζονται στάδια, οι οποίες χρησιμοποιούνται για την επεξεργασία δεδομένων για την παραγωγή ενός τελικού συγκεντρωτικού αποτελέσματος. Παραδείγματα σταδίων στον αγωγό συγκέντρωσης περιλαμβάνουν τα $sort, $match, $group, $merge, $count και $lookup, μεταξύ άλλων.

Αυτά τα στάδια μπορούν να εφαρμοστούν με οποιαδήποτε σειρά σε έναν αγωγό συγκέντρωσης. Σε κάθε στάδιο σε έναν αγωγό συγκέντρωσης, εκτελούνται διαφορετικές λειτουργίες στα δεδομένα που διαβιβάζονται μέσω του αγωγού συγκέντρωσης.

Το $lookup είναι επομένως ένα στάδιο στον αγωγό συγκέντρωσης MongoDB. Το $Lookup χρησιμοποιείται για την εκτέλεση μιας αριστερής εξωτερικής ένωσης μεταξύ δύο συλλογών σε μια βάση δεδομένων MongoDB. Μια αριστερή εξωτερική ένωση συνδυάζει όλα τα έγγραφα ή τις εγγραφές στα αριστερά με τα αντίστοιχα έγγραφα ή καταχωρήσεις στα δεξιά.

Για παράδειγμα, εξετάστε τις δύο συλλογές παρακάτω, οι οποίες έχουν παρουσιαστεί σε μορφή πίνακα για ευκολότερη κατανόηση:

orders_collection:

order_idcustomer_idorder_datetotal_amount11002022-05-0150.0021012022-05-0275.0031022022-05-03100.00

πελάτες_συλλογή:

customer_numcustomer_namecustomer_emailcustomer_phone100John [email protected] [email protected]

Εάν εκτελέσουμε μια αριστερή εξωτερική ένωση στις παραπάνω συλλογές χρησιμοποιώντας το πεδίο customer_id, που εμφανίζεται στο order_collection, με την order_collection να είναι η αριστερή συλλογή και η customers_collection να είναι η σωστή συλλογή, το αποτέλεσμα θα περιέχει όλα τα έγγραφα στη συλλογή Orders Collection και έγγραφα στη Συλλογή Πελατών που έχουν ένα customer_num που αντιστοιχεί σε ένα customer_id οποιασδήποτε από τις εγγραφές στη Συλλογή Παραγγελιών.

  Πώς να εφαρμόσετε το SSL στο Apache Tomcat;

Το τελικό αποτέλεσμα της λειτουργίας αριστερής εξωτερικής ένωσης στις συλλογές παραγγελιών και πελατών μοιάζει με αυτό όταν παρουσιάζεται σε μορφή πίνακα:

Σημειώστε ότι για τον πελάτη με customer_id 101 στη Συλλογή παραγγελιών, ο οποίος δεν είχε αντίστοιχη τιμή customer_num στη συλλογή πελατών, οι αντίστοιχες τιμές που λείπουν από τον πίνακα πελατών έχουν συμπληρωθεί με null.

Το $lookup εκτελεί αυστηρή σύγκριση ισότητας μεταξύ των πεδίων και ανακτά ολόκληρο το έγγραφο που ταιριάζει, και όχι μόνο τα πεδία που ταιριάζουν.

$lookup Σύνταξη

Η σύνταξη για το $lookup είναι η εξής:

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

Το $lookup έχει τέσσερις παραμέτρους:

  • από – αντιπροσωπεύει τη συλλογή από την οποία θέλουμε να αναζητήσουμε έγγραφα. Στο προηγούμενο παράδειγμά μας χρησιμοποιώντας orders_collection και customers_collection, θα βάλαμε customers_collection ως από τη συλλογή.
  • localField – αυτό είναι ένα πεδίο στην εργασιακή ή κύρια συλλογή που χρησιμοποιούμε για να συγκρίνουμε με πεδία στη συλλογή μας από τη συλλογή (customers_collection στην περίπτωσή μας). Στο παραπάνω παράδειγμα, το localField θα είναι customer_id που βρίσκεται στη συλλογή orders_collection.
  • ForeignField – αυτό είναι το πεδίο με το οποίο θέλουμε να συγκρίνουμε στη συλλογή από την οποία καθορίζουμε. Στο παράδειγμά μας, αυτό θα ήταν customer_num που βρίσκεται στη συλλογή customer_collection και χρησιμοποιούμε ως την αξία μας από
  • as – αυτό είναι ένα νέο όνομα πεδίου που καθορίζουμε για να αντιπροσωπεύει το πεδίο που θα εμφανίζεται στο έγγραφό μας, το οποίο περιέχει έγγραφα που προκύπτουν από αντιστοιχίσεις μεταξύ του localField και του ForeignField. Όλες αυτές οι αντιστοιχίσεις τοποθετούνται σε έναν πίνακα σε αυτό το πεδίο. Εάν δεν υπάρχουν αντιστοιχίες, αυτό το πεδίο θα περιέχει έναν κενό πίνακα.

Από τις δύο προηγούμενες συλλογές μας, θα χρησιμοποιούσαμε τον ακόλουθο κώδικα για να εκτελέσουμε μια λειτουργία $lookup στις δύο συλλογές με τη συλλογή orders_collection ως εργασιακή ή κύρια συλλογή.

{
    $lookup: {
      from: "customers_collection",
      localField: "customer_id",
      foreignField: "customer_num",
      as: "customer_info"
 }

Σημειώστε ότι το πεδίο ως μπορεί να είναι οποιαδήποτε τιμή συμβολοσειράς. Ωστόσο, εάν του δώσετε ένα όνομα που υπάρχει ήδη στο έγγραφο εργασίας, αυτό το πεδίο θα αντικατασταθεί.

Σύνδεση δεδομένων από πολλαπλές συλλογές

Το MongoDB $lookup είναι ένα χρήσιμο στάδιο σε έναν αγωγό συγκέντρωσης στο MongoDB. Παρόλο που δεν απαιτείται ένας αγωγός συγκέντρωσης στο MongoDB να έχει ένα στάδιο $lookup, το στάδιο είναι κρίσιμο κατά την εκτέλεση σύνθετων ερωτημάτων που απαιτούν ένωση δεδομένων σε πολλές συλλογές.

Το στάδιο $lookup εκτελεί μια αριστερή εξωτερική ένωση σε δύο συλλογές που έχει ως αποτέλεσμα τη δημιουργία ενός νέου πεδίου ή την αντικατάσταση των τιμών ενός υπάρχοντος πεδίου με έναν πίνακα που περιέχει έγγραφα από μια άλλη συλλογή.

Αυτά τα έγγραφα επιλέγονται με βάση το αν έχουν τιμές που ταιριάζουν με τις τιμές του πεδίου με το οποίο συγκρίνονται. Το τελικό αποτέλεσμα είναι ένα πεδίο που περιέχει μια σειρά εγγράφων σε περίπτωση που βρέθηκαν αντιστοιχίσεις ή έναν κενό πίνακα σε περίπτωση που δεν βρέθηκαν αντιστοιχίες.

  12 Καλύτερα Σημειωματάρια Επιστήμης Συνεργατικών Δεδομένων [Jupyter Alternatives]

Εξετάστε τις συλλογές του υπαλλήλου και των έργων που φαίνονται παρακάτω.

Μπορούμε να χρησιμοποιήσουμε τον ακόλουθο κώδικα για να ενώσουμε τις δύο συλλογές:

db.projects.aggregate([
   {
      $lookup: {
         from: "employees",
         localField: "employees",
         foreignField: "_id",
         as: "assigned_employees"
      }
   }
])

Το αποτέλεσμα αυτής της λειτουργίας είναι ένας συνδυασμός των δύο συλλογών. Το αποτέλεσμα είναι τα έργα και όλοι οι εργαζόμενοι που ανατίθενται σε κάθε έργο. Οι εργαζόμενοι αντιπροσωπεύονται σε μια συστοιχία.

Στάδια Pipeline που μπορούν να χρησιμοποιηθούν μαζί με το $lookup

Όπως αναφέρθηκε προηγουμένως, το $lookup είναι ένα στάδιο σε έναν αγωγό συγκέντρωσης MongoDB και μπορεί να χρησιμοποιηθεί μαζί με άλλα στάδια του αγωγού συγκέντρωσης. Για να δείξουμε πώς αυτά τα στάδια μπορούν να χρησιμοποιηθούν μαζί με το $lookup, θα χρησιμοποιήσουμε τις ακόλουθες δύο συλλογές για λόγους απεικόνισης.

Στο MongoDB, αποθηκεύονται σε μορφή JSON. Έτσι μοιάζουν οι παραπάνω συλλογές στο MongoDB.

Μερικά παραδείγματα σταδίων διοχέτευσης συγκέντρωσης που μπορούν να χρησιμοποιηθούν μαζί με το $lookup περιλαμβάνουν:

$ταιριάζουν

Το $match είναι ένα στάδιο διοχέτευσης συγκέντρωσης που χρησιμοποιείται για το φιλτράρισμα της ροής εγγράφων για να επιτρέπεται μόνο σε εκείνα τα έγγραφα που πληρούν τη δεδομένη συνθήκη να προχωρήσουν στο επόμενο στάδιο του αγωγού συγκέντρωσης. Αυτό το στάδιο χρησιμοποιείται καλύτερα νωρίς στη διοχέτευση για την αφαίρεση εγγράφων που δεν θα χρειαστούν και, επομένως, τη βελτιστοποίηση του αγωγού συγκέντρωσης.

Χρησιμοποιώντας τις δύο προηγούμενες συλλογές, μπορείτε να συνδυάσετε το $match και το $lookup ως εξής:

db.users.aggregate([
   {
      $match: {
         country: "USA"
      }
   },
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   }
])

Το $match χρησιμοποιείται για φιλτράρισμα για χρήστες από τις ΗΠΑ. Το αποτέλεσμα από το $match συνδυάζεται στη συνέχεια με το $lookup για να ληφθούν τα στοιχεία παραγγελίας χρηστών από τις ΗΠΑ. Το αποτέλεσμα της παραπάνω λειτουργίας φαίνεται παρακάτω:

$έργο

Το $project είναι ένα στάδιο που χρησιμοποιείται για την αναμόρφωση εγγράφων, προσδιορίζοντας ποια πεδία θα συμπεριληφθούν, θα εξαιρεθούν ή θα προστεθούν σε έγγραφα. Για παράδειγμα, σε περίπτωση που επεξεργάζεστε έγγραφα με δέκα πεδία το καθένα, αλλά μόνο τέσσερα πεδία στα έγγραφα περιέχουν δεδομένα που χρειάζεστε για την επεξεργασία των δεδομένων σας, μπορείτε να χρησιμοποιήσετε το $project για να φιλτράρετε εξωτερικά τα πεδία που δεν χρειάζεστε.

Αυτό σας επιτρέπει να αποφύγετε την αποστολή περιττών δεδομένων στο επόμενο στάδιο του αγωγού συγκέντρωσης.

Μπορούμε να συνδυάσουμε το $lookup και το $project ως εξής:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $project: {
         name: 1,
         _id: 0,
         total_spent: { $sum: "$orders.price" }
      }
   }
])

Τα παραπάνω συνδυάζουν τους χρήστες και τις συλλογές παραγγελιών χρησιμοποιώντας το $lookup και, στη συνέχεια, το $project χρησιμοποιείται για την εμφάνιση μόνο του ονόματος κάθε χρήστη και του ποσού που δαπανήθηκε από κάθε χρήστη. Το $project χρησιμοποιείται επίσης για την αφαίρεση του πεδίου _id από τα αποτελέσματα. Το αποτέλεσμα της παραπάνω λειτουργίας φαίνεται παρακάτω:

  9 διαδικτυακά μαθήματα για να μάθετε τα βασικά της επενδυτικής τραπεζικής

$ξετυλίγομαι

Το $unwind είναι ένα στάδιο συνάθροισης που χρησιμοποιείται για την αποδόμηση ή το ξετύλιγμα ενός πεδίου πίνακα δημιουργώντας νέα έγγραφα για κάθε στοιχείο του πίνακα. Αυτό είναι χρήσιμο σε περίπτωση που θέλετε να εκτελέσετε κάποια συγκέντρωση στις τιμές των πεδίων του πίνακα.

Για παράδειγμα, στο παρακάτω παράδειγμα, σε περίπτωση που θέλετε να εκτελέσετε συνάθροιση στο πεδίο χόμπι, δεν μπορείτε να το κάνετε επειδή είναι ένας πίνακας. Ωστόσο, μπορείτε να χρησιμοποιήσετε το unwind it χρησιμοποιώντας το $unwind και στη συνέχεια να εκτελέσετε συναθροίσεις στα έγγραφα που προκύπτουν.

Χρησιμοποιώντας τις συλλογές χρηστών και παραγγελιών, μπορούμε να χρησιμοποιήσουμε το $lookup και το $unwind μαζί ως εξής:

db.users.aggregate([
   {
      $lookup: {
         from: "orders",
         localField: "_id",
         foreignField: "user_id",
         as: "orders"
      }
   },
   {
      $unwind: "$orders"
   }
])

Στον παραπάνω κώδικα, το $lookup επιστρέφει ένα πεδίο πίνακα που ονομάζεται παραγγελίες. Το $unwind χρησιμοποιείται στη συνέχεια για το ξετύλιγμα του πεδίου του πίνακα. Το αποτέλεσμα αυτής της λειτουργίας φαίνεται παρακάτω: Ειδοποίηση Η Αλίκη εμφανίζεται δύο φορές επειδή είχε δύο παραγγελίες.

Παραδείγματα περιπτώσεων χρήσης $lookup

Όταν εκτελείτε επεξεργασία δεδομένων, το $lookup είναι ένα χρήσιμο εργαλείο. Για παράδειγμα, μπορεί να έχετε δύο συλλογές που θέλετε να ενώσετε με βάση πεδία στις συλλογές που έχουν παρόμοια δεδομένα. Ένα απλό στάδιο $lookup μπορεί να χρησιμοποιηθεί για να γίνει αυτό και να προσθέσετε ένα νέο πεδίο στις κύριες συλλογές, οι οποίες περιέχουν έγγραφα που έχουν ληφθεί από άλλη συλλογή.

Λαμβάνει υπόψη τις συλλογές χρηστών και παραγγελιών που εμφανίζονται παρακάτω:

Οι δύο συλλογές μπορούν να συνδυαστούν χρησιμοποιώντας το $lookup για να δώσουν το αποτέλεσμα που φαίνεται παρακάτω:

Το $lookup μπορεί επίσης να χρησιμοποιηθεί για την εκτέλεση πιο σύνθετων συνδέσεων. Το $lookup δεν περιορίζεται μόνο στην εκτέλεση σύνδεσης σε δύο συλλογές. Μπορείτε να εφαρμόσετε πολλά στάδια $lookup για να εκτελέσετε συνδέσεις σε περισσότερες από δύο συλλογές. Εξετάστε τις τρεις συλλογές που εμφανίζονται παρακάτω:

Μπορούμε να χρησιμοποιήσουμε τον παρακάτω κώδικα για να εκτελέσουμε μια πιο σύνθετη ένωση στις τρεις συλλογές για να λάβουμε όλες τις παραγγελίες που έγιναν και επίσης λεπτομέρειες για τα προϊόντα που παραγγέλθηκαν.

Ο παρακάτω κώδικας μας επιτρέπει να κάνουμε ακριβώς αυτό:

db.orders.aggregate([
   {
      $lookup: {
         from: "order_items",
         localField: "_id",
         foreignField: "order_id",
         as: "order_items"
      }
   },
   {
      $unwind: "$order_items"
   },
   {
      $lookup: {
         from: "products",
         localField: "order_items.product_id",
         foreignField: "_id",
         as: "product_details"
      }
   },
   {
      $group: {
         _id: "$_id",
         customer: { $first: "$customer" },
         total: { $sum: "$order_items.price" },
         products: { $push: "$product_details" }
      }
   }
])

Το αποτέλεσμα της παραπάνω λειτουργίας φαίνεται παρακάτω:

συμπέρασμα

Όταν εκτελείτε επεξεργασία δεδομένων που περιλαμβάνει πολλές συλλογές, το $lookup μπορεί να είναι χρήσιμο, καθώς σας επιτρέπει να ενώνετε δεδομένα και να εξάγετε συμπεράσματα με βάση δεδομένα που είναι αποθηκευμένα σε πολλές συλλογές. Η επεξεργασία δεδομένων σπάνια βασίζεται σε μία μόνο συλλογή.

Για να εξαχθούν ουσιαστικά συμπεράσματα από δεδομένα, η ένωση δεδομένων σε πολλαπλές συλλογές είναι ένα βασικό βήμα. Επομένως, εξετάστε το ενδεχόμενο να χρησιμοποιήσετε το στάδιο $lookup στον αγωγό συγκέντρωσης MongoDB για να σας επιτρέψει να επεξεργάζεστε καλύτερα τα δεδομένα σας και να αντλείτε ουσιαστικές πληροφορίες από μη επεξεργασμένα δεδομένα που είναι αποθηκευμένα σε όλες τις συλλογές.

Μπορείτε επίσης να εξερευνήσετε ορισμένες εντολές και ερωτήματα MongoDB.