Vsi dokumenti v zbirki MongoDB imajo primarni ključ sinhroniziran _id
. To polje se dokumentu samodejno dodeli ob vstavitvi, zato ga le redko potrebujete. Kaj je zanimivega pri _id
polje je, da je temelji na času. Se pravi osnovna vrsta _id
, kateri je ObjectId
, je 12-bajtni tip BSON, in 4 od teh bajtov predstavljajo sekunde od obdobja Unixa.
Kaj je prav tako posebnega pri _id
polje je, da se samodejno indeksira, kot lahko vidite spodaj s klicem getIndexes
na kateri koli zbirki.
|
|
In kot se vsi spomnijo tradicionalnih RDBMS, so indeksi pomembni, ker lahko pospešijo iskanje dokumentov; kljub temu indeksi porabljajo pomnilnik in pri vstavljanju dokumentov obstaja majhna kazen za uspešnost, saj je treba posodobiti vse ustrezne indekse. Čeprav bi morali resno razmisliti o uporabi indeksov, morate biti pri njihovi uporabi varčni.
Seveda iskanje po dokumentu _id
je priročen samo takrat, ko vi vem to. Dokumente najpogosteje iščejo po drugih poljih in če se znajdete po časovni vrsti, kot je npr created_at
potem vas čaka priboljšek.
Predstavljajte si zbirko, sinhronizirano dnevniki
ki vsebuje preproste dokumente, ki zajemajo različna dnevniška sporočila. Vzorec dokumenta bi lahko bil videti tako:
|
|
Kaj pa, če bi želel najti vsa dnevniška sporočila za nek datum, na primer danes? Svojo poizvedbo bi lahko napisal takole:
|
|
Če vrnem razlago za to poizvedbo, lahko to vidim, ker nimam indeksa created_at
, vzame se osnovni kurzor in vsi dokumenti v zbirki so bili optično prebrani, da bi dobili moj rezultat.
|
|
Kot lahko vidite, iskanje prek created_at
polje je lahko neučinkovito; zato vas bo morda zamikalo, da bi na to polje vrgli kazalo. S tem bi bila ta poizvedba seveda učinkovitejša, vendar bi zaradi novega posodobljenega indeksa nastali stroški novega indeksa, ki zasede več pomnilnika, vstavki pa bi bili nekoliko počasnejši.
Izkazalo se je, ker _id
polje vanj vdela Unix epoho, lahko prav tako enostavno oblikujete izraz za iskanje brez vključno z created_at
polje. Na primer, gonilnik MongoDB Ruby vam omogoča ustvarjanje ObjectId
Je iz Čas
tako kot: