首页 文章

在MongoDB用户集合中以_id形式发送电子邮件

提问于
浏览
2

我在MongoDB中有一个用户集合 . _id目前是标准的MongoDB生成的ObjectId . 我对所需的“电子邮件”字段也有一个唯一的键约束 . 这似乎是一种浪费 .

我有什么理由不放弃“电子邮件”字段并将该数据作为_id字段吗?

2 回答

  • 9

    我已经阅读了Neil的回答,并且我部分同意它(我也非常怀疑'显着的性能提升') . 我在你的问题中找不到的一件事是“你打算用这封电子邮件做什么” . 你打算用它搜索还是只是保存在那里?而在之前的答案中没有解决的最重要的事情之一是它会被改变吗?

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

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

  • 4

    一般来说,没有真正的理由,事实上,如果您确实使用“电子邮件”作为主键,那么可以实现显着的性能提升 .

    • 大多数查找实际上都在该主键上 . 即使为不同的字段创建唯一键,MongoDB也经过优化,因此"finding" _id 字段索引是明智之举 . 它总是在那里 .

    • 没有用于索引的额外空间 . 因此,再次查找主键时,除了默认索引之外,不需要引入任何其他内容,除了可能产生的I / O成本之外,还可以自然节省磁盘空间 .

    也许唯一真正相关的考虑因素是分片 . 只有当您的用例更适合某些不同形式的“高/低”批量用户的“分段”分发时,情况才会出现 . 在这种情况下,为了促进这一点,将需要一些其他形式的主键 .

    通常占用 _id 字段的默认 ObjectId 类型很棒,因为它保持自然的插入顺序,甚至可以执行诸如基于通用范围的查询或甚至基于时间的查询(在合理范围内)之类的事情 . 因此,在需要自然插入订单的情况下,它通常是最佳选择并且具有高度碰撞安全性 .

    但是,如果您通常希望有效查找主键值,那么任何充当自然主键的内容都理想地放在集合的 _id 字段中,只要它被合理地保证是唯一的 .

相关问题