Mongo数据库如何使用电子邮件作为唯一键?
Posted
技术标签:
【中文标题】Mongo数据库如何使用电子邮件作为唯一键?【英文标题】:Mongo database how to use email as unique key? 【发布时间】:2019-02-25 19:06:57 【问题描述】:我创建了一个 mongodb 集合并想在其中将“电子邮件”字段标记为唯一,所以我这样做了(这是一个 Java 代码,尽管语言在这里实际上并不重要):
IndexOptions indexOptions = new IndexOptions();
indexOptions.unique(true);
userCollection.createIndex(Indexes.text("email"), indexOptions);
然后我尝试像这样插入 2 个文档:
Document doc = new Document();
doc.append("email", "johnny@gmail.com");
doc.append("username", "John");
doc.append("lastname", "Doe");
userCollection.insertOne(document);
Document doc = new Document();
doc.append("email", "duck@gmail.com");
doc.append("username", "Donald");
doc.append("lastname", "Duck");
userCollection.insertOne(document);
第一个插入没有任何问题,第二个抛出这个异常:
E11000 重复键错误集合:wagon.w_users 索引: email_text 复制键::“com”,:0.6666666666666666
如果我将 gmail.com 更改为例如gmail.comm,它会抛出这个异常
E11000 重复键错误收集:wagon.w_users 索引:email_text 复制键::“gmail”,:0.6666666666666666
我看到的解决方法是对用户的电子邮件进行哈希处理并创建一个类似“emailhash”的字段,但它对我来说似乎是一个拐杖。也许我在这里错过了一些重要的设置?我们可以使用电子邮件作为唯一键吗?
【问题讨论】:
【参考方案1】:错误来自您的索引创建:您正在使用
创建text indexuserCollection.createIndex(Indexes.text("email"), indexOptions);
所以 mongodb 会围绕 '@' 和 '.' 解析你的字符串,并索引提取的单词。由于您的索引使用“唯一”选项进行了注释,因此您的第二次插入失败。 取而代之的是,创建一个简单的升序索引:
userCollection.createIndex(Indexes.ascending("email"), indexOptions);
【讨论】:
以上是关于Mongo数据库如何使用电子邮件作为唯一键?的主要内容,如果未能解决你的问题,请参考以下文章