Frage

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

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

Später in Version 2, merke ich, dass ich eine neue gewünschte Taste auf dem Modell benötigen. Also, in der Version 2, SomeModel sieht nun wie folgt aus:

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

Wie migriere ich alle meine vorhandenen Daten some_new_key aufzunehmen? Nehmen wir an, ich weiß, wie man einen vernünftigen Standardwert setzen für alle bestehenden Dokumente. Wenn man dies noch einen Schritt weiter angenommen, dass in der Version 3, merke ich, dass ich wirklich some_key überhaupt nicht brauchen. So, jetzt das Modell wie folgt aussieht

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

Aber alle vorhandenen Datensätze in der Datenbank haben Werte für some_key gesetzt, und es ist nur Platz an dieser Stelle zu verschwenden. Wie zurückzufordern ich diesen Raum?

Mit Active, hätte ich nur Migrationen geschaffen, um die Anfangswerte von some_new_key (im version1 -> version2 Migration) hinzuzufügen, und die Werte für some_key zu löschen (im version2 -> version3 Migration).

Was ist der geeignete Weg, um dies mit MongoDB / MongoMapper zu tun? Es scheint mir, dass einige Verfahren zur Verfolgung der Migration ausgeführt wurde noch notwendig ist. Gibt es so etwas gibt es?

EDITED: Ich glaube, die Leute fehlen den Punkt meiner Frage. Es gibt Zeiten, in denen Sie in der Lage sein wollen, ein Skript für eine Datenbank zu ändern oder Umstrukturierung der Daten darin laufen. Ich habe zwei Beispiele oben, ein, wo ein neuer erforderlich Schlüssel hinzugefügt wurde und eine, wo ein Schlüssel entfernt werden kann und Raum kann zurückgewonnen werden. Wie schaffen Sie diese Skripte ausgeführt werden? Active Migrationen geben Ihnen eine einfache Möglichkeit, diese Skripte auszuführen und zu bestimmen, was haben Skripte bereits ausgeführt worden ist und was Skripten laufen nicht gewesen. Ich kann natürlich ein Mongo Skript schreiben, das auf die Datenbank jede Aktualisierung tut, aber was ich suche ist ein Framework wie Migrationen, die mich, die bereits ausgeführt wurden Upgrade-Skripte können verfolgen.

War es hilfreich?

Lösung

Sehen Sie sich Mongrations ... ich es gerade fertig gelesen und es sieht so aus, was Sie nach.

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

http://github.com/terrbear/mongrations

Prost! Kapslok

Andere Tipps

Eine Möglichkeit ist es, die update Betrieb zu verwenden, um alle Ihre Daten auf einmal zu aktualisieren. Multi-Update ist neu in den Entwicklungsversionen, so dass Sie einen von denen verwenden, müssen.

Sie können diese contraption versuche ich gerade gemacht, aber es funktioniert nur mit mongoid und Schienen 3 (Beta 3) im Moment. http://github.com/adacosta/mongoid_rails_migrations . Es wird auf Schienen 3 aufgerüstet werden, wenn es geht endgültig.

Auch ein weiteres Juwel für MongoMapper Migrationen https://github.com/alexeypetrushin/mongo_mapper_ext

Mongrations ist ein super altes Juwel, völlig veraltet. Ich empfehle es nicht.

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

https://github.com/ThomasAlxDmy/Exodus

Wir bauen nur diese eine: https://github.com/eberhara/mongration - es ist ein reguläres Knotenmodul (Sie können es auf npm finden).

Wir brauchten eine gute mongodb Migration Rahmen, konnte aber keine finden -., So dass wir eine eingebaute

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

  • Checksum (gibt einen Fehler, wenn ein previosuly RAN Migration nicht seine alte Version überein)
  • weiterhin besteht Migration Zustand Mongo (es gibt keine regelmäßige Statusdatei)
  • Volle Unterstützung zu Replikatsätzen
  • Automatische Griff Rollbacks (Entwickler müssen das Rollback-Verfahren angeben)
  • Die Fähigkeit, mehrere Migrationen (sync oder async) zur gleichen Zeit ausgeführt werden
  • Möglichkeit Migrationen gegen verschiedene Datenbanken zur gleichen Zeit ausgeführt werden

Hope, es hilft!

Clint,

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

In einem solchen Fall, ich habe die folgenden Hinweise und lief es für den 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
------------------------------

Ich wette, Sie in Activerecord :: Migration Haken könnte Ihre „Migration“ Skripte zu automatisieren und zu verfolgen.

MongoDB ist ein Schema-weniger-Datenbank. Aus diesem Grund gibt es keine Migrationen. In der Datenbank selbst, spielt es keine Rolle, ob die Objekte haben den Schlüssel: some_key oder die Taste:. Some_other_key jederzeit

MongoMapper versucht, einige Einschränkungen auf, dies zu erzwingen, aber da die Datenbank so flexibel ist, werden Sie diese Beschränkungen selbst pflegen. Wenn Sie einen Schlüssel auf jedem Objekt benötigen, stellen Sie sicher, dass Sie ein Skript ausführen, diese Schlüssel auf bereits bestehenden Objekte zu aktualisieren, oder den Fall eines Objekts zu behandeln, die nicht den Schlüssel hat, wie Sie über sie kommen.

Ich bin ziemlich neu in MongoDB mich, aber soweit ich sehen kann, aufgrund der Flexibilität des schema-weniger db dies ist, wie Sie damit umgehen müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top