【问题标题】:How to make user's email unique in mongoDB?如何使用户的电子邮件在 mongoDB 中唯一?
【发布时间】:2015-04-15 08:27:00
【问题描述】:

我正在收集用户数据。这将是非常基本的,由用户的电子邮件、用户的密码(散列)和字符串数组组成。

{
    email: 'user@example.com',
    password: 'password hash',
    arr: []
}

我想确保不能有两个插入具有相同的email。 我读到mongoDB的_id默认是唯一的,它使用了一些特殊的数据结构来提高性能。

如何确保email 保持唯一性,如果可能,我可以利用_id 字段提供的性能优势吗?

编辑:我还想确保email 没有null 值,并且没有不包含email 字段的文档。

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

    使用unique关键字,或者干脆将_id值设为email。

    db.collection.createIndex( { email: 1 }, { unique: true } )
    

    【讨论】:

    • 当我知道我将使用字符串而不是整数作为电子邮件时,使用 email: 1 是个好主意吗?正如这里所说的 docs.mongodb.org/manual/reference/method/… 1 用于升序。我尝试使用_id,但存在一个问题,如果没有为_id 传递参数,它只会生成一个我不想要的id。
    • @Ishan email 的索引定义中的“1”表示升序(而“-1”表示降序)。对于像这样的单个字段上的索引,顺序并不重要,因为相同的索引可以有效地用于升序或降序搜索。此外,该索引不暗示有关字段类型(字符串与整数)的任何内容,并且与 _id 字段没有任何关系。您真正想要确保没有任何空值的唯一索引是:db.collection.ensureIndex( { email: 1 }, { unique: true, sparse: true } )
    【解决方案2】:

    您可以通过为您的电子邮件字段创建唯一索引来做到这一点。

    http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

    【讨论】:

    • 我试过db.collection.ensureIndex({email: 'text'}, {unique: true}); 但它接受{email: null, password: 'passhash', arr: []} 的多次出现以及{pass: 'passhash', arr: []} 的多次出现我想确保没有空值以及缺少的字段。我怎样才能做到这一点?
    • 创建一个唯一索引并在没有电子邮件的情况下插入一个文档,您将实现这一目标。这是一个丑陋的解决方案,但唯一索引(没有稀疏选项)只接受一个字段的一个值,所以如果你已经插入了一个带有 {email: null} 或 {email: ""} (它们是不同的值)的文档,所有插入都没有email 将失败,因为它们被视为 {email: null}。您也可以在应用层控制这种情况。
    • 另外,你真的应该在你的应用程序中控制输入。如果您需要一个电子邮件地址,那么在您的应用程序中检查一个电子邮件地址并在那里找到它会快得多。不要依赖数据库为你做这件事。
    • 您的应用程序代码不仅应该确保没有空电子邮件值,还应该对其进行规范化:修剪空格、将所有内容转换为小写、拒绝无效的地址格式等。如果您不转换为小写,索引会将“foo”和“Foo”视为不同的地址。
    • @LinJuuichi 与其插入一个虚拟文档,不如确保电子邮件索引同时为uniquesparse 更有意义。
    【解决方案3】:

    Mongodb ensureIndex 已经是deprecated,改用createIndex

    db.collection.createIndex( { email: 1 }, { unique: true } )

    【讨论】:

    • 这看起来更像是对the accepted answer的评论。
    • 这个答案是有道理的,因为没有人提到 ensureIndex 已被弃用。评论中的每个人都建议使用 ensureIndex ...谢谢 Mikko。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多