Mongodb Mongo_id作为字符串索引键。好还是坏?

Mongodb Mongo_id作为字符串索引键。好还是坏?,mongodb,key,Mongodb,Key,我正在开发一个API,获取资源的唯一方法是提供一个字符串键,比如我的资源 重写_id(这使一些mongodb驱动程序更易于使用)是一种好做法,还是一种坏做法?从长远来看呢 谢谢你以我的经验,覆盖id并不是最好的主意。只有当您的数据具有一个自然唯一且可轻松用于替换_id的值字段时,才应覆盖_id。但是,仅仅用一个人为的值替换id并没有多大意义 出于以下几个原因,我建议不要这样做: 首先,这样做需要额外的实现来处理不可避免的“独特”值冲突的情况。这几乎肯定会出现在任何规模的数据库中。这可能是一个问题

我正在开发一个API,获取资源的唯一方法是提供一个字符串键,比如我的资源

重写_id(这使一些mongodb驱动程序更易于使用)是一种好做法,还是一种坏做法?从长远来看呢


谢谢你

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

出于以下几个原因,我建议不要这样做:

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

第二,同样重要的是:objectid自然有一个优化的插入公式,可以很好地创建索引。插入新文档时,该ObjectID将在数学上尽可能接近前一个ObjectID,从而优化内存和索引功能。这可能是比它的价值更麻烦,重新创建这个非常方便的项目自己

最后,尽管这没有那么重要,但覆盖id会使使用

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


如果有一个实例_id肯定永远不会在数据库中使用,那么它可以为您节省大量内存,因为索引在MongoDB中非常昂贵。

如果有比ObjectID更自然的主键可供使用(例如,字符串值),请随意使用它

ObjectID的目的是允许分布式客户机根据特定的应用程序快速、独立地生成唯一标识符。12字节ObjectID公式包括4字节的时间戳、3字节的机器标识符、2字节的进程ID和以随机值开头的3字节计数器


如果您生成/分配自己的唯一标识符(即使用字符串),潜在的性能考虑是,在您尝试使用该
\u id
插入文档之前,您不会知道该名称是否唯一。在这种情况下,您需要通过使用新的
\u id

重新尝试插入来处理重复键异常。ObjectID在数学上肯定与最后生成的ObjectID“不接近”。考虑到主要组件是一个时间戳,这种情况可能会出现,但一般的做法是允许分布式客户端独立地生成唯一标识符。我不理解“处理冲突”这一点,因为这对于任何想要生成自己的唯一ID的DB来说都是常见的。如果你选择/生成的唯一ID已经存在,你必须处理异常并生成一个新的。啊,好吧,请原谅我的误解!考虑到斯坦尼在这里的特殊专长,我当然很乐意听从他。我从MongoDB上的一个解决此问题的网站上获得了有关处理重复密钥问题的信息,并表示希望覆盖_id的人必须“愿意处理重复密钥异常”。不过,我不想传播错误信息,所以谢谢!你能澄清一下这里的问题吗?我现在做的只是创建另一个索引,比如:db.topics.ensureIndex({name:“hashed”},{unique:true}),现在我有两个索引。不知道这比覆盖id好还是坏。我唯一关心的是切分。只使用字符串id会破坏这一点吗?我读到3字节的机器标识符在查找分片数据库时很有用,所以我暂时保留了_id。我计划使用电子邮件地址作为对象id(电子邮件地址在我的应用程序中是用户名,因此它们是唯一的,而且应该是唯一的)。对这个特殊的解决方案有什么建议吗?这有什么陷阱吗?