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)
如果有人知道它为什么有效..请赐教:)
我有一个包含用户名、密码和电子邮件的集合,所以我在 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
字段上创建索引。查看 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)
如果有人知道它为什么有效..请赐教:)