Python mongodb 电子邮件作为唯一键时出错

Python mongodb error with email as unique key

我有一个包含用户名、密码和电子邮件的集合,所以我在 python 中使用 pymongo 创建了一个唯一索引:

import pymongo 

info.create_index( [("Username", pymongo.TEXT), ("Email", pymongo.TEXT)],unique=True)

第一次插入:

mydict = { "Username": "userA","Email": "emailA@example.com"}
mycol.insert_one(mydict)

第二次插入:

mydict = { "Username": "userB","Email": "emailB@example.com"}
mycol.insert_one(mydict)

但是当我用第二个插入测试它时它抛出这个异常:

pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: users.info index: Username_text_Email_text dup key: { : "com", : 0.6666666666666666 }

我是不是遗漏了什么?

问题出在您在 email 字段上创建索引。查看 SO Post 后,您需要使用 pymongo.ASCENDING 选项而不是 pymongo.TEXT.

创建 email 索引

所以,它会是这样的。

info.create_index( [("Username", pymongo.TEXT), ("Email", pymongo.ASCENDING)],unique=True)

此外,在重新使用 dict 对象之前 clear 总是更好,因为 pymongo 在插入文档之前将 _id 字段添加到文档中,这可能会导致不必要的冲突问题.

mydict = { "Username": "userA","Email": "emailA@example.com"}
mycol.insert_one(mydict)
<pymongo.results.InsertOneResult object at 0x1086c7bc8>
mydict
{'Username': 'userA', 'Email': 'emailA@example.com', '_id': ObjectId('5d5dfd90337d3d79a9bf1da8')}
mydict.clear()
mydict = { "Username": "userB","Email": "emailB@example.com"}
mycol.insert_one(mydict)
<pymongo.results.InsertOneResult object at 0x1086c7e48>

更新-

当您创建一个包含两个字段(在您的问题中给出)并要求唯一性的复合索引时,您是在要求两个字段数据的组合应该始终是唯一的(而不是单个字段数据)。

因此,根据 mongo,下面的插入是有效的且不重复,因为组合是唯一的。

{ "Username": "userA","Email": "emailA@example.com"}
{ "Username": "userB","Email": "emailA@example.com"}

如果您的要求是 UserName 不应重复多次并且 Email 字段不应重复多次,那么单独的单独索引就可以了(在您的答案中给出)。

首先,让您的要求正确,然后相应地创建索引。此外,您的答案中的索引不是使用 pymongo.TEXT 选项创建的,这就是为什么您可以使用不同的电子邮件进行 2 次插入,但是如果您使用 TEXT 选项创建电子邮件索引,那么您将无法插入 emailA 和 emailB。

这里是 SO POST,它将对 TEXT 索引与普通索引之间的区别给出一些想法。

好的,我解决了(不知道为什么会这样……但确实有效):

我更改了索引创建: 而不是:

import pymongo 

info.create_index( [("Username", pymongo.TEXT), ("Email", pymongo.TEXT)],unique=True)

我做到了:

import pymongo

mycol.create_index( "Username",unique=True)
mycol.create_index( "Email",unique=True)

如果有人知道它为什么有效..请赐教:)