翻译自:https://stackoverflow.com/questions/5535610
84024 次
122

MongoDBにインデックスに基づいて重複する値を検出させようとしています。これはMongoDBで可能だと思いますが、Mongooseラッパーを使用すると、問題が発生しているように見えます。したがって、このようなものの場合:

User = new Schema ({
  email: {type: String, index: {unique: true, dropDups: true}}
})

同じメールで2人のユーザーを救うことができます。くそー。

同じ問題がここで表現されています:https ://github.com/LearnBoost/mongoose/issues/56 、しかしそのスレッドは古く、どこにもつながりません。

今のところ、ユーザーを見つけるために手動でdbを呼び出しています。「電子メール」は索引付けされているため、この呼び出しは高額ではありません。しかし、それでもネイティブに処理できるようにするとよいでしょう。

誰かがこれに対する解決策を持っていますか?

4

28 に答える 28

116

おっとっと!mongoを再起動するだけです。

于 2011-04-04T07:22:07.803 に答える
43

おっとっと!mongoを再起動するだけです。

また、次のようにインデックスを再作成します。

mongo <db-name>
> db.<collection-name>.reIndex()

テストでは、重要なデータがないため、次のこともできます。

mongo <db-name>
> db.dropDatabase()
于 2012-10-29T12:37:37.457 に答える
36

同じ問題に遭遇しました。データベースにユーザーを追加した後、emailフィールドの一意の制約を追加UserSchemaしましたが、ユーザーを重複したメールで保存することができました。次のようにしてこれを解決しました。

1) ユーザー コレクションからすべてのドキュメントを削除します。

2) mongo シェルから、次のコマンドを実行します。 db.users.createIndex({email: 1}, {unique: true})

ステップ 1 に関しては、Mongo のドキュメントから次のことに注意してください。

インデックスの一意の制約に違反するデータがコレクションに既に含まれている場合、MongoDB は指定されたインデックス フィールドに一意のインデックスを作成できません。

https://docs.mongodb.com/manual/core/index-unique/

于 2016-10-13T16:56:58.453 に答える
11

OK、フィールドにインデックスを追加し、一意のプロパティを設定することで、mongoshell からこれを解決できました。

db.<collectionName>.ensureIndex({fieldName: 1}, {unique: true});

シェルは次のように応答する必要があります。

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

mongoshell からすばやくテストするには、次のようにします。

var doc = {fieldName: 'abc'};
db.<collectionName>.insert(doc)

与えるべき: WriteResult({ "nInserted" : 1 })

しかし、もう一度繰り返すと:

db.<collectionName>.insert(doc)

あげる:

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 11000,
        "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: fuelConsumption.users.$email_1  dup key: { : \"martyna@martycud.com\" }"
    }
})
于 2014-12-10T21:42:21.080 に答える
1

プラグインの再起動と使用は私にとってはうまくいきませんでした。さらに、mongo が単独で実行できると確信しているものにプラグインを使用するのは少しやり過ぎでした。

これが修正です。接続機能で、これをオプションオブジェクトに追加します(2番目のパラメーター)

const options = {
  autoIndex: true, //this is the code I added that solved it all
}
mongoose.connect(process.env.MONGO_URI, options);
于 2021-07-26T08:26:04.643 に答える
1

この問題は、インデックスを削除することでも解決できます。

usersコレクションとフィールドから一意のインデックスを削除すると仮定して、次のようusernameに入力します。

db.users.dropIndex('username_1');

于 2015-12-17T20:00:46.370 に答える
0

MongoDB がサービスとして動作している場合 (ターミナル経由で mongod.exe ファイルを起動せずにデータベースに接続する必要がない場合は、これを見つける簡単な方法です)、変更を行った後、サービスを再起動する必要がある場合があります。またはデータベースを完全に削除します。

一部のユーザーにとっては、単一のコレクションをドロップするだけで機能したため、非常に奇妙です。それらのいくつかは、データベースを削除する必要がありました。しかし、それらは私にとってはうまくいきませんでした。データベースを削除してから、MongoDB サーバー サービスを再起動しました。

サービスを再起動するには、Windows 検索バーでサービスを検索してから MongoDB サービスを見つけ、ダブルクリックして開き、サービスを停止してから再度開始します。

他の方法がうまくいかなかった場合は、これでうまくいくと思います。

于 2020-08-20T02:08:21.810 に答える