Προγραμματισμός

Τα κύρια κλειδιά του MongoDB είναι ο φίλος σας

Όλα τα έγγραφα σε μια συλλογή MongoDB έχουν μεταγλωττιστεί ένα πρωτεύον κλειδί _ταυτότητα. Αυτό το πεδίο εκχωρείται αυτόματα σε ένα έγγραφο κατά την εισαγωγή, οπότε σπάνια υπάρχει ανάγκη να το παρέχετε. Τι είναι ενδιαφέρον για το _ταυτότητα Το πεδίο είναι ότι είναι με βάση το χρόνο. Δηλαδή, ο υποκείμενος τύπος του _ταυτότητα, το οποίο είναι Αντικείμενο, είναι ένας τύπος BSON 12-byte, και 4 από αυτά τα byte αντιπροσωπεύουν τα δευτερόλεπτα από την εποχή του Unix.

Τι είναι επίσης ιδιαίτερο για το _ταυτότητα Το πεδίο είναι ότι ευρετηριάζεται αυτόματα όπως μπορείτε να δείτε παρακάτω καλώντας getIndexes σε οποιαδήποτε συλλογή.

1 2 3 4 5 6 7 8 9 10 11 
> db.things.getIndexes () [{"v": 1, "key": {"_id": 1}, "ns": "test.things", "name": "_id_"}] 

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

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

Φανταστείτε μια συλλογή που ονομάζεται αρχεία καταγραφής που περιέχει απλά έγγραφα που καταγράφουν διάφορα μηνύματα καταγραφής. Ένα δείγμα εγγράφου θα μπορούσε να μοιάζει έτσι:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "crashed, καμία τέτοια εξαίρεση μεθόδου", "type": "crash", "create_at": ISODate ("2013-06-21T19: 37: 17.992Z ")} 

Τι γίνεται αν ήθελα να βρω όλα τα μηνύματα καταγραφής για κάποια ημερομηνία, όπως σήμερα; Θα μπορούσα να γράψω το ερώτημά μου έτσι:

1 
db.logs.find ({create_at: {'$ gt': νέα Ημερομηνία (2013, 5, 20)}}) 

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
> db.logs.find ({create_at: {'$ gt': new Date (2013, 5, 20)}}). εξήγηση () {"δρομέας": "BasicCursor", "isMultiKey": false, "n" : 2, "nscannedObjects": 4, "nscanned": 4, "nscannedObjectsAllPlans": 4, "nscannedAllPlans": 4, "scanAndOrder": false, "indexOnly": false, "nYields": 0, "nChunkSkips": 0 , "millis": 0, "indexBounds": {}, "διακομιστής": "ghome-computer.home: 27017"} 

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

Όπως αποδεικνύεται, επειδή το _ταυτότητα Το πεδίο ενσωματώνει την εποχή του Unix, μπορείτε εξίσου να δημιουργήσετε μια έκφραση εύρεσης χωρίς συμπεριλαμβανομένης της δημιουργήθηκε_at πεδίο. Για παράδειγμα, το πρόγραμμα οδήγησης MongoDB Ruby σάς επιτρέπει να δημιουργήσετε ΑντικείμενοΕίναι από ένα χρόνος έτσι:

$config[zx-auto] not found$config[zx-overlay] not found