如何让用户';mongoDB中唯一的电子邮件是什么?

如何让用户';mongoDB中唯一的电子邮件是什么?,mongodb,indexing,Mongodb,Indexing,我正在收集用户的数据。这将是非常基本的,由用户的电子邮件、用户密码(散列)和字符串数组组成 { email: 'user@example.com', password: 'password hash', arr: [] } 我想确保不能有两个相同的电子邮件插入。 我了解到mongoDB的\u id在默认情况下是唯一的,它使用一些特殊的数据结构来提高性能 如何确保电子邮件保持唯一性,如果可能,我可以利用\u id字段提供的性能优势 编辑:我还想确保email没有null值

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

{
    email: 'user@example.com',
    password: 'password hash',
    arr: []
}
我想确保不能有两个相同的
电子邮件插入。
我了解到mongoDB的
\u id
在默认情况下是唯一的,它使用一些特殊的数据结构来提高性能

如何确保
电子邮件
保持唯一性,如果可能,我可以利用
\u id
字段提供的性能优势

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

使用关键字,或者简单地将_id值设为email

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

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


Mongodb
ensureIndex
已启用,请改用
createIndex


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

当我知道我将使用字符串而不是整数作为电子邮件时,使用email:1是否是一个好主意?正如这里所说的,1用于升序。我尝试使用
\u id
,但有一个问题是,如果没有为
\u id
传递任何参数,它只会生成一个不是我想要的id。@Ishan
电子邮件的索引定义中的“1”表示升序(而“-1”表示降序)。对于这样的单个字段上的索引,顺序实际上并不重要,因为相同的索引可以有效地用于升序或降序搜索。此外,索引并不暗示任何关于字段类型的信息(字符串vs int),也与
\u id
字段没有任何关系。您真正想要确保没有任何空值的唯一索引是:
db.collection.ensureIndex({email:1},{unique:true,sparse:true})
。我尝试了
db.collection.ensureIndex({email:'text'},{unique:true})
但它接受多次出现的
{email:null,password:'passhash',arr:[]}
以及多次出现的
{pass:'passhash',arr:[]}
我想确保没有空值和缺少的字段。我怎样才能做到这一点呢?创建一个唯一的索引并插入一个没有电子邮件的文档,你就能做到这一点。这是一个丑陋的解决方案,但唯一索引(没有稀疏选项)只接受字段的一个值,因此,如果您已经插入了带有{email:null}或{email:“}(这两个值不同)的文档,则所有不带email的插入都将失败,因为它们被视为{email:null}。您还可以在应用程序层控制这种情况。此外,您还应该控制应用程序中的输入。如果你需要一个电子邮件地址,那么在你的应用程序中检查一个并在那里捕获它(如果不是的话)会快得多。不要依赖数据库来为你做这件事。你的应用程序代码不仅应该确保没有空的电子邮件值,还应该对它们进行规范化:修剪空白,将所有内容转换为小写,拒绝无效的地址格式,等等。如果你不转换为小写,索引将考虑“foo”和“foo”作为不同的地址。@LinJuuichi不需要插入一个虚拟文档,而是应该确保电子邮件索引同时为和。这更像是对的注释。