【发布时间】:2012-03-30 11:15:54
【问题描述】:
使用 MongoDB 文档中的字段 ID 或 _ID 有什么区别吗?
我问这个,因为我通常使用“_id”,但是我在文档中看到了这种排序({id:-1}):http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Sortbyidtosortbyinsertiontime
编辑
原来文档是错误的。
【问题讨论】:
使用 MongoDB 文档中的字段 ID 或 _ID 有什么区别吗?
我问这个,因为我通常使用“_id”,但是我在文档中看到了这种排序({id:-1}):http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Sortbyidtosortbyinsertiontime
编辑
原来文档是错误的。
【问题讨论】:
我希望这只是文档中的一个错字。 _id 字段是每个文档的主键。它被称为_id,也可以通过id 访问。尝试使用 id 键可能会导致 illegal ObjectId format 错误。
该部分只是表明自动生成的 ObjectID 以时间戳开头,因此可以自动对文档进行排序。这很酷,因为_id 会自动在每个集合中建立索引。请参阅http://www.mongodb.org/display/DOCS/Object+IDs 了解更多信息。具体在“BSON ObjectID 规范”下。
BSON ObjectID 是一个 12 字节的值,由 4 字节的时间戳(自纪元以来的秒数)、3 字节的机器 ID、2 字节的进程 ID 和 3 字节的计数器组成。请注意,时间戳和计数器字段必须以大端方式存储,这与 BSON 的其余部分不同。
【讨论】:
_id 是强制性的吗?换句话说,我可以创建一个没有_id 字段的新文档吗?
_id 字段是强制性的。 «在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了_id 字段,MongoDB 驱动程序会自动为_id 字段生成ObjectId。
_id 字段是 Bson ObjectId 的默认字段,默认情况下,它是索引的。
_id 和 id 不一样。如果需要,您也可以选择添加一个名为 id 的字段,但除非您添加索引,否则它不会成为索引。
这只是文档中的一个错字。
【讨论】:
id 是 mongoid 中 _id 的别名。id 将返回文档的 _id。 https://github.com/mongodb/mongoid/blob/master/lib/mongoid/fields.rb#L47
如果未指定 _id 字段,则会自动生成 ObjectedId。
【讨论】:
我的两分钱:
MongoDB 为每个文档分配一个_id 字段并为其分配主索引。我们也可以通过一些方法应用二级索引。默认情况下,MongoDB 为 _id 类型为 ObjectID 的字段创建值。此值在 BSON 规范中定义,其结构如下:
ObjectID(12 个字节的十六进制字符串)= 日期(4 个字节,一个时间戳值,表示自 Unix 纪元以来的秒数)+ MAC 地址(3 个字节)+ PID(2 个字节)+ 计数器(3 个字节)
【讨论】: