Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongoDB唯一索引不工作_Mongodb_Pymongo_Unique Index - Fatal编程技术网

mongoDB唯一索引不工作

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的唯一性?我完全不明白为什么唯一性不起作

我有很多文档,我通过url索引了它们。我在pymongo的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
},