Mongo 数据库如何使用email作为唯一键?

Mongo database how to use email as unique key?

我创建了一个 mongodb 集合并想在其中将 "email" 字段标记为唯一,所以我这样做了(这是一个 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 duplicate key error collection: wagon.w_users index: email_text dup key: { : "com", : 0.6666666666666666 }

如果我将 gmail.com 更改为例如gmail.comm,它抛出这个异常

E11000 duplicate key error collection: wagon.w_users index: email_text dup key: { : "gmail", : 0.6666666666666666 }

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

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

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

因此 mongodb 围绕“@”和“.”解析您的字符串,并对提取的词建立索引。由于您的索引使用 'unique' 选项进行注释,因此您的第二次插入失败。 相反,创建一个简单的升序索引:

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