MongoDB中“id”和“_id”字段的区别

Posted

技术标签:

【中文标题】MongoDB中“id”和“_id”字段的区别【英文标题】:Difference between "id" and "_id" fields in MongoDB 【发布时间】:2012-03-30 11:15:54 【问题描述】:

使用 MongoDB 文档中的字段 ID 或 _ID 有什么区别吗?

我问这个,因为我通常使用“_id”,但是我在文档中看到了这种排序(id:-1):http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Sortbyidtosortbyinsertiontime

编辑

原来文档是错误的。

【问题讨论】:

【参考方案1】:

我希望这只是文档中的一个错字。 _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 字段的新文档吗? @KevinMeredith 正如指定的here,是的,_id 字段是强制性的。 «在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id 字段作为主键。如果插入的文档省略了_id 字段,MongoDB 驱动程序会自动为_id 字段生成ObjectId【参考方案2】:

_id 字段是 Bson ObjectId 的默认字段,默认情况下,它是索引的。

_id 和 id 不一样。如果需要,您也可以选择添加一个名为 id 的字段,但除非您添加索引,否则它不会成为索引。

这只是文档中的一个错字。

【讨论】:

【参考方案3】:

id 是 mongoid 中 _id 的别名。id 将返回文档的 _id。 https://github.com/mongodb/mongoid/blob/master/lib/mongoid/fields.rb#L47

如果未指定 _id 字段,则会自动生成 ObjectedId。

【讨论】:

【参考方案4】:

我的两分钱:

_id 字段

MongoDB 为每个文档分配一个_id 字段并为其分配主索引。我们也可以通过一些方法应用二级索引。默认情况下,MongoDB_id 类型为 ObjectID 的字段创建值。此值在 BSON 规范中定义,其结构如下:

ObjectID(12 个字节的十六进制字符串)= 日期(4 个字节,一个时间戳值,表示自 Unix 纪元以来的秒数)+ MAC 地址(3 个字节)+ PID(2 个字节)+ 计数器(3 个字节)

【讨论】:

以上是关于MongoDB中“id”和“_id”字段的区别的主要内容,如果未能解决你的问题,请参考以下文章

在 mongodb 中删除所有 ObjectId 类型的文档作为 _id 字段

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

Mongodb:通过“_id”字段搜索嵌入文档

MongoDB - 使用迭代更新集合上的每个“_id”字段

求助啊,tp下,mongodb如何查询后只返回某个字段值

_id字段的Mongodb排序描述非常慢