Programavimas

„MongoDB“ pagrindiniai raktai yra jūsų draugas

Visiems „MongoDB“ kolekcijos dokumentams suteikiamas pagrindinis raktas _id. Šis laukas automatiškai priskiriamas dokumentui įterpiant, todėl retai kada reikia jo pateikti. Kas įdomu _id sritis yra tokia pagal laiką. Tai yra pagrindinis tipas _id, kuris yra ObjectId, yra 12 baitų BSON tipas, o 4 iš šių baitų reiškia sekundes nuo „Unix“ epochos.

Kuo ypatingas ir „ _id laukas yra tai, kad jis automatiškai indeksuojamas, kaip matote toliau paskambinę „getIndexes“ bet kurioje kolekcijoje.

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

Kaip visi prisimena iš tradicinių RDBMS, indeksai yra svarbūs, nes jie gali padėti greičiau gauti dokumentus; nepaisant to, indeksai išeikvoja atmintį ir įterpiant dokumentus taikoma nedidelė našumo bausmė, nes visi atitinkami indeksai turi būti atnaujinti. Taigi, nors turėtumėte rimtai apsvarstyti galimybę naudoti indeksus, turite būti ekonomiški juos naudodami.

Natūralu, kad ieškoma pagal dokumentą _id yra patogu tik tada, kai tu žinoti tai. Dažniausiai dokumentų ieškoma kituose laukuose ir, jei jūs ieškote laiko juostų, pvz., sukurtas_at tada tavęs laukia malonumas.

Įsivaizduokite kolekciją, dubliuotą rąstai kuriame yra paprasti dokumentai, fiksuojantys įvairius žurnalo pranešimus. Dokumento pavyzdys gali atrodyti taip:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "užstrigo, nėra tokio metodo išimties", "type": "crash", "sukurtas_at": ISODate ("2013-06-21T19: 37: 17.992Z ")} 

Ką daryti, jei norėčiau rasti visus tam tikros datos žurnalo pranešimus, pvz., Šiandien? Aš galėčiau parašyti savo užklausą taip:

1 
db.logs.find ({sukurtas_at: {'$ gt': nauja data (2013, 5, 20)}}) 

Jei užmesiu šios užklausos paaiškinimą, tai galiu pamatyti, nes neturiu rodyklės sukurtas_at, pagrindinis žymeklis yra sverto ir visi kolekcijos dokumentai buvo nuskaityti, norint gauti mano rezultatą.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
> db.logs.find ({sukurtas_at: {'$ gt': nauja data (2013, 5, 20)}}). paaiškinti () {"žymeklis": "Pagrindinis žymeklis", "isMultiKey": klaidingas, "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"} 

Kaip matote, ieškokite per sukurtas_at laukas gali būti neefektyvus; taigi gali kilti pagunda tame lauke mesti rodyklę. Tai natūraliai padarytų tą konkrečią užklausą efektyvesnę, tačiau turėtumėte sumokėti naują indeksą, kuris sunaudoja daugiau atminties, o įdėklai būtų šiek tiek lėtesni dėl to naujai sukurto indekso atnaujinimo.

Kaip paaiškėja, nes _id laukas į ją įterpia „Unix“ epochą, taip pat lengvai galite sukurti radinio išraišką be įskaitant sukurtas_at srityje. Pavyzdžiui, „MongoDB Ruby“ tvarkyklė leidžia kurti ObjectId’S iš a Laikas patinka taip:

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