Kekunci utama MongoDB adalah rakan anda

Semua dokumen dalam koleksi MongoDB mempunyai kunci utama yang dijuluki _id. Medan ini diberikan secara automatik ke dokumen setelah disisipkan, jadi jarang ada keperluan untuk memberikannya. Apa yang menarik mengenai _idbidang ini adalah berdasarkan masa . Iaitu, jenis yang mendasari _id, iaitu ObjectId, jenis BSON 12-byte, dan 4 bait tersebut mewakili detik sejak zaman Unix.

Apa yang istimewa dari _idbidang ini ialah secara automatik diindeks seperti yang anda lihat di bawah dengan memanggil getIndexeskoleksi apa pun.

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

Dan seperti yang diingat oleh semua orang dari RDBMS tradisional, indeks penting kerana mereka dapat membuat pengambilan dokumen lebih cepat; namun demikian, indeks menggunakan memori dan ada sedikit hukuman prestasi semasa memasukkan dokumen kerana semua indeks yang sesuai mesti dikemas kini. Oleh itu, walaupun anda harus mempertimbangkan penggunaan indeks dengan serius, anda perlu menjimatkan penggunaannya.

Secara semula jadi, mencari melalui dokumen _idhanya sesuai apabila anda mengetahuinya . Lebih kerap daripada tidak, dokumen dicari melalui bidang lain dan jika anda mencari melalui siri masa, seperti created_atketika anda mencari makanan.

Bayangkan koleksi dijuluki logsyang mengandungi dokumen mudah menangkap pelbagai mesej log. Contoh dokumen seperti ini:

1 2 3 4 5 6 
{ "_id" : ObjectId("51c4ab6d4d6906d494460728"), "message" : "crashed, no such method exception", "type" : "crash", "created_at" : ISODate("2013-06-21T19:37:17.992Z") } 

Bagaimana jika saya ingin mencari semua mesej log untuk beberapa tarikh, seperti hari ini? Saya boleh menulis pertanyaan saya seperti ini:

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

Sekiranya saya memberikan penjelasan untuk pertanyaan itu, saya dapat melihatnya kerana saya tidak mempunyai indeks created_at, kursor asas dimanfaatkan dan semua dokumen dalam koleksi diimbas untuk mendapatkan hasil saya.

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': new Date(2013, 5, 20)}}).explain() { "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" } 

Seperti yang anda lihat, mencari melalui created_atlapangan tidak berkesan; dengan demikian, anda mungkin tergoda untuk melemparkan indeks di bidang tersebut. Ini secara semula jadi menjadikan pertanyaan tertentu lebih efisien, namun, anda akan menanggung kos indeks baru yang lebih banyak memori yang digunakan dan sisipan akan sedikit lebih perlahan kerana kemas kini ke indeks yang baru dibuat.

Ternyata, kerana _idbidang menyematkan zaman Unix di dalamnya, anda boleh membuat ungkapan penemuan dengan mudah tanpa memasukkan created_atbidang. Sebagai contoh, pemacu Ruby MongoDB membolehkan anda membuat ObjectIddari Timeseperti: