3

我正在开发一个创建永久链接的应用程序。我不确定如何将文档保存在 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 有什么好处。我错过了什么吗?

4

1 回答 1

6

ObjectIds 适用于集合中的每个文档都没有唯一键的情况。它们是独一无二的,因此您不必担心冲突,并且它们在大型部署中可以很好地分片而无需过多担心(它们各有优缺点,请在此处阅读更多信息)。

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

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

于 2013-08-18T16:26:31.090 回答