Mongoose не создает индексы - программирование
Подтвердить что ты не робот

Mongoose не создает индексы

Попытка создания индексов MongoDB. Используя Mongoose ODM и в моем определении схемы ниже, у меня есть поле имени пользователя, установленное на уникальный индекс. Сбор и документ все создаются правильно, это просто индексы, которые не работают. Во всей документации говорится, что команда makeIndex должна запускаться при запуске для создания любых индексов, но ни одна из них не создается. Я использую 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);
});
4b9b3361

Ответ 1

Подключить событие '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, создающий для вас создание индекса.

Ответ 2

Mongoose заявляет, что "если индекс уже существует в БД, он не будет заменен" (кредит).

Например, если вы ранее определили индекс {unique: true} но вы хотите изменить его на {unique: true, sparse: true} то, к сожалению, Mongoose просто не сделает этого, потому что индекс для этого поля уже существует в DB.

В таких ситуациях вы можете удалить существующий индекс, а затем mongoose создаст новый индекс из свежего:

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

Помните, что это тяжелая операция, поэтому будьте осторожны с производственными системами!


В другой ситуации мои индексы не создавались, поэтому я использовал метод сообщения об ошибках, рекомендованный JohnnyHK. Когда я это сделал, я получил следующий ответ:

E11000 duplicate key error collection

Это было связано с тем, что в моем новом индексе было добавлено unique: true ограничение unique: true но в коллекции были существующие документы, которые не были уникальными, поэтому Mongo не смог создать индекс.

В этой ситуации мне нужно либо исправить, либо удалить документы с повторяющимися полями, прежде чем снова попытаться создать индекс.

Ответ 3

Когда я подключил событие индекса к модели, которая не работала, я начал получать сообщение об ошибке на консоли, которое указывало: "Поле 'retryWrites' недопустимо для спецификации индекса". Единственное место в моем приложении, которое ссылалось на retryWrites, было в конце строки подключения. Я удалил это, перезапустил приложение, и перестроение индекса прошло успешно. Я вернул retryWrites на место, перезапустил приложение, и ошибки исчезли. Моя коллекция Users (которая доставляла мне проблемы) была пуста, поэтому, когда я использовал Postman для создания новой записи, я увидел (с сообществом Mongo Compass) новую запись, и теперь появились индексы. Я не знаю, что делает retryWrites - и сегодня это был первый день, когда я его использовал - но, похоже, это было причиной моих проблем.

Ох, а зачем я это использовал? Он был прикреплен к строке подключения, которую я вытащил с сайта Mongo Atlas Cloud. Это выглядело важным. Хм.

Ответ 4

Это может решить вашу проблему

var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
 });
schema.index({ openTrack: 1 });