これは本当に良い質問だと思いますが、使用しているライブラリと「移行」に対する期待に基づいて、答えは少し散らばっています。
いくつかの一般的な移行アクションを見てみましょう:
- フィールドを追加します: Mongoはこれを非常に簡単にします。フィールドを追加するだけで完了です。
- フィールドを削除する: 理論的には、実際にはスキーマに縛られていないため、ここでの「削除」は相対的なものです。 「プロパティ」を削除してフィールドをロードしなくなった場合、そのフィールドがデータに含まれているかどうかは実際には問題ではありません。したがって、しない データベースの「クリーンアップ」に注意してください。フィールドを削除しても、データベースには影響しません。 する場合 DBのクリーニングに注意してください。基本的に、DBに対して巨大なforループを実行する必要があります。
- フィールド名を変更します: これも難しい問題です。フィールドの名前を「どこ」に変更するとき、名前を変更しますか? DBに新しいフィールド名を反映させたい場合は、基本的にDBで巨大なforループを実行する必要があります。安全のために、おそらくデータを「追加」し、コードをプッシュしてから、古いフィールドを「設定解除」する必要があります。
いくつかのしわ
ただし、ActiveRecordオブジェクトと連携したフィールド名の概念は少し歪んでいます。 ActiveRecordオブジェクトは、オブジェクトプロパティの実際のデータベースフィールドへのマッピングを効果的に提供しています。
一般的なRDBMSでは、フィールド名の「サイズ」は実際には関係ありません。ただし、Mongoでは、フィールド名が実際にデータスペースを占有するため、パフォーマンスの点で大きな違いがあります。
さて、ActiveRecordのような何らかの形式の「データオブジェクト」を使用している場合、なぜ完全なフィールド名をデータに保存しようとするのでしょうか。 DBはおそらく、すべてのフィールドをアルファベット順に格納し、オブジェクト側にマップを配置する必要があります。したがって、ドキュメントには8つのフィールド/プロパティがあり、DB名は「a」、「b」...「j」になりますが、オブジェクト名は「Name」、「Price」、「Quantity」などの読み取り可能なものになります。
私がこれを取り上げる理由は、フィールド名の変更にさらに別のしわが追加されるためです。 。マッピングを実装している場合、フィールド名を変更しても、実際には移行はまったく発生しません。
もう少ししわ
行う場合 削除時に移行を実装する場合は、後に実装する必要があります。 デプロイ。また、そうするときに現在のディスク容量を節約しないことを認識する必要があります。
Mongoはスペースを事前に割り当てており、DBの修復を行わない限り、実際には「それを返す」ことはありません。したがって、ドキュメントの一連のフィールドを削除しても、それらのドキュメントはディスク上の同じスペースを占有します。ドキュメントが後で移動された場合は、スペースを再利用できますが、ドキュメントは大きくなったときにのみ移動します。
多数のドキュメントから大きなフィールドを削除する場合は、修復を行うか、新しいインプレースでチェックアウトする必要がありますcompact
コマンド。