百度快照 直接进网站,网址注册了怎么做网站,网站内页的设计,会计是做什么的mongodb 主键MongoDB集合中的所有文档都有一个主键#xff0c;称为_id 。 该字段在插入后自动分配给文档#xff0c;因此几乎不需要提供它。 _id字段有趣的是#xff0c;它是基于时间的 。 也就是说#xff0c; _id的基础类型为ObjectId #xff0c;是12字节的BSON类型 称为_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 whichll展示自由的使用_id索引。 使用派生日期的ObjectId强制查找使用_id索引 mongodb[:logs].find({_id: {$gt custom_id}}).explain {cursorBtreeCursor _id_, isMultiKeyfalse, n1, nscannedObjects1, nscanned1, ....} 如果看到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.htmlmongodb 主键