Подтвердить что ты не робот

Формат изменения схемы Mongoose

Мы быстро разрабатываем приложение, использующее Mongoose, и наша схема часто меняется. Я не могу понять, как правильно обновить схему существующих документов, не выдувая их и полностью воссоздавая их с нуля.

Я столкнулся с http://mongoosejs.com/docs/api.html#schema_Schema-add, который выглядит правильно. Там практически нет документации о том, как на самом деле реализовать это, что делает его очень трудным для тех, кто новичок в MongoDB.

Я просто хочу добавить новое поле с именем enabled. Мое определение схемы:

var sweepstakesSchema = new Schema({
    client_id: {
        type: Schema.Types.ObjectId,
        ref: 'Client',
        index: true
    },
    name: {
        type: String,
        default: 'Sweepstakes',
    },
    design: {
        images: {
            type: [],
            default: []
        },
        elements: {
            type: [],
            default: []
        }
    },
    enabled: {
        type: Boolean,
        default: false
    },
    schedule: {
        start: {
            type: Date, 
            default: Date.now
        },
        end: {
            type: Date,
            default: Date.now
        }
    },
    submissions: {
        type: Number,
        default: 0
    }
});
4b9b3361

Ответ 1

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

Что касается самой схемы, вы просто обновляете определение Schema, как вы показали, но изменения, такие как новые поля со значениями default, будут влиять только на новые документы в будущем.

Ответ 2

  db.sweepstakesModel.find( { enabled : { $exists : false } } ).forEach(
   function (doc) {
       doc.enabled = false;
       db.sweepstakesModel.save(doc);
    }
  )

учитывая ваше имя модели мангуста как "sweepstakesModel", Этот код добавит поле "enabled" с булевым значением "false" ко всем ранее существующим документам в вашей коллекции.

Ответ 3

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

Настройки Mongoose

Значения по умолчанию применяются при построении скелета документа. Это означает, что если вы создадите новый документ (новый MyModel), или если вы найдете существующий документ (MyModel.findById), то оба будут иметь значения по умолчанию, если отсутствует определенный ключ.