`
san_yun
  • 浏览: 2638949 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

理解mongodb的ObjectId

 
阅读更多

 

Posted in nosql on 三月 8th, 2011 by kafka0102 mongodb支持的数据类型中,ObjectId是其自有产物,本文对其做些简单的介绍。

存储在mongodb集合中的每个文档(document)都有一个默认的主键_id,这个主键名称是固定的,它可以是mongodb支持的任何数据类 型,默认是ObjectId。在关系数据库schema设计中,主键大多是数值型的,比如常用的int和long,并且更通常的,主键的取值由数据库自增 获得,这种主键数值的有序性有时也表明了某种逻辑。反观mongodb,它在设计之初就定位于分布式存储系统,所以它原生的不支持自增主键。而现实的世界 是,大量应用在可预见的时空里并不需要分布式的mongodb,所以网上就出现了大量的实现mongodb自增主键方法的文章。恩,我之前也干过这种事 情。

还是看看ObjectId的底细吧。ObjectId被设计成跨机器的分布式环境中全局唯一的类型,长度是12个字节。有朋友可能嘀咕了,这可比int大 了两倍,比long也多了一个int,很不经济嘛,但在现在的硬件配置中,多出的这些字节很难有理由成为系统的瓶颈所在,所以尽可能放心使用之。 ObjectId的12字节是如此构成的:0-3这4个字节是时间戳(timestamp)、4-6这3个字节是机器码(machine)、7-8两个字 节是进程id(pid)、9-11是程序自增id(increment)。可以看下java driver中ObjectId的实现代码:

public
 class
 ObjectId implements
 Comparable<
ObjectId>
 , java.io
.Serializable

 

对于ObjectId的组成,有一些值得说道的地方:
1、因为ObjectId以时间戳打头,所以它是近似有序的,使得_id的索引插入效率相比普通索引高很多。
2、ObjectId的前9个字节(timestamp+machine+pid)可以保证不同进程生成的ObjectId不会重复,而后3个字节increment又可以保证同一进程内生成的ObjectId不会重复,所以无需怀疑ObjectId的全局唯一性。
3、ObjectId存储是12个字节,但如果应用有需要以可读的方式表现它,就需要将它转成字符串,这需要24字节(每字节转成2字节的16进制表 示),这个长度的字符串看起来就有些不让人舒服了,如果是追踪某个_id引发的bug,就需要配上copy+paste的杀招。
4、初涉ObjectId的朋友很容易犯的两个错误:1)是查询时直接使用类似db.collection.find({_id:”xx”})式的代码, 结果怎么也查不到明明存在的文档,而正确的写法应该是:db.collection.find({_id:new ObjectId(“xx”)})。2)是集合间有外键关联时,也需要将外键置为ObjectId类型,而不要直接使用上24字节的string。在写与 mongodb打交道的CRUD代码时,需要多留意ObjectId和string的转换代码。
5、ObjectId的产生既可以在应用程序端也可以在mongodb端,各种语言的driver都提供了程序端生成ObjectId的方法,不过大多数 人徒省事直接交给mongodb做了。但从mongodb的设计哲学来说,ObjectId更应该由客户端生成,毕竟应用层比存储层更容易扩展,并会提高 mongodb的插入速度。

 

原文:http://www.kafka0102.com/2011/03/435.html

分享到:
评论

相关推荐

    MongoDB ObjectId

    MongoDB ObjectId是一个重要的概念,它是MongoDB数据库中用于唯一标识文档的一个特殊数据类型。ObjectId作为一个12字节的BSON...在实际应用中,理解并合理利用ObjectId的各种特性,能够提高数据管理的效率和便利性。

    MongoDB的ObjectId.pdf

    在深入讨论 ObjectId 的结构和功能之前,我们需要理解 MongoDB 的基本架构,它是一个基于分布式文件存储的开源文档数据库,强调高性能、高可用性和可扩展性。 ObjectId 的结构如下: 1. **时间戳(4 个字节)**:...

    深究从MongoDB的ObjectId中获取时间信息

    在MongoDB中,每个文档都有一个默认的主键字段`_id`,其类型为ObjectId。ObjectId是一个12字节的二进制结构,通常用于唯一标识文档。在本文中,我们将深入探讨如何从ObjectId中提取时间信息。 ObjectId的结构如下:...

    python根据时间生成mongodb的ObjectId的方法

    通过理解`ObjectId`的结构和生成机制,我们可以更有效地利用MongoDB的特性,提升数据查询的效率和便利性。在Python编程中,结合使用`pymongo`库,我们可以实现更多高级的MongoDB操作,如建立索引、执行聚合查询等,...

    Node.js使用MongoDB的ObjectId作为查询条件的方法

    在Node.js环境中,当你使用MongoDB作为数据库时,经常需要处理`ObjectId`作为查询条件的情况。MongoDB在插入新文档时,会自动生成一个唯一的`ObjectId`作为文档的 `_id` 字段,这个字段通常用于唯一标识每条记录。...

    MongoDB中ObjectId的误区及引起的一系列问题

    MongoDB的ObjectId是一个12字节的BSON类型数据,用于唯一标识文档。它由四个部分组成,每个部分都有特定的用途,以确保全局唯一性。以下是对标题和描述中...理解这些误区有助于避免在使用MongoDB时遇到不必要的问题。

    MongoDB插入文档与ObjectID操作.pdf

    在实际操作 MongoDB 时,理解这些基本概念对于有效地插入、查询和管理数据至关重要。例如,你可以通过 ObjectId 的时间戳来大致判断文档的创建顺序,或者利用其唯一性来避免数据冲突。掌握这些知识能帮助你更好地...

    MongoDB简介与实践.pdf

    从提供的文件内容中,我们可以提取出以下关于MongoDB的知识点: 1. 关于NoSQL的知识点: ...通过这些知识点,我们可以更好地理解MongoDB的设计理念、优势、特性和应用方法,以便在实际开发中做出合适的数据存储选择。

    Java连接mongoDB需要的jar包(3.9.1)

    这个库提供了对BSON数据类型的编码和解码功能,使得Java应用程序能够理解和处理MongoDB中的文档结构。BSON是一种轻量级的数据交换格式,类似于JSON,但支持更多数据类型,如日期、二进制数据和ObjectId等。 2. `...

    深入理解MongoDB的复合索引

    当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样适用于其他的数据库比如mysql)。 mongo-9552:PRIMARY&gt; db.person.find() { "_id" : ...

    c#操作mongodb实例(含完整源码)

    MongoDB是一种流行的开源文档数据库,以其灵活性、高性能和易于扩展性而受到开发者的青睐。...通过深入研究并理解这些源码,开发者可以更好地掌握MongoDB的C#驱动程序,并将其应用到实际的项目开发中。

    mongodb相关资源

    通过学习和理解上述知识点,你将能够有效地安装、管理和利用MongoDB作为你的数据库解决方案。资源中的"安装教程.txt"文档应能帮助你解决安装过程中遇到的具体问题,进一步提升你的MongoDB操作技能。

    python将MongoDB里的ObjectId转换为时间戳的方法

    在Python中,MongoDB的`ObjectId`是一种用于唯一标识文档的内置类型,...总之,了解如何在Python中处理MongoDB的`ObjectId`时间戳对于数据操作和分析是非常重要的,它可以增强你对数据存储和查询的理解,提升开发效率。

    mongodb数据库设计

    为了更好地理解MongoDB中的数据库设计,我们首先来看一下具体的实体类定义。 ##### 1. Band类 ```java @Entity("bands") public class Band { @Id ObjectId id; String name; String genre; @Reference ...

    MongoDb数据结构详解.pdf

    MongoDB是一种流行的NoSQL数据库,以其灵活性和高性能而受到广泛欢迎。它的数据结构与传统的关系型数据库有很大区别,主要体现在以下几个方面: ...了解并熟练掌握这些基本数据结构和特性是理解和使用MongoDB的关键。

    MongoDB命令查询.txt

    根据提供的文件信息,“MongoDB命令查询.txt”,我们可以深入探讨与MongoDB相关的命令查询知识点,特别是聚焦于`db.tablename.find...此外,深入理解这些命令的内部机制也有助于优化查询效率,提升应用程序的整体性能。

    mongodb_preview.pdf

    学习NoSQL的概念是理解MongoDB的一个重要部分。NoSQL数据库有多种类型,如键值存储、文档型存储、列式存储和图形数据库。每种类型的NoSQL数据库都有其特定的使用场景。NoSQL的特点包括灵活的模型、水平扩展性、容错...

Global site tag (gtag.js) - Google Analytics