Programmēšana

MongoDB primārās atslēgas ir jūsu draugs

Visiem MongoDB kolekcijas dokumentiem ir dublēta primārā atslēga _id. Šis lauks tiek automātiski piešķirts dokumentam pēc ievietošanas, tāpēc reti ir nepieciešams to iesniegt. Kas ir interesants _id lauks ir tāds, ka ir atkarībā no laika. Tas ir, pamatā esošais veids _id, kurš ir ObjectId, ir 12 baitu BSON tips, un 4 no šiem baitiem atspoguļo sekundes kopš Unix laikmeta.

Kas ir arī īpašs _id lauks ir tāds, ka tas tiek automātiski indeksēts, kā jūs varat redzēt zemāk, zvanot getIndexes par jebkuru kolekciju.

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

Un kā visi atceras no tradicionālajām RDBMS, indeksi ir svarīgi, jo tie var padarīt dokumentu izguvi ātrāku; tomēr indeksi patērē atmiņu, un, ievietojot dokumentus, tiek piemērots neliels izpildes sods, jo visi atbilstošie indeksi ir jāatjaunina. Tādējādi, lai gan jums vajadzētu nopietni apsvērt iespēju izmantot indeksus, to lietošanai jābūt ekonomiskam.

Protams, meklējot pēc dokumenta _id ir ērti tikai tad, kad jūs zināt to. Biežāk dokumenti tiek meklēti citos laukos, un, ja jūs meklējat, izmantojot laika rindas, piemēram, izveidots_at tad jūs gaida kārums.

Iedomājieties kolekciju, kas dublēta baļķi kas satur vienkāršus dokumentus, kas uztver dažādus žurnāla ziņojumus. Dokumenta paraugs varētu izskatīties šādi:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "avarēja, bez šādas metodes izņēmuma", "type": "crash", "created_at": ISODate ("2013-06-21T19: 37: 17.992Z ")} 

Ko darīt, ja es gribētu atrast visus žurnāla ziņojumus kādam datumam, piemēram, šodien? Es varētu uzrakstīt savu vaicājumu šādi:

1 
db.logs.find ({izveidots_at: {'$ gt': jauns datums (2013, 5, 20)}}) 

Ja es izskaidroju šo vaicājumu, es to redzu, jo man nav ieslēgta indeksa izveidots_at, tiek izmantots pamata kursors, un visi kolekcijas dokumenti tika skenēti, lai izgūtu manu rezultātu.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
> db.logs.find ({izveidots_at: {'$ gt': jauns datums (2013, 5, 20)}}). izskaidrot () {"kursors": "BasicCursor", "isMultiKey": nepatiesa, "n" : 2, "nscannedObjects": 4, "nscanned": 4, "nscannedObjectsAllPlans": 4, "nscannedAllPlans": 4, "scanAndOrder": false, "indexOnly": false, "nYields": 0, "nChunkSkips": 0 , "millis": 0, "indexBounds": {}, "serveris": "ghome-computer.home: 27017"} 

Kā redzat, meklēšana, izmantojot izveidots_at lauks var būt neefektīvs; tādējādi jums varētu rasties kārdinājums mest rādītāju šajā laukā. Tas, protams, padarīs šo konkrēto vaicājumu efektīvāku, tomēr jums radīsies izmaksas par jaunu indeksu, kas patērē vairāk atmiņas, un ieliktņi būtu nedaudz lēnāki, pateicoties jaunizveidotā indeksa atjauninājumam.

Kā izrādās, jo _id lauks tajā iekļauj Unix laikmetu, jūs varat tikpat viegli izveidot atraduma izteiksmi bez ieskaitot izveidots_at laukā. Piemēram, MongoDB Ruby draiveris ļauj jums izveidot ObjectId’S no a Laiks tāpat kā:

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