Ohjelmointi

MongoDB-avaimet ovat ystäväsi

Kaikilla MongoDB-kokoelman asiakirjoilla on ensisijainen avain _id. Tämä kenttä määritetään asiakirjalle automaattisesti lisäyksen yhteydessä, joten sitä on harvoin tarpeen antaa. Mikä on mielenkiintoista _id kenttä on, että se on aikaan pohjautuva. Eli taustalla oleva tyyppi _id, mikä on ObjectId, on 12-tavuinen BSON-tyyppi, ja 4 näistä tavuista edustaa sekunteja Unix-aikakaudesta.

Mikä on myös erityistä _id kenttä on, että se indeksoidaan automaattisesti, kuten näet alla soittamalla getIndexes mistä tahansa kokoelmasta.

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

Ja kuten kaikki muistavat perinteisistä RDBMS-tiedostoista, hakemistot ovat tärkeitä, koska ne voivat nopeuttaa asiakirjojen hakua; hakemistot kuitenkin kuluttavat muistia, ja asiakirjojen lisäämisessä on pieni suoritussakko, koska kaikki vastaavat hakemistot on päivitettävä. Joten vaikka sinun pitäisi harkita vakavasti hakemistojen käyttöä, sinun on oltava taloudellinen niiden käytössä.

Luonnollisesti etsiminen asiakirjan perusteella _id on kätevä vain, kun sinä tietää se. Useimmiten asiakirjoja haetaan muiden kenttien kautta ja jos huomaat etsivän esimerkiksi aikasarjojen kautta luotu_t sitten olet hoidossa.

Kuvittele kokoelma, joka on kopioitu lokit joka sisältää yksinkertaisia ​​asiakirjoja, jotka sieppaavat erilaisia ​​lokiviestejä. Esimerkkidokumentti voi näyttää tältä:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "kaatui, ei tällaista menetelmäpoikkeusta", "type": "crash", "created_at": ISODate ("2013-06-21T19: 37: 17.992Z ")} 

Entä jos halusin löytää kaikki lokiviestit tietylle päivälle, kuten tänään? Voisin kirjoittaa kyselyni näin:

1 
db.logs.find ({luotu_at: {'$ gt': uusi päivämäärä (2013, 5, 20)}}) 

Jos heitän selityksen kyselylle, voin nähdä sen, koska minulla ei ole hakemistoa luotu_t, peruskohdistinta käytetään ja kaikki kokoelman asiakirjat skannattiin tuloksen noutamiseksi.

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': uusi päivämäärä (2013, 5, 20)}}). selitä () {"cursor": "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"} 

Kuten näette, haku luotu_t kenttä voi olla tehoton; joten saatat olla kiusaus heittää hakemisto tälle kentälle. Tämä tietysti tehtäisi tietyn kyselyn tehokkaammaksi, mutta sinulle aiheutuisi uuden indeksin kustannukset, joka kuluttaa enemmän muistia ja lisäykset olisivat hieman hitaampia uuden luodun hakemiston päivityksen vuoksi.

Kuten käy ilmi, koska _id kenttä upottaa siihen Unix-aikakauden, voit yhtä helposti luoda löytölausekkeen ilman sisältäen luotu_t ala. Esimerkiksi MongoDB Ruby -ohjaimen avulla voit luoda ObjectId'S alkaen Aika niin kuin:

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