1

我有很多由 url 索引的文档。我像这样在 pymongo 的 url 上创建了一个索引

coll.create_index('url',unique=True,background=True)      //coll is the name of the collection

但我仍然可以插入具有重复 url 的文档。

我从 mongo shell 检查了索引是否确实存在,它显示了这个

{
        "v" : 1,
        "key" : {
            "url" : 1
        },
        "ns" : "dbname.coll",
        "name" : "url_1",
        "background" : true
},

设置是否background=True也意味着url插入文档时不会检查的唯一性?我完全困惑为什么唯一性不起作用?

4

2 回答 2

3

首先,db.collection.getIndexSpecs()应该报告"unique" : true

在插入方面,我的猜测是,您正在进行不安全的写入。违反唯一索引约束的不安全save实际上返回一个新ObjectId文档,但数据库中的文档没有更改,也没有保存新文档。

如果您pymongo.errors.DuplicateKeyError尝试使用safe=True.

于 2012-10-16T00:24:30.110 回答
0

如果遇到超过 100 万个由于索引键重复而需要删除的文档,则使用 dropDups=True 构建唯一索引将失败。如果您可以手动删除一些重复项,使总重复数低于 100 万,那么您应该可以成功构建索引。

如果您无法获得低于 100 万的副本数量,另一种选择是使辅助节点脱机并将其作为独立节点启动,而不是副本集的一部分。然后您可以使用 mongodump -d -c 转储需要新索引的集合,然后删除该集合,创建索引,然后使用 mongorestore 恢复数据。然后该次要文件将具有相同的文档,但删除了重复项并建立了索引。然后,您可以将该辅助节点放回副本集中并在另一个辅助节点上重复该过程。最后,您可以让您的主节点下台并在该节点上执行相同的操作,一个新的主节点已被选出。

于 2012-06-25T18:16:44.050 回答