我创建了一个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”的字段,但对我来说这似乎像拐杖。也许我在这里缺少一些重要的设置?我们可以完全使用电子邮件作为唯一密钥吗?
答案 0 :(得分:2)
错误来自您的索引创建:您正在使用
创建text indexuserCollection.createIndex(Indexes.text("email"), indexOptions);
因此mongodb会在'@'和'。'周围解析字符串,并对提取的单词进行索引。由于索引使用“唯一”选项注释,因此第二次插入失败。 而是创建一个简单的升序索引:
userCollection.createIndex(Indexes.ascending("email"), indexOptions);