Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为MongoDB用户集合中的_id发送电子邮件_Mongodb_Uniqueidentifier_Unique Index - Fatal编程技术网

作为MongoDB用户集合中的_id发送电子邮件

作为MongoDB用户集合中的_id发送电子邮件,mongodb,uniqueidentifier,unique-index,Mongodb,Uniqueidentifier,Unique Index,我在MongoDB中有一个用户集合。_id当前是标准的MongoDB生成的ObjectId。我还有一个针对所需“电子邮件”字段的唯一密钥约束。这似乎是浪费 是否有任何理由不应该放弃“email”字段,并将该数据设置为“id”字段?一般来说,没有真正的理由,事实上,如果您确实将“email”用作主键,则可以实现显著的性能提升 其中大多数查找实际上都在该主键上。即使为不同的字段创建一个唯一的键,MongoDB也是经过优化的,因此“查找”\u id字段索引是一件轻而易举的事。它总是在那里 没有用于索引

我在MongoDB中有一个用户集合。_id当前是标准的MongoDB生成的ObjectId。我还有一个针对所需“电子邮件”字段的唯一密钥约束。这似乎是浪费


是否有任何理由不应该放弃“email”字段,并将该数据设置为“id”字段?

一般来说,没有真正的理由,事实上,如果您确实将“email”用作主键,则可以实现显著的性能提升

  • 其中大多数查找实际上都在该主键上。即使为不同的字段创建一个唯一的键,MongoDB也是经过优化的,因此“查找”
    \u id
    字段索引是一件轻而易举的事。它总是在那里

  • 没有用于索引的额外空间。因此,在您查找主键的地方,除了默认索引之外,不需要引入任何内容,这自然会节省磁盘空间,另外还会产生I/O成本

  • 也许唯一真正相关的考虑是切分。只有当您的用例更适合于不同形式的“高/低”容量用户的“带扣”分布时,才会出现这种情况。在这种情况下,将需要某种其他形式的主键来实现这一点

    通常占据
    \u id
    字段的默认
    ObjectId
    类型非常好,因为它保持了自然的插入顺序,甚至可以执行基于范围的常规查询甚至基于时间的查询(在合理范围内)。因此,在需要自然插入顺序的地方,它通常是最佳选择,并且具有高度的碰撞安全性


    但是,如果您通常希望高效地查找主键值,那么作为自然主键的任何内容最好放在集合的
    \u id
    字段中,只要合理地保证它是唯一的。

    我已经阅读了Neil的答案,并且部分同意它(我也对“显著的性能提升”表示怀疑。)在你的问题中,我没有发现一件事是“你打算如何处理这封电子邮件”。你是打算通过它进行搜索,还是只是将它保存在那里?还有一件最重要的事,在前面的回答中没有提到:它是否会被更改

    使用您的系统的人将更改其电子邮件(丢失/不再使用)的情况并不少见。如果您将您的
    \u id
    作为他们的电子邮件,您将无法轻松更改它(您无法在mongo中修改
    \u id
    )。在这种情况下,您需要复制、删除和添加新元素(不会是原子的)


    所以我想把这作为不这样做的一个重要原因。但你需要决定是否允许人们更改电子邮件地址。

    通过添加单独的文档/行/列和实际电子邮件,可以避免这种罕见的使用情况-电子邮件更改,不是吗?你不必复制所有数据-你只需添加实际的电子邮件通知。@NikolayFominyh这种情况并不罕见。我非常怀疑,添加一个包含一些信息的新文档是否比不使用电子邮件作为您的_id字段更简单。@Salvadodali,是的。但您仍然不必复制所有数据。我只是在谈论它。添加别名需要应用程序中的一些逻辑,但不像看起来那样简单。:)