Mongo _id 作为字符串索引键。是好是坏?

Ber*_*rim 5 key mongodb

我正在开发一个 API,获取资源的唯一方法是提供像 my_resource 这样的字符串键。

覆盖 _id 是一个好习惯(这使得一些 mongodb 驱动程序更易于使用)还是不好?从长远来看呢?

谢谢

Log*_*ton 2

根据我的经验,覆盖 _id 并不是最好的主意。仅当您的数据具有自然唯一且可轻松用于替换 _id 的值字段时,才应覆盖 _id。但是重写 _id 只是为了用人为的值替换它并没有多大意义。

我建议不要这样做,原因如下:

首先,这样做需要额外的实现来处理当您的“独特”值发生冲突时不可避免的情况。这几乎肯定会出现在任何规模很大的数据库中。这可能是一个问题,因为 MongoDB 在覆盖值和通常处理冲突方面可能是无情的。换句话说,除非您从一开始就非常仔细地设计数据库结构,否则您几乎肯定会覆盖值或遇到未处理的异常。

其次,同样重要的是:ObjectID 自然具有优化的插入公式,可以很好地创建索引。插入新文档时,创建的 ObjectID 在数学上尽可能接近先前的 ObjectID,从而优化内存和索引功能。自己重新创建这个非常方便的物品可能会更麻烦,而不值得。

最后,尽管这并不那么重要,但覆盖 _id 会使使用标准 ObjectID 方法变得更加困难。

现在,我至少可以想到一个可以覆盖 ObjectID 的积极因素:

如果存在 _id 肯定不会在您的数据库中使用的情况,那么它可以为您节省大量内存,因为索引在 MongoDB 中非常昂贵。

  • ObjectID 绝对与最后生成的 ObjectID “数学上不接近”。考虑到主要组件是时间戳,这可能看起来是这种情况,但一般 [12 字节 ObjectID 的公式](http://docs.mongodb.org/manual/reference/object-id/) 旨在允许分布式客户端独立生成唯一标识符。我不明白“处理冲突”的要点,因为这对于您想要生成自己的唯一 ID 的任何数据库来说都很常见。如果您选择/生成的唯一 ID 已存在,则必须处理异常并生成一个新 ID。 (2认同)