3

私は最近、Node.js で MongoDB を使用する方法を学んでおり、MongoDB の変更をチームの他のメンバーと (たとえば、git リポジトリを介して) 共有する方法を考えていました。

たとえば、usersMongoDB で名前が付けられたコレクションが必要で、そのコレクションにフィールドgivenNameとを含むドキュメントがいくつかあるfamilyName場合、チームの各開発者がアプリケーションを実行すると、MongoDB が自動的にコレクションとコードに記述されているとおりのフィールド。

何らかの理由で、両方のフィールドの名前を と に変更する必要があるとしましょforenamesurname

アプリケーションはしばらく実行されているため、チームのすべての開発者は、および;usersを含むドキュメントを含むコレクションのローカル コピーを持っています。実動サーバーについても同じことが言えます。givenNamefamilyName

私が理解していることから、古いフィールド名で使用されていたデータを「失う」ため、コード内のフィールド名を単純に変更して新しいフィールド名を使用することはできません(「失う」とは、もちろん予想どおり、古いデータがまだ存在していても、古いデータは表示されなくなります)。

そのため、関連するすべてのドキュメントのフィールドの名前を変更するには、MongoDB シェルでもコマンドを実行する必要があると思います。

しかし、これを行うと、コレクションのローカル コピーのみusersが最新になります。

MySQL を使用する場合、必要に応じて実行する SQL ファイルで git を介してすべての変更を共有するか、利用可能な場合は PHP の Laravel フレームワークなどで移行を使用します。

MySQL で行ったのと同じことを行いchanges.js、MongoDB シェルで実行するファイルを保持しますか?

それとも、開発者がアプリケーションを実行したときに変更が自動的に実行されるように、おそらくアプリケーション コード自体でこれを行うためのより良い方法はありますか?

つまり、チーム メンバー間で MongoDB の変更を共有するためのベスト プラクティスは何ですか?

4

1 に答える 1

1

データの移行は、ほぼすべての永続化システムにとって大きな苦痛です。遅延移行と積極的移行の 2 つの大きな戦略があります。

遅延移行の場合、コードが古いデータ構造と新しいデータ構造の両方に対応できる必要があります。残念ながら、node.js mongodb ドライバーが内部でどのように機能するかはわかりません。たとえば、C# ドライバーでは、カスタム シリアライザーを登録したり、エイリアスを定義したり、C# のゲッターとセッターを使用してこの動作を有効にしたりできます。したがって、ForenameフィールドはgivenName or Forenameから読み取られますが、データベースに格納するときは常に としてシリアル化されForenameます。

この戦略の問題点は、クエリでは機能しないことです。たとえば{"Forename" : "John"}、一部のドキュメントがまだ移行されていないために失敗する可能性があります。もちろん、インデックスや一意の制約でさえ、事態はさらに悪化します。

熱心な移行には、基本的にデータベース内のすべてのドキュメントを実行し、必要に応じてそれらを更新するスクリプトが必要です。通常、これはより簡単な方法であり、クエリが壊れることはありません。ただし、このスクリプトを適切なタイミングで実行する必要があり、大規模なデータセットの場合、これには時間がかかる場合があります。その間、システムがダウンしているか、誤った結果が返されます。

したがって、データ量が多いほど、より多くの「怠惰」を許容する必要があります。たとえば、スクリプトを (自然な順序ではなく) ユーザーごとに実行して、ユーザーがデータの「半分移行」状態になる可能性が非常に低いようにすることができます。それでも、コードでこれを処理できるようにする必要があります。

どちらの戦略でも、物事が複雑になると、スキーマのバージョン管理が必要になる場合があります。つまり、個々のドキュメントには のようなフィールドがあり、バージョンからバージョンへ_svの取得方法を知っているスクリプトがあります。次に、スクリプトを非常に抽象的で冪等にすることができるため、新しいデータに対して古いスクリプトを実行すると何かが壊れるという心配をせずにスクリプトを実行できます。nn+1

于 2013-10-16T09:12:35.773 に答える