1

URL でインデックスを作成したドキュメントがたくさんあります。このようにpymongoからURLにインデックスを作成しました

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

それでも、URLが重複しているドキュメントを挿入できます。

インデックスが実際に存在するかどうかをmongoシェルから確認したところ、これが表示されました

{
        "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

dropDups=True を使用して一意のインデックスを構築すると、インデックスの重複キーが原因で削除する必要があるドキュメントが 100 万を超える場合、失敗します。いくつかの重複を手動で削除して、合計重複数を 100 万未満にすることができれば、インデックスを正常に構築できるはずです。

複製の数が 100 万未満にならない場合の別のオプションは、セカンダリをオフラインにして、レプリカ セットの一部ではなく、スタンドアロン ノードとして起動することです。次に、 mongodump -d -c を使用して新しいインデックスを必要とするコレクションをダンプし、コレクションを削除してインデックスを作成し、mongorestore を使用してデータを復元できます。次に、そのセカンダリには同じドキュメントがありますが、重複が削除され、インデックスが構築されます。次に、そのセカンダリをレプリカ セットに戻し、別のセカンダリでプロセスを繰り返すことができます。最後に、プライマリを降格して、新しいプライマリが選択されたノードで同じことを行うことができます。

于 2012-06-25T18:16:44.050 に答える