2009-11-19 10 views
22

Ich baue eine Rails-Anwendung mit MongoDB als Back-End und MongoMapper als ORM-Tool. Angenommen, in der Version 1, definiere ich folgendes Modell:MongoMapper und Migrationen

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

Später in Version 2, wird mir klar, dass ich einen neuen erforderlichen Schlüssel auf dem Modell benötigen. Also, in der Version 2, sieht SomeModel nun wie folgt aus:

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

Wie kann ich wandern alle meine vorhandenen Daten some_new_key aufzunehmen? Angenommen, ich weiß, wie Sie einen vernünftigen Standardwert für alle vorhandenen Dokumente festlegen können. Nehmen wir noch einen Schritt weiter und nehmen an, dass ich in der Version 3 feststelle, dass ich some_key überhaupt nicht brauche. So, jetzt sieht das Modell wie dieses

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

Aber alle vorhandenen Datensätze in der Datenbank Werte für some_key gesetzt haben, und es ist nur an dieser Stelle Platzverschwendung. Wie kann ich diesen Raum zurückgewinnen? Mit ActiveRecord hätte ich gerade Migrationen erstellt, um die Anfangswerte von some_new_key hinzuzufügen (in der Migration von Version1 -> Version2) und um die Werte für some_key zu löschen (in Version2 -> Version3 Migration).

Was ist der geeignete Weg, dies mit MongoDB/MongoMapper zu tun? Es scheint mir, dass eine Methode zum Verfolgen, welche Migrationen ausgeführt wurden, immer noch notwendig ist. Gibt es so etwas?

EDITED: Ich denke, die Leute vermissen den Punkt meiner Frage. Es kann vorkommen, dass Sie ein Skript in einer Datenbank ausführen möchten, um die darin enthaltenen Daten zu ändern oder neu zu strukturieren. Ich habe oben zwei Beispiele angeführt, von denen eines einen neuen erforderlichen Schlüssel hinzugefügt hat und eines, bei dem ein Schlüssel entfernt werden kann und Speicherplatz zurückgewonnen werden kann. Wie verwalten Sie die Ausführung dieser Skripts? Mit ActiveRecord-Migrationen können Sie diese Skripts auf einfache Weise ausführen und feststellen, welche Skripts bereits ausgeführt wurden und welche Skripts noch nicht ausgeführt wurden. Ich kann natürlich ein Mongo-Skript schreiben, das die Datenbank aktualisiert, aber ich suche nach einem Framework wie Migrationen, mit dem ich nachverfolgen kann, welche Upgrade-Skripts bereits ausgeführt wurden.

+0

Ich denke Mongo (/ Mapper) könnte einfach zu jung für diese Art von Sache sein. :/ – Konklone

+0

Migration in Bezug auf Schema ist eigentlich kein richtiges Konzept in Mongo DB, da Mongo DB tatsächlich kein Schema hat. Sie müssen nur das Datenmigrations-Skript selbst schreiben. – zsong

Antwort

13

Schauen Sie sich Mongrations an ... Ich habe es gerade gelesen und es sieht so aus, als ob Sie danach suchen.

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

http://github.com/terrbear/mongrations

Prost! Kapslok

+1

Für Rails 3, schauen Sie sich diese Gabel von Terrbear's Vermischungen an: https://github.com/TheHiveProjects/mongrations. (Zum jetzigen Zeitpunkt ist das die Verzweigung mit den letzten Commits.) Ich musste "gem" -Mongrationen angeben,: git => 'git: // github.com/TheHiveProjects/mongrations.git', um es zu bekommen arbeiten. – colllin

-5

MongoDB ist eine schemalose Datenbank. Deshalb gibt es keine Migrationen. In der Datenbank selbst spielt es keine Rolle, ob die Objekte zu irgendeinem Zeitpunkt den Schlüssel some_key oder den Schlüssel some_other_key haben.

MongoMapper versucht einige Einschränkungen zu erzwingen, aber da die Datenbank so flexibel ist, müssen Sie diese Einschränkungen selbst pflegen. Wenn Sie für jedes Objekt einen Schlüssel benötigen, stellen Sie sicher, dass Sie ein Skript ausführen, um diese Schlüssel für bereits vorhandene Objekte zu aktualisieren, oder behandeln Sie die Groß-/Kleinschreibung eines Objekts, das diesen Schlüssel nicht enthält, wenn Sie darauf stoßen.

Ich bin ziemlich neu in MongoDB selbst, aber soweit ich sehen kann, müssen Sie aufgrund der Flexibilität der schemafreien db so umgehen.

+9

Ich habe Probleme mit diesem Argument: "MongoDB ist eine schemalose Datenbank. Deshalb gibt es keine Migrationen." Obwohl MongoDB kein Schema in Ihren Dokumenten erzwingt, werden Sie in der Praxis wahrscheinlich ein gewisses Durchsetzungsvermögen für Ihre Anwendung wünschen. Wenn Sie "Migration" etwas breiter definieren, ist es leicht zu sehen, wie eine MongoDB-unterstützte Webanwendung Migrationen benötigt. Es ist richtig, dass eine Art der Migration eine "formale" Schemamigration ist.Aber es gibt noch andere Arten von Migrationen, die immer noch sehr wichtig sind: Hinzufügen von Schlüsseln, Umbenennen von Schlüsseln, Ändern von Daten usw. –

+11

Datentransformationen sind Migrationen. MongoDB hat Daten. –

1

Eine Option ist die update Operation, um alle Ihre Daten auf einmal zu aktualisieren. Multi-Update ist neu in den Entwicklungsversionen, daher müssen Sie eines davon verwenden.

-1

Ich wette, Sie könnten in Activetrecord :: Miration greifen, um Ihre "Migration" -Skripts zu automatisieren und zu verfolgen.

0

Clint,

Sie Code schreiben können Updates zu tun - obwohl es scheint, dass eine Aufzeichnung auf seinen eigenen Feldern basiert für die Aktualisierung nicht unterstützt wird.

In einem solchen Fall habe ich die folgenden und lief es auf dem 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 ein super altes Juwel ein weiteres Juwel für MongoMapper Migrationen ist völlig veraltet. Ich empfehle es nicht zu benutzen.

Exodus eine wirklich coole Migration Rahmen für Mongo ist, das auch sein mag, was Sie wollen:

https://github.com/ThomasAlxDmy/Exodus

1

Wir bauen gerade dieses: https://github.com/eberhara/mongration - es ist ein regelmäßiger Knotenmodul (Sie es auf finden npm).

Wir brauchten ein gutes mongodb Migrationsframework, konnten aber keins finden - also bauten wir eins.

Es hat viel von besseren Eigenschaften als die regulären Migration Frameworks:

  • Checksum (einen Fehler ausgibt, wenn ein previosuly Migration lief nicht seine alte Version entsprechen)
  • Migration Zustand Persists Mongo (es gibt keine regelmäßige Statusdatei)
  • Volle Unterstützung Replik setzt
  • Automatische Griff Rollbacks (Entwickler das Rollback-Verfahren)
  • Fähigkeit angeben müssen multip laufen le-Migrationen (sync oder async) zugleich
  • Fähigkeit Migrationen gegen verschiedene Datenbanken zur gleichen Zeit laufen

Hoffe, es hilft!