Penso che questa sia davvero una buona domanda, ma le risposte saranno un po' sparse in base alle librerie che stai utilizzando e alle tue aspettative per una "migrazione".
Diamo un'occhiata ad alcune azioni di migrazione comuni:
- Aggiungi un campo: Mongo lo rende molto facile. Basta aggiungere un campo e il gioco è fatto.
- Elimina un campo: In teoria, non sei effettivamente legato al tuo schema, quindi "cancellazione" qui è relativa. Se rimuovi la "proprietà" e non carichi più il campo, non importa se quel campo è nei dati. Quindi se non preoccuparsi di "ripulire" il database, quindi la rimozione di un campo non influisce sul database. Se lo fai preoccupati di pulire il DB, in pratica dovrai eseguire un ciclo for gigante sul DB.
- Modifica il nome di un campo: Anche questo è un problema difficile. Quando rinomini un campo "dove" lo stai rinominando? Se si desidera che il DB rifletta il nuovo nome del campo, in pratica è necessario eseguire un ciclo for gigante sul DB. Per essere sicuro probabilmente devi "aggiungere" i dati, quindi premere il codice, quindi "deselezionare" il vecchio campo.
Alcune rughe
Tuttavia, il concetto di nome di campo in tandem con un oggetto ActiveRecord è solo leggermente distorto. Un oggetto ActiveRecord fornisce effettivamente i mapping delle proprietà dell'oggetto ai campi del database effettivi.
In un tipico RDBMS la "dimensione" di un nome di campo non è realmente rilevante. Tuttavia, in Mongo, il nome del campo occupa effettivamente spazio dati e questo fa una grande differenza in termini di prestazioni.
Ora, se stai usando una qualche forma di "oggetto dati" come ActiveRecord, perché dovresti tentare di memorizzare i nomi dei campi completi nei dati? Il DB dovrebbe probabilmente memorizzare tutti i campi in ordine alfabetico con una mappa sul lato Oggetto. Quindi un documento potrebbe avere 8 campi/proprietà e i nomi DB sarebbero "a", "b"..."j", ma i nomi degli oggetti sarebbero elementi leggibili come "Nome", "Prezzo", "Quantità".
Il motivo per cui lo sollevo è che aggiunge ancora un'altra ruga per Modificare il nome di un campo . Se stai implementando una mappatura, la modifica del nome di un campo non provoca affatto una migrazione.
Altre rughe
Se fai desideri implementare una migrazione su un'eliminazione, dovrai farlo dopo un dispiegamento. Dovrai anche riconoscere che non risparmierai spazio su disco corrente quando lo fai.
Mongo pre-alloca lo spazio e in realtà non lo "restituisce" a meno che non si esegua una riparazione del DB. Quindi, se elimini un gruppo di campi sui documenti, quei documenti occupano ancora lo stesso spazio su disco. Se i documenti vengono successivamente spostati, puoi recuperare spazio, tuttavia i documenti si spostano solo quando crescono.
Se rimuovi un campo grande da molti documenti, ti consigliamo di eseguire una riparazione o controllare il nuovo compact
comando.