Η μετάφραση του άρθρου ετοιμάστηκε την παραμονή της έναρξης του μαθήματος
Χαρακτηριστικά:
- Είναι εξαιρετικά σημαντικό να αναπτύξετε ένα σχήμα παρόλο που είναι προαιρετικό στο MongoDB.
- Ομοίως, τα ευρετήρια πρέπει να ταιριάζουν με το σχήμα και τα μοτίβα πρόσβασης.
- Αποφύγετε τη χρήση μεγάλων αντικειμένων και μεγάλων συστοιχιών.
- Να είστε προσεκτικοί με τις ρυθμίσεις MongoDB, ειδικά όταν πρόκειται για ασφάλεια και αξιοπιστία.
- Το MongoDB δεν διαθέτει βελτιστοποιητή ερωτημάτων, επομένως πρέπει να είστε προσεκτικοί όταν εκτελείτε λειτουργίες ερωτήματος.
Δουλεύω με βάσεις δεδομένων για πολύ καιρό, αλλά μόλις πρόσφατα ανακάλυψα το MongoDB. Υπάρχουν μερικά πράγματα που θα ήθελα να ήξερα πριν ξεκινήσω να ασχολούμαι με αυτό. Όταν ένα άτομο έχει ήδη εμπειρία σε έναν συγκεκριμένο τομέα, έχει προκαταλήψεις σχετικά με το τι είναι οι βάσεις δεδομένων και τι κάνουν. Με την ελπίδα να διευκολύνω τους άλλους να καταλάβουν, παρουσιάζω μια λίστα με κοινά λάθη.
Δημιουργία διακομιστή MongoDB χωρίς έλεγχο ταυτότητας
Δυστυχώς, το MongoDB είναι εγκατεστημένο χωρίς έλεγχο ταυτότητας από προεπιλογή. Για έναν σταθμό εργασίας με τοπική πρόσβαση, αυτή η πρακτική είναι φυσιολογική. Αλλά επειδή το MongoDB είναι ένα σύστημα πολλών χρηστών που του αρέσει να χρησιμοποιεί μεγάλες ποσότητες μνήμης, θα είναι καλύτερο να το τοποθετήσετε σε έναν διακομιστή με όσο το δυνατόν περισσότερη μνήμη RAM, ακόμα κι αν πρόκειται να το χρησιμοποιήσετε μόνο για ανάπτυξη. Η εγκατάσταση στον διακομιστή μέσω της προεπιλεγμένης θύρας μπορεί να είναι προβληματική, ειδικά εάν μπορεί να εκτελεστεί οποιοσδήποτε κώδικας javascript στο αίτημα (για παράδειγμα, $where
ως ιδέα για
Υπάρχουν πολλές μέθοδοι ελέγχου ταυτότητας, αλλά η πιο εύκολη είναι να ορίσετε ένα αναγνωριστικό χρήστη/κωδικό πρόσβασης. Χρησιμοποιήστε αυτήν την ιδέα ενώ σκέφτεστε τον φανταχτερό έλεγχο ταυτότητας βάσει
Μην ξεχάσετε να συνδέσετε την επιφάνεια επίθεσης στο MongoDB
,
ή
. Δεδομένου ότι τα αρχεία δεδομένων δεν είναι κρυπτογραφημένα στο τυπικό MongoDB, είναι λογικό να εκτελείτε το MongoDB με
Σφάλμα κατά την ανάπτυξη του κυκλώματος
Το MongoDB δεν χρησιμοποιεί σχήμα. Αυτό όμως δεν σημαίνει ότι το σύστημα δεν χρειάζεται. Εάν θέλετε απλώς να αποθηκεύσετε έγγραφα χωρίς σταθερό μοτίβο, η αποθήκευση τους μπορεί να είναι γρήγορη και εύκολη, αλλά η ανάκτησή τους αργότερα μπορεί να είναι δύσκολη.
Κλασικό άρθρο "
Μην ξεχνάτε τη σειρά ταξινόμησης
Το να ξεχάσετε τη σειρά ταξινόμησης μπορεί να προκαλέσει περισσότερη απογοήτευση και χάσιμο περισσότερου χρόνου από οποιαδήποτε άλλη εσφαλμένη διαμόρφωση. Από προεπιλογή χρησιμοποιεί MongoBD
Δημιουργήστε συλλογές με μεγάλα έγγραφα
Η MongoDB είναι στην ευχάριστη θέση να φιλοξενεί μεγάλα έγγραφα έως 16MB σε συλλογές και
Δημιουργία εγγράφων με μεγάλες συστοιχίες
Τα έγγραφα μπορεί να περιέχουν πίνακες. Είναι καλύτερο εάν ο αριθμός των στοιχείων στον πίνακα απέχει πολύ από έναν τετραψήφιο αριθμό. Εάν τα στοιχεία προστίθενται συχνά σε έναν πίνακα, θα ξεπεράσει το έγγραφο που τον περιέχει και θα πρέπει να είναι
Το MongoDB έχει κάτι που λέγεται
Ίσως νομίζετε ότι μπορείτε να κάνετε χωρίς ευρετηρίαση πίνακα. Δυστυχώς, η έλλειψη ευρετηρίων μπορεί να σας προκαλέσει άλλα προβλήματα. Δεδομένου ότι τα έγγραφα σαρώνονται από την αρχή μέχρι το τέλος, η αναζήτηση στοιχείων στο τέλος του πίνακα θα διαρκέσει περισσότερο και οι περισσότερες λειτουργίες που σχετίζονται με ένα τέτοιο έγγραφο θα είναι
Μην ξεχνάτε ότι η σειρά των σταδίων σε μια συγκέντρωση έχει σημασία
Σε ένα σύστημα βάσης δεδομένων με βελτιστοποιητή ερωτημάτων, τα ερωτήματα που γράφετε είναι επεξηγήσεις του τι θέλετε να λάβετε, όχι πώς να το αποκτήσετε. Αυτός ο μηχανισμός λειτουργεί αναλογικά με την παραγγελία σε ένα εστιατόριο: συνήθως παραγγέλνετε απλώς ένα πιάτο και δεν δίνετε λεπτομερείς οδηγίες στον μάγειρα.
Στο MongoDB, δίνετε οδηγίες στον μάγειρα. Για παράδειγμα, πρέπει να βεβαιωθείτε ότι τα δεδομένα περνούν reduce
όσο το δυνατόν νωρίτερα στην κυκλοφορία χρησιμοποιώντας $match
и $project
, και η ταξινόμηση γίνεται μόνο μετά reduce
, και ότι η αναζήτηση γίνεται με τη σειρά που θέλετε. Το να έχετε ένα πρόγραμμα βελτιστοποίησης ερωτημάτων που εξαλείφει την περιττή εργασία, ταξινομεί βέλτιστα τα βήματα και επιλέγει τύπους ένωσης μπορεί να σας χαλάσει. Με το MongoDB, έχετε περισσότερο έλεγχο με το κόστος της ευκολίας.
Εργαλεία όπως
Χρήση γρήγορης εγγραφής
Ποτέ μην ορίζετε τις επιλογές εγγραφής MongoDB ώστε να έχουν υψηλή ταχύτητα αλλά χαμηλή αξιοπιστία. Αυτή η λειτουργία "αρχειο-και-ξεχασε" φαίνεται γρήγορο γιατί η εντολή επιστρέφεται πριν γίνει η εγγραφή. Εάν το σύστημα διακοπεί πριν εγγραφούν τα δεδομένα στο δίσκο, θα χαθεί και θα καταλήξει σε ασυνεπή κατάσταση. Ευτυχώς, το MongoDB 64-bit έχει ενεργοποιημένη την καταγραφή.
Οι μηχανές αποθήκευσης MMAPv1 και WiredTiger χρησιμοποιούν καταγραφή για να το αποτρέψουν αυτό, αν και το WiredTiger μπορεί να ανακτήσει μέχρι την τελευταία συνεπή
Το journaling διασφαλίζει ότι η βάση δεδομένων είναι σε συνεπή κατάσταση μετά την ανάκτηση και διατηρεί όλα τα δεδομένα μέχρι να εγγραφεί στο αρχείο καταγραφής. Η συχνότητα των εγγραφών διαμορφώνεται χρησιμοποιώντας την παράμετρο
.
Για να είστε σίγουροι για τις καταχωρήσεις, βεβαιωθείτε ότι η καταγραφή είναι ενεργοποιημένη στο αρχείο διαμόρφωσης
, και η συχνότητα των εγγραφών αντιστοιχεί στον όγκο των πληροφοριών που έχετε την πολυτέλεια να χάσετε.
Ταξινόμηση χωρίς ευρετήριο
Κατά την αναζήτηση και τη συγκέντρωση, συχνά υπάρχει ανάγκη ταξινόμησης δεδομένων. Ας ελπίσουμε ότι αυτό θα γίνει σε ένα από τα τελικά στάδια, αφού φιλτράρουμε το αποτέλεσμα, προκειμένου να μειωθεί ο όγκος των δεδομένων που ταξινομούνται. Και ακόμη και σε αυτή την περίπτωση, για ταξινόμηση θα χρειαστείτε
Εάν δεν υπάρχει κατάλληλο ευρετήριο, το MongoDB θα κάνει χωρίς αυτό. Υπάρχει όριο μνήμης 32 MB για το συνολικό μέγεθος όλων των εγγράφων
Αναζήτηση χωρίς υποστήριξη ευρετηρίου
Τα ερωτήματα αναζήτησης εκτελούν μια λειτουργία παρόμοια με τη λειτουργία JOIN στην SQL. Για να λειτουργήσουν καλύτερα, χρειάζονται το ευρετήριο της τιμής του κλειδιού που χρησιμοποιείται ως ξένο κλειδί. Αυτό δεν είναι προφανές γιατί η χρήση δεν αντικατοπτρίζεται explain()
. Τέτοιοι δείκτες είναι επιπλέον του ευρετηρίου που είναι γραμμένο explain()
, το οποίο με τη σειρά του χρησιμοποιείται από τους φορείς εκμετάλλευσης αγωγών $match
и $sort
, όταν συναντώνται στην αρχή του αγωγού. Τα ευρετήρια μπορούν πλέον να καλύψουν οποιοδήποτε στάδιο
Εξαίρεση από τη χρήση πολλαπλών ενημερώσεων
Μέθοδος
χρησιμοποιείται για την αλλαγή μέρους ενός υπάρχοντος εγγράφου ή ολόκληρου του εγγράφου, έως την πλήρη αντικατάσταση, ανάλογα με την παράμετρο που καθορίζετε
. Αυτό που δεν είναι τόσο προφανές είναι ότι δεν θα επεξεργαστεί όλα τα έγγραφα της συλλογής εκτός και αν ορίσετε την επιλογή
για την ενημέρωση όλων των εγγράφων που πληρούν τα κριτήρια αιτήματος.
Μην ξεχνάτε τη σημασία της σειράς των κλειδιών σε έναν πίνακα κατακερματισμού
Στο JSON, ένα αντικείμενο αποτελείται από μια μη ταξινομημένη συλλογή με μέγεθος μηδέν ή περισσότερα ζεύγη ονόματος/τιμής, όπου το όνομα είναι μια συμβολοσειρά και η τιμή είναι μια συμβολοσειρά, αριθμός, boolean, null, αντικείμενο ή πίνακας.
Δυστυχώς, η BSON δίνει μεγάλη έμφαση στη σειρά κατά την αναζήτηση. Στο MongoDB, η σειρά των κλειδιών μέσα σε ενσωματωμένα αντικείμενα { firstname: "Phil", surname: "factor" }
- αυτό δεν είναι το ίδιο με { { surname: "factor", firstname: "Phil" }
. Δηλαδή, πρέπει να αποθηκεύσετε τη σειρά των ζευγών ονόματος/τιμής στα έγγραφά σας εάν θέλετε να είστε σίγουροι ότι θα τα βρείτε.
Μην μπερδεύεστε μηδενικό и "απροσδιόριστος"
Αξία "απροσδιόριστος" δεν ήταν ποτέ έγκυρη σε JSON, σύμφωνα με $null
, που δεν είναι πάντα καλή λύση.
Χρήση $limit()
χωρίς $sort()
Πολύ συχνά, όταν αναπτύσσετε στο MongoDB, είναι χρήσιμο να βλέπετε απλώς ένα δείγμα του αποτελέσματος που θα επιστραφεί από ένα ερώτημα ή μια συγκέντρωση. Για αυτήν την εργασία θα χρειαστείτε $limit()
, αλλά δεν πρέπει ποτέ να βρίσκεται στον τελικό κωδικό, εκτός και αν τον έχετε χρησιμοποιήσει πριν $sort
. Αυτός ο μηχανικός είναι απαραίτητος γιατί διαφορετικά δεν μπορείτε να εγγυηθείτε τη σειρά του αποτελέσματος και δεν θα μπορείτε να προβάλετε αξιόπιστα τα δεδομένα. Στην κορυφή του αποτελέσματος θα λάβετε διαφορετικές καταχωρήσεις ανάλογα με την ταξινόμηση. Για να λειτουργούν αξιόπιστα, τα ερωτήματα και οι συναθροίσεις πρέπει να είναι ντετερμινιστικά, δηλαδή να παράγουν τα ίδια αποτελέσματα κάθε φορά που εκτελούνται. Κωδικός που περιέχει $limit()
, αλλά όχι $sort
, δεν θα είναι ντετερμινιστικό και μπορεί στη συνέχεια να προκαλέσει σφάλματα που θα είναι δύσκολο να εντοπιστούν.
Συμπέρασμα
Ο μόνος τρόπος για να απογοητευτείτε με το MongoDB είναι να το συγκρίνετε απευθείας με έναν άλλο τύπο βάσης δεδομένων, όπως ένα DBMS, ή να αρχίσετε να το χρησιμοποιείτε με βάση ορισμένες προσδοκίες. Είναι σαν να συγκρίνεις ένα πορτοκάλι με ένα πιρούνι. Τα συστήματα βάσεων δεδομένων εξυπηρετούν συγκεκριμένους σκοπούς. Είναι καλύτερο να κατανοήσετε και να εκτιμήσετε μόνοι σας αυτές τις διαφορές. Θα ήταν κρίμα να πιέσουμε τους προγραμματιστές του MongoDB για μια διαδρομή που τους ανάγκασε να ακολουθήσουν τη διαδρομή DBMS. Θέλω να δω νέους και ενδιαφέροντες τρόπους επίλυσης παλαιών προβλημάτων, όπως η διασφάλιση της ακεραιότητας των δεδομένων και η δημιουργία συστημάτων δεδομένων που να είναι ανθεκτικά σε αποτυχίες και κακόβουλες επιθέσεις.
Η εισαγωγή της συναλλακτικότητας ACID από την MongoDB στην έκδοση 4.0 είναι ένα καλό παράδειγμα εισαγωγής σημαντικών βελτιώσεων με καινοτόμο τρόπο. Οι συναλλαγές πολλαπλών εγγράφων και πολλαπλών δηλώσεων είναι πλέον ατομικές. Είναι επίσης δυνατή η προσαρμογή του χρόνου που απαιτείται για την απόκτηση κλειδαριών και τον τερματισμό των κολλημένων συναλλαγών, καθώς και την αλλαγή του επιπέδου απομόνωσης.
Διαβάστε περισσότερα:
Πηγή: www.habr.com