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

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

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

编辑

原来文档是错误的。

【问题讨论】:

    标签: mongodb mongoid


    【解决方案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 个字节)

        【讨论】:

          猜你喜欢
          • 2012-05-08
          • 2013-03-21
          • 2015-03-06
          • 2012-12-09
          • 2021-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-16
          相关资源
          最近更新 更多