2013-04-07 56 views
2

在MongoDb中,ObjectId是一个12字节的BSON类型。Objectid的更改大小

有什么办法可以减小objectID的大小吗?

+0

也许我不明白你的问题,但减少它如何?它被设计成一种简单而有效的方式来获得在多机器设置中定义的唯一标识符:一个4字节的值,表示自Unix纪元以来的秒数,一个3字节的机器标识符,一个2字节的进程ID,以及一个3字节的计数器,从一个随机值开始。 – WiredPrairie 2013-04-07 18:22:13

+1

这是不可能的,但你可以使用一个整数作为_id而不是ObjectId来只使用4个字节。 – assylias 2013-04-07 19:07:53

+0

你使用什么语言,驱动程序和映射框架(如果有的话)? – Sim 2013-04-08 02:23:25

回答

2

不是。这是一个BSON数据类型。这就像是要求一个32位整数自己缩小一样。每个对象都必须有_id属性,但您并不限于ObjectId

+1

增加:MongoDB集合中的每个顶级*文档*都必须有一个_id作为主键。当此属性未在代码中设置时,它由驱动程序或数据库自动分配。 – WiredPrairie 2013-04-07 18:25:34

0

MongoDB集合中的每个文档都需要有一个唯一的_id,但该值不一定是ObjectId。因此,如果你正在寻找减少您的收藏文件的大小,你有两个选择:

  1. 选择文档的独特性能之一,并把它作为_id领域。例如,如果您有一个帐户集合,其中外部提供的帐户ID是您数据模型的一部分,您可以将该帐户ID存储在_id字段中。

  2. 自己管理集合的主键。许多驱动程序支持自定义primary key factories。正如@assylias所建议的那样,使用int可以节省空间,但是,如果您可以使用模型中的某个字段作为_id,您将使用更多的空间。

顺便说一句,_id字段的值可以是复合的:您可以使用Object/hash/map/dictionary。例如,参见this SO question

如果您在Mongo上使用某种类型的对象/模型框架,我会小心使用(1)。有些框架很难与开发人员重写id代。例如,我在Ruby中对Mongoid有不好的体验。在这种情况下,(2)可能是更安全的方式,因为发生在驱动程序层。