32

MongoDB インデックスを作成しようとしています。Mongoose ODM を使用し、以下の私のスキーマ定義では、ユーザー名フィールドを一意のインデックスに設定しています。コレクションとドキュメントはすべて適切に作成されますが、機能していないのはインデックスだけです。すべてのドキュメントには、インデックスを作成するために起動時に ensureIndex コマンドを実行する必要があると記載されていますが、何も作成されていません。問題があれば、ホスティングに MongoLab を使用しています。私もコレクションを繰り返し落としました。なにが問題ですか。

var schemaUser = new mongoose.Schema({
    username: {type: String, index: { unique: true }, required: true},
    hash: String,
    created: {type: Date, default: Date.now}
}, { collection:'Users' });

var User = mongoose.model('Users', schemaUser);
var newUser = new Users({username:'wintzer'})
newUser.save(function(err) {
    if (err) console.log(err);
});
4

8 に答える 8

30

モデルにイベントをフックして'index'、インデックスを非同期で作成するときにエラーが発生しているかどうかを確認します。

User.on('index', function(err) {
    if (err) {
        console.error('User index error: %s', err);
    } else {
        console.info('User indexing complete');
    }
});

また、次のように呼び出して、Mongoose のデバッグ ログを有効にします。

mongoose.set('debug', true);

デバッグ ログにはensureIndex、インデックスを作成するために行っている呼び出しが表示されます。

于 2012-09-17T04:13:32.380 に答える
5

Mongooseは、「インデックスがデータベースに既に存在する場合、置き換えられない」と宣言しています(クレジット)。

たとえば、以前にインデックスを定義していて、{unique: true}それを変更したい場合{unique: true, sparse: true}、残念ながら、DB 内のそのフィールドのインデックスが既に存在するため、Mongoose は単純にそれを行いません。

このような状況では、既存のインデックスを削除すると、mongoose が新しいインデックスを作成します。

$ mongo
> use MyDB
> db.myCollection.dropIndexes();
> exit
$ restart node app

これは負荷の高い操作であることに注意してください。本番システムでは注意してください。


別の状況では、インデックスが作成されていなかったので、JohnnyHK が推奨するエラー報告手法を使用しました。私がそれをしたとき、私は次の応答を得ました:

E11000 duplicate key error collection

これは、新しいインデックスが制約を追加してunique: trueいたが、コレクション内に一意ではない既存のドキュメントがあったため、Mongo がインデックスを作成できなかったためです。

この状況では、インデックスの作成を再試行する前に、フィールドが重複しているドキュメントを修正または削除する必要があります。

于 2017-01-24T09:25:52.603 に答える
1

機能していないモデルでインデックス イベントをフックすると、コンソールに「フィールド 'retryWrites' はインデックス指定に対して有効ではありません」というエラーが表示されるようになりました。「retryWrites」を参照するアプリ内の唯一の場所は、接続文字列の最後でした。これを削除してアプリを再起動したところ、インデックスの再構築に成功しました。retryWrites を元に戻し、アプリを再起動すると、エラーはなくなりました。私のユーザー コレクション (問題が発生していた) は空だったので、Postman を使用して新しいレコードを作成すると、(Mongo Compass Community で) 新しいレコードが作成され、インデックスが表示されるようになりました。retryWrites が何をするのかはわかりません - そして今日は私がそれを使用した最初の日でした - しかし、それは私の問題の根底にあるようです.

ああ、なぜ私はそれを使ったのですか?これは、Mongo の Atlas Cloud サイトから取得した接続文字列に追加されました。大事に見えました。うーん。

于 2018-08-14T03:35:06.280 に答える
0

mongoose 接続オプションが指定されていないことを確認します。

autoIndex: false
于 2020-07-02T17:41:52.970 に答える