mongoDB唯一索引不工作
我有很多文档,我通过url索引了它们。我在pymongo的url上创建了一个索引,如下所示mongoDB唯一索引不工作,mongodb,pymongo,unique-index,Mongodb,Pymongo,Unique Index,我有很多文档,我通过url索引了它们。我在pymongo的url上创建了一个索引,如下所示 coll.create_index('url',unique=True,background=True) //coll is the name of the collection 但我仍然能够插入具有重复URL的文档 我从mongo shell中检查了索引是否确实存在,并显示 这个 设置background=True是否意味着插入文档时不会立即检查url的唯一性?我完全不明白为什么唯一性不起作
coll.create_index('url',unique=True,background=True) //coll is the name of the collection
但我仍然能够插入具有重复URL的文档
我从mongo shell中检查了索引是否确实存在,并显示
这个
设置
background=True
是否意味着插入文档时不会立即检查url
的唯一性?我完全不明白为什么唯一性不起作用?如果遇到超过100万个文档需要删除,那么使用dropDups=True构建唯一索引将失败,因为索引具有重复的键。如果您可以手动删除一些重复项,使总重复数低于100万,那么您应该能够成功构建索引
如果无法获得100万以下的副本数,另一种选择是使辅助服务器脱机,并将其作为独立节点启动,而不是作为副本集的一部分。然后,您可以使用mongodump-d-c转储需要新索引的集合,然后删除集合,创建索引,然后使用mongorestore恢复数据。然后,该辅助文档将具有相同的文档,但删除了重复文档并构建了索引。然后,您可以将该次副本放回副本集中,并在另一次副本上重复该过程。最后,当一个新的主节点被选中时,您可以退出主节点并在该节点上执行相同的操作。首先,
db.collection.getIndexSpecs()
应该报告“unique”:true
就插入而言,我猜想,您正在进行不安全的写入。违反唯一索引约束的不安全save
实际上会返回一个新的ObjectId
,但不会更改数据库中的文档,也不会保存新文档
你会得到一个
pymongo.errors.DuplicateKeyError
如果你用safe=True
尝试这个操作,我想索引仍在构建过程中。@SergioTulentsev所以当getIndexes
的输出中没有背景:True
时,这意味着索引创建完成了吗?我这么说,对为了更加确定,请查看db.currentOp()
。如果索引仍在生成,它应该反映在那里。db.currentOp()
显示键inprog
的空列表。那么,索引定义是否仍有背景
标志?我确实遵循了第二个选项。但是当我创建唯一索引时,pymongo应该抛出一些异常。但事实并非如此,我认为索引是创建的,文档是唯一的,直到我手动发现一些文档不是唯一的
{
"v" : 1,
"key" : {
"url" : 1
},
"ns" : "dbname.coll",
"name" : "url_1",
"background" : true
},