Mongo数据库如何使用电子邮件作为唯一密钥?

时间:2018-09-21 11:17:30

标签: mongodb unique-key

我创建了一个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 dup键:{:“ com”,:0.6666666666666666}

如果我将gmail.com更改为例如gmail.comm,它将引发此异常

  

E11000重复键错误集合:wagon.w_users索引:email_text   dup键:{:“ gmail”,:0.6666666666666666}

我看到的解决方法是对用户的电子邮件进行哈希处理,并创建一个类似于“ emailhash”的字段,但对我来说这似乎像拐杖。也许我在这里缺少一些重要的设置?我们可以完全使用电子邮件作为唯一密钥吗?

1 个答案:

答案 0 :(得分:2)

错误来自您的索引创建:您正在使用

创建text index
userCollection.createIndex(Indexes.text("email"), indexOptions);

因此mongodb会在'@'和'。'周围解析字符串,并对提取的单词进行索引。由于索引使用“唯一”选项注释,因此第二次插入失败。 而是创建一个简单的升序索引:

userCollection.createIndex(Indexes.ascending("email"), indexOptions);