作为MongoDB用户集合中的_id发送电子邮件
我在MongoDB中有一个用户集合。_id当前是标准的MongoDB生成的ObjectId。我还有一个针对所需“电子邮件”字段的唯一密钥约束。这似乎是浪费作为MongoDB用户集合中的_id发送电子邮件,mongodb,uniqueidentifier,unique-index,Mongodb,Uniqueidentifier,Unique Index,我在MongoDB中有一个用户集合。_id当前是标准的MongoDB生成的ObjectId。我还有一个针对所需“电子邮件”字段的唯一密钥约束。这似乎是浪费 是否有任何理由不应该放弃“email”字段,并将该数据设置为“id”字段?一般来说,没有真正的理由,事实上,如果您确实将“email”用作主键,则可以实现显著的性能提升 其中大多数查找实际上都在该主键上。即使为不同的字段创建一个唯一的键,MongoDB也是经过优化的,因此“查找”\u id字段索引是一件轻而易举的事。它总是在那里 没有用于索引
是否有任何理由不应该放弃“email”字段,并将该数据设置为“id”字段?一般来说,没有真正的理由,事实上,如果您确实将“email”用作主键,则可以实现显著的性能提升
\u id
字段索引是一件轻而易举的事。它总是在那里\u id
字段的默认ObjectId
类型非常好,因为它保持了自然的插入顺序,甚至可以执行基于范围的常规查询甚至基于时间的查询(在合理范围内)。因此,在需要自然插入顺序的地方,它通常是最佳选择,并且具有高度的碰撞安全性
但是,如果您通常希望高效地查找主键值,那么作为自然主键的任何内容最好放在集合的
\u id
字段中,只要合理地保证它是唯一的。我已经阅读了Neil的答案,并且部分同意它(我也对“显著的性能提升”表示怀疑。)在你的问题中,我没有发现一件事是“你打算如何处理这封电子邮件”。你是打算通过它进行搜索,还是只是将它保存在那里?还有一件最重要的事,在前面的回答中没有提到:它是否会被更改
使用您的系统的人将更改其电子邮件(丢失/不再使用)的情况并不少见。如果您将您的\u id
作为他们的电子邮件,您将无法轻松更改它(您无法在mongo中修改\u id
)。在这种情况下,您需要复制、删除和添加新元素(不会是原子的)
所以我想把这作为不这样做的一个重要原因。但你需要决定是否允许人们更改电子邮件地址。通过添加单独的文档/行/列和实际电子邮件,可以避免这种罕见的使用情况-电子邮件更改,不是吗?你不必复制所有数据-你只需添加实际的电子邮件通知。@NikolayFominyh这种情况并不罕见。我非常怀疑,添加一个包含一些信息的新文档是否比不使用电子邮件作为您的_id字段更简单。@Salvadodali,是的。但您仍然不必复制所有数据。我只是在谈论它。添加别名需要应用程序中的一些逻辑,但不像看起来那样简单。:)