我有很多由网址索引的文档。我像pymongo一样在url上创建了一个索引
coll.create_index('url',unique=True,background=True) //coll is the name of the collection
但我仍然可以插入包含重复网址的文档。
我从mongo shell检查了索引是否确实存在并显示 此
{
"v" : 1,
"key" : {
"url" : 1
},
"ns" : "dbname.coll",
"name" : "url_1",
"background" : true
},
设置background=True
是否也意味着在插入文档时不会检查url
的唯一性?我完全混淆为什么独特性不起作用?
答案 0 :(得分:3)
首先,db.collection.getIndexSpecs()
应报告"unique" : true
。
在插入方面,我的猜测是,你正在进行不安全的写入。违反唯一索引约束的不安全save
实际上会返回一个新的ObjectId
,但数据库中的文档不会更改,也不会保存新文档。
如果您使用pymongo.errors.DuplicateKeyError
尝试操作,则会获得safe=True
。
答案 1 :(得分:0)
使用dropDups = True构建唯一索引如果遇到因索引重复键而需要删除的文档超过100万则将失败。如果您可以手动删除一些重复项以使总重复次数低于1百万,那么您应该能够成功构建索引。
如果您无法获得低于100万的重复数量,则另一个选项是将辅助脱机并将其作为独立节点启动,而不是副本集的一部分。然后,您可以使用mongodump -d -c转储需要新索引的集合,然后删除集合,创建索引,然后使用mongorestore恢复数据。然后该辅助文件将具有相同的文档,但删除了重复项并构建了索引。然后,您可以将该辅助节点放回副本集中,并在另一个辅助节点上重复该过程。最后,您可以逐步降低主要性,并在该节点上执行相同的操作,然后选择一个新主节点。