2013-01-11 16 views
21

Stiamo sviluppando rapidamente un'applicazione che utilizza Mongoose e i nostri schemi stanno cambiando spesso. Non riesco a capire il modo corretto di aggiornare uno schema per i documenti esistenti, senza farli esplodere e ricrearli completamente da zero.Mongoose Changing Schema Format

Mi sono imbattuto in http://mongoosejs.com/docs/api.html#schema_Schema-add, che sembra essere giusto. C'è poca o nessuna documentazione su come implementare effettivamente questo, rendendo molto difficile per qualcuno che è nuovo a MongoDB.

Voglio semplicemente aggiungere un nuovo campo chiamato abilitato. La mia definizione dello schema è:

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 
    } 
}); 

risposta

10

Non c'è nulla di incorporato in Mongoose sulla migrazione dei documenti esistenti per conformarsi a una modifica dello schema. Devi farlo nel tuo codice, se necessario. In un caso come il nuovo campo enabled, è probabilmente più pulito scrivere il codice in modo che tratti un campo enabled mancante come se fosse impostato su false in modo da non dover toccare i documenti esistenti.

Per quanto lo schema si modifica, è sufficiente aggiornare la definizione Schema come si è mostrato, ma modifiche come nuovi campi con valori default riguarderanno solo i nuovi documenti in futuro.

+0

* ma i cambiamenti come i nuovi campi con valori predefiniti incideranno solo sui nuovi documenti in corso. * - Immagino che influenzi anche i documenti aggiornati giusto? (non solo nuovo) – Michael

+0

@Michael Non proprio, no. L'aggiunta di nuovi campi con un valore predefinito renderà quei campi visualizzati nelle istanze di mangusta dei documenti esistenti, ma in realtà non aggiungerà il campo ai documenti esistenti, anche se si chiama 'save' su di essi. – JohnnyHK

+0

Quindi salvare un documento che in precedenza non aveva il campo 'x' dopo che ho aggiunto' x' allo schema con il valore predefinito non aggiornerà il documento con 'x'? Non capisco questa scelta di design, questo è documentato da qualche parte? Grazie – Michael

1

Stavo anche cercando qualcosa di simile a migrazioni, ma non l'ho trovato. In alternativa è possibile utilizzare i valori predefiniti. Se una chiave ha un valore predefinito e la chiave non esiste, utilizzerà l'impostazione predefinita.

Mongoose Defaults

valori predefiniti vengono applicati quando lo scheletro documento è costruito. Ciò significa che se crei un nuovo documento (nuovo MyModel) o se trovi un documento esistente (MyModel.findById), entrambi avranno i valori predefiniti a condizione che manchi una certa chiave.

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

considerando il nome del modello mangusta come "sweepstakesModel", Questo codice dovrebbe aggiungere "enabled" campo con valore booleano "false" a tutti i documenti pre-esistenti nella vostra collezione.

+0

Sebbene ciò possa teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. –

+0

@bhargav, ho aggiornato la mia risposta con il codice corretto di mangusta. Fare un tentativo. Il codice funziona bene per me – Vickar

+0

Grazie per quello. –

Problemi correlati