2009-11-19 3 views
22

Sto costruendo un'applicazione Rails usando MongoDB come back-end e MongoMapper come strumento ORM. Supponiamo che nella versione 1, definisco il seguente modello:MongoMapper e migrazioni

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
end 

Più tardi nella versione 2, mi rendo conto che ho bisogno di una nuova chiave richieste sul modello. Così, nella versione 2, SomeModel ora assomiglia a questo:

class SomeModel 
    include MongoMapper::Document 
    key :some_key, String 
    key :some_new_key, String, :required => true 
end 

Come faccio a migrare tutti i miei dati esistenti per includere some_new_key? Supponiamo che io sappia come impostare un valore predefinito ragionevole per tutti i documenti esistenti. Facendo un ulteriore passo avanti, supponiamo che nella versione 3 mi rendo conto di non aver davvero bisogno di un po 'dikey. Così, ora il modello assomiglia a questo

class SomeModel 
    include MongoMapper::Document 
    key :some_new_key, String, :required => true 
end 

Ma tutti i record esistenti nel mio database hanno valori fissati per some_key, ed è solo spreco di spazio a questo punto. Come posso recuperare quello spazio?

Con ActiveRecord, avrei appena creato migrazioni per aggiungere i valori iniziali di some_new_key (nella versione1 -> migrazione versione2) e per eliminare i valori per some_key (nella versione2 -> migrazione versione3).

Qual è il modo appropriato per farlo con MongoDB/MongoMapper? Mi sembra che sia ancora necessario un metodo per tenere traccia delle migrazioni eseguite. Esiste una cosa del genere?

MODIFICATO: Penso che alla gente manchi il punto della mia domanda. Ci sono momenti in cui si desidera essere in grado di eseguire uno script su un database per modificare o ristrutturare i dati in esso contenuti. Ho fornito due esempi sopra, uno in cui è stata aggiunta una nuova chiave richiesta e una in cui una chiave può essere rimossa e lo spazio può essere recuperato. Come gestisci l'esecuzione di questi script? Le migrazioni ActiveRecord offrono un modo semplice per eseguire questi script e determinare quali script sono già stati eseguiti e quali script non sono stati eseguiti. Posso ovviamente scrivere uno script Mongo che esegue qualsiasi aggiornamento sul database, ma quello che sto cercando è un framework come le migrazioni che mi consente di tenere traccia di quali script di aggiornamento sono già stati eseguiti.

+0

Penso che Mongo (/ Mapper) potrebbe essere troppo giovane per questo genere di cose. :/ – Konklone

+0

La migrazione in termini di schema in realtà non è un concetto corretto in Mongo DB poiché in realtà il DB di Mongo non ha alcuno schema. Devi solo scrivere lo script di migrazione dei dati da solo. – zsong

risposta

13

Controlla Mongrazioni ... Ho appena finito di leggerlo e sembra che tu stia cercando.

http://terrbear.org/?p=249

http://github.com/terrbear/mongrations

Cheers! Kapslok

+1

Per Rails 3, dai un'occhiata a questo fork di mongrations di terrbear: https://github.com/TheHiveProjects/mongrations. (Al momento, questo è il fork con i commit più recenti.) Ho dovuto specificare 'gem 'mongrations',: git => 'git: // github.com/TheHiveProjects/mongrations.git'' per ottenerlo lavorare. – colllin

-5

MongoDB è un database senza schema. Ecco perché non ci sono migrazioni. Nel database stesso, non importa se gli oggetti hanno la chiave: some_key o la chiave: some_other_key in qualsiasi momento.

MongoMapper tenta di applicare alcune restrizioni su questo, ma dal momento che il database è così flessibile, sarà necessario mantenere tali restrizioni da soli. Se hai bisogno di una chiave su ogni oggetto, assicurati di eseguire uno script per aggiornare quelle chiavi su oggetti preesistenti, o gestire il caso di un oggetto che non ha quella chiave quando le incontri.

Sono abbastanza nuovo per MongoDB, ma per quanto posso vedere, a causa della flessibilità del db senza schema, questo è il modo in cui è necessario gestirlo.

+9

Prendo in considerazione questo argomento: "MongoDB è un database senza schema. Ecco perché non ci sono migrazioni". Anche se MongoDB non applica uno schema ai tuoi documenti, in pratica probabilmente vorrai che la tua applicazione imponga uno schema, in una certa misura. Se si definisce "migrazione" un po 'più in generale, è facile vedere come un'applicazione Web con supporto MongoDB potrebbe aver bisogno di migrazioni. È vero che un tipo di migrazione è una migrazione di schema "formale".Ma ci sono altri tipi di migrazioni che sono ancora molto importanti: aggiungere chiavi, rinominare chiavi, cambiare dati, ecc. –

+11

Le trasformazioni di dati sono migrazioni. MongoDB ha dati. –

1

Un'opzione consiste nell'utilizzare l'operazione update per aggiornare tutti i dati contemporaneamente. Il multi aggiornamento è nuovo nelle versioni di sviluppo, quindi è necessario utilizzare uno di questi.

-1

Scommetto che potresti collegare ad Activerecord :: Miration per automatizzare e tenere traccia degli script di "migrazione".

0

Clint,

È possibile scrivere codice per fare gli aggiornamenti - anche se sembra che per l'aggiornamento di un record in base ai suoi propri campi non è supportato.

In tal caso, ho fatto quanto segue e corse contro il server:

------------------------------ 
records = Patient.all() 

records.each do |p| 
    encounters = p.encounters 
    if encounters.nil? || encounters.empty? 
    mra = p.updated_at 
    #puts "\tpatient...#{mra}" 
    else 
    mra = encounters.last.created_at 
    #puts "\tencounter...#{mra}" 
    end 
    old = p.most_recent_activity 
    p.most_recent_activity = mra 
    p.save! 
    puts "#{p.last_name} mra: #{old} now: #{mra}" 
end 
------------------------------ 
1

Mongrations è un gioiello super vecchio, completamente deprecato. Raccomando di NON usarlo.

Exodus è un framework di migrazione davvero cool per Mongo, che potrebbe essere quello che vuoi:

https://github.com/ThomasAlxDmy/Exodus

1

Abbiamo appena costruire questo uno: https://github.com/eberhara/mongration - è un modulo nodo regolare (lo si può trovare su NPM).

Avevamo bisogno di un buon framework di migrazione mongodb, ma non siamo riusciti a trovarne - quindi ne abbiamo costruito uno.

Ha una sacco di caratteristiche migliori rispetto alle normali strutture di migrazione:

  • checksum (emette un errore quando un previosuly corse di migrazione non corrisponde la sua vecchia versione)
  • persiste lo stato di migrazione per mongo (c'è nessun file di stato regolare)
  • pieno supporto al set di repliche
  • rollback automatici maniglia (gli sviluppatori devono specificare le procedure di rollback)
  • possibilità di eseguire multip Le migrazioni (sincronizzazione o asincrono), allo stesso tempo
  • Possibilità di eseguire migrazioni contro diversi database, allo stesso tempo

Speranza che aiuta!