【问题标题】:Generation of _id vs. ObjectId autogeneration in MongoDB生成_id 到。 MongoDB 中的 ObjectId 自动生成
【发布时间】:2013-08-18 12:21:01
【问题描述】:

我正在开发一个创建永久链接的应用程序。我不确定如何将文档保存在 MondoDB 中。两种策略:

  1. ObjectId 自动生成

    MongoDB 自动生成 _id。我需要在permalink 字段上创建索引,因为我通过永久链接获取信息。我还可以使用getTimestamp() 方法访问ObjectId 的创建时间,因此datetime 字段似乎是多余的,但如果我删除此字段,我需要两次调用MongoDB,一个来获取信息,另一个来获取信息时间戳。

    {
      "_id": ObjectId("5210a64f846cb004b5000001"),
      "permalink": "ca8W7mc0ZUx43bxTuSGN",
      "data": "a lot of stuff",
      "datetime": ISODate("2013-08-18T11:47:43.460+-100")
    }
    
  2. 生成_id

    我使用永久链接生成_id

    {
      "_id": "ca8W7mc0ZUx43bxTuSGN",
      "data": "a lot of stuff",
      "datetime": ISODate("2013-08-18T11:47:43.460+-100")
    }
    

我看不出使用 ObjectIds 有什么好处。我错过了什么吗?

【问题讨论】:

  • 我没有看到真正的问题?自动生成的 _id 包含一些不错的信息,例如时间戳,因此您无需像当前那样将日期时间存储在单独的字段中。顺便说一下,_id 是自动生成的,它保证了唯一性

标签: mongodb database-design permalinks identifier


【解决方案1】:

ObjectIds 适用于集合中的每个文档都没有唯一键的情况。它们是独一无二的,因此您不必担心冲突,并且它们在大型部署中相当好地分片而无需过多担心(它们各有利弊,阅读更多 here)。

ObjectId 还包含生成ObjectId 的客户端的时间戳(除非数据库服务器配置为生成所有密钥)。正如您所注意到的那样,您可以使用时间戳来执行一些日期操作。但是,如果您计划使用聚合框架,您会发现目前无法在任何日期操作中使用ObjectId (issue)。如果您想使用 AF,您将需要包含日期的第二个字段,不幸的是,它与 ObjectId 的内部值双重存储。

如果您可以确定您生成的_id 是独一无二的,那么没有太多理由在您的数据结构中使用ObjectId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多