mongodb 主键_MongoDB主键是您的朋友
mongodb 主鍵
MongoDB集合中的所有文檔都有一個主鍵,稱為_id 。 該字段在插入后自動分配給文檔,因此幾乎不需要提供它。 _id字段有趣的是,它是基于時間的 。 也就是說, _id的基礎類型為ObjectId ,是12字節的BSON類型 ,其中的4個字節表示自Unix時代以來的秒數。
_id字段的特殊之處在于,它會通過在任何集合上調用getIndexes來自動建立索引,如下所示。
所有MongoDB集合都有一個_id字段作為索引:
就像每個人都記得傳統RDBMS一樣, 索引很重要,因為它們可以使文檔檢索更快。 但是,索引確實會占用內存,并且在插入文檔時會稍微降低性能,因為必須更新所有相應的索引。 因此,盡管您應該認真考慮使用索引,但是在使用索引時需要經濟。
自然地,僅當您知道文檔的_id時才進行搜索。 通常會通過其他字段來搜索文檔,如果您發現自己是通過時間序列 (例如created_at進行搜索的,那么您就來了。
想象一個稱為logs的集合,其中包含捕獲各種日志消息的簡單文檔。 示例文檔如下所示:
日志收集中的一個簡單文檔:
{"_id" : ObjectId("51c4ab6d4d6906d494460728"),"message" : "crashed, no such method exception","type" : "crash","created_at" : ISODate("2013-06-21T19:37:17.992Z") }如果我想查找某個日期(例如今天)的所有日志消息怎么辦? 我可以這樣寫查詢:
查找自2013年6月20日以來創建的所有日志:
db.logs.find({created_at:{'$gt': new Date(2013, 5, 20)}})如果我對該查詢進行解釋,則可以看到,因為我在created_at上沒有索引,因此可以利用基本游標,并且掃描了集合中的所有文檔以檢索結果。
我的發現附有一個解釋計劃:
> 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" }如您所見,通過created_at字段進行搜索可能效率不高; 因此,您可能很想在該字段上添加索引。 這自然會使該特定查詢效率更高,但是,您將招致新索引的開銷,這將消耗更多的內存,并且由于對該新創建的索引進行了更新,因此插入操作會稍微慢一些。
事實證明,由于_id字段在其中嵌入了Unix紀元,因此無需包含created_at字段,就可以輕松地編寫find表達式。 例如, MongoDB Ruby驅動程序允許您從類似這樣的Time創建ObjectId :
通過from_time工廠方法創建一個新的ObjectId:
yesterday = Time.now - (60*60*(24*1)) custom_id = BSON::ObjectId.from_time(yesterday) => BSON::ObjectId('51c397800000000000000000')如您所見,我通過from_time工廠方法創建了一個新的ObjectId 。 51c397800000000000000000是十六進制表示形式,前8位數字表示時間,其他所有內容均清零。
現在,我可以在任何find表達式中使用我的custom_id了。 通過Ruby驅動程序,我還可以將一個explain ,which'll展示自由的使用_id索引。
使用派生日期的ObjectId強制查找使用_id索引:
mongodb[:logs].find({_id: {'$gt' => custom_id}}).explain=> {"cursor"=>"BtreeCursor _id_", "isMultiKey"=>false, "n"=>1, "nscannedObjects"=>1, "nscanned"=>1, ....}如果看到BtreeCusor ,則表明您正在使用索引; 如果看到BasicCursor ,那么您知道不是。
因此,如果您發現自己正在執行查詢并為諸如created_at之類的某個時間或日期字段創建索引,那么最好只使用Mongo的_id字段,因為它已經嵌入了創建于at的概念,并且默認情況下已被索引。 數字?
翻譯自: https://www.javacodegeeks.com/2013/06/mongodb-primary-keys-are-your-friend.html
mongodb 主鍵
總結
以上是生活随笔為你收集整理的mongodb 主键_MongoDB主键是您的朋友的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么手机一打电话就断网
- 下一篇: 蓝牙音箱选择时要注意哪几个要点