日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mongodb 主键_MongoDB主键是您的朋友

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mongodb 主键_MongoDB主键是您的朋友 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mongodb 主鍵

MongoDB集合中的所有文檔都有一個主鍵,稱為_id 。 該字段在插入后自動分配給文檔,因此幾乎不需要提供它。 _id字段有趣的是,它是基于時間的 。 也就是說, _id的基礎類型為ObjectId ,是12字節的BSON類型 ,其中的4個字節表示自Unix時代以來的秒數。

_id字段的特殊之處在于,它會通過在任何集合上調用getIndexes來自動建立索引,如下所示。

所有MongoDB集合都有一個_id字段作為索引:

> db.things.getIndexes() [{"v" : 1,"key" : {"_id" : 1},"ns" : "test.things","name" : "_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的概念,并且默認情況下已被索引。 數字?

參考: The Disco Blog博客上的MongoDB主鍵是我們JCG合作伙伴 Andrew Glover的朋友 。

翻譯自: https://www.javacodegeeks.com/2013/06/mongodb-primary-keys-are-your-friend.html

mongodb 主鍵

總結

以上是生活随笔為你收集整理的mongodb 主键_MongoDB主键是您的朋友的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。