Programiranje

Primarni ključi MongoDB so vaš prijatelj

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.

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

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:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "zrušil se, ni izjeme take metode", "type": "crash", "created_at": ISODate ("2013-06-21T19: 37: 17.992Z ")} 

Kaj pa, če bi želel najti vsa dnevniška sporočila za nek datum, na primer danes? Svojo poizvedbo bi lahko napisal takole:

1 
db.logs.find ({created_at: {'$ gt': nov datum (2013, 5, 20)}}) 

Č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.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
> db.logs.find ({created_at: {'$ gt': nov datum (2013, 5, 20)}}). obrazložite () {"kurzor": "BasicCursor", "isMultiKey": false, "n" : 2, "nscannedObjects": 4, "nscanned": 4, "nscannedObjectsAllPlans": 4, "nscannedAllPlans": 4, "scanAndOrder": false, "indexOnly": false, "nYields": 0, "nChunkSkips": 0 , "millis": 0, "indexBounds": {}, "server": "ghome-computer.home: 27017"} 

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 ObjectIdJe iz Čas tako kot:

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