1

外部キー制約はNoSqlデータベースには意味がないことを理解していますが、フィールドの名前を変更できる場合は、インデックスが更新されることを保証しないでください。 http://www.mongodb.org/display/DOCS/Updating#Updating-%24rename

{ $rename : { old_field_name : new_field_name } }

しかし、私が持っていた場合

db.mycollections.ensureIndex({old_field_name:1});

インデックスが自動的に更新されたら素晴らしいと思いませんか?

system.indexesは単なる別のテーブルであり、そのような自動更新はある種の外部キー制約を意味するため、インデックスの更新は行われません。または、特定のフラグがありませんか?

4

2 に答える 2

2

それはしません。

あなたの質問に対する答えは、「インデックスが自動的に更新されたら素晴らしいと思いませんか?」です。は、「いいえ、実際にはありません」です。

フィールドの名前を変更することをお勧めする場合は、同時に新しいインデックスを自分で追加できます。フィールドの名前変更を反映するために、コードで他にも多くの変更を行う必要がある可能性があります(クエリ、更新、マップリデュース操作など)。手動で実行する必要がある多くの操作のうちの1つにすぎない場合、非常にまれな操作を自動的に実行しますか?

この機能に関心がある場合は、リクエストしてください。10Genは提案に非常に敏感ですが、答えが「なぜこれが重要なのか」であったとしても驚かないでしょう。

于 2012-04-20T03:18:51.567 に答える
1

マイク・オブライエンの引用:

$ rename演算子は、単一のアトミック操作で$ set /$unsetを実行するのに似ています。これは、値を取得して別のフィールドに移動する必要がある状況へのショートカットです。2つのステップ(1つはフィールドの値をフェッチするため、もう1つは新しいフィールドの値を設定するため)で行う必要はありません。

$ renameを実行することは、データが変更されていることを意味します。$renameを使用して「x」という名前のフィールドの名前を「y」に変更したが、「y」という名前のフィールドがドキュメントにすでに存在している場合、「y」の古い値は上書きされ、フィールド「x」は削除されます。もう存在します。「x」または「y」のいずれかにインデックスが付けられている場合、操作はそれらのインデックスを更新して、操作の結果の最終値を反映します。名前の変更を使用して、埋め込みドキュメント内から最上位レベルにフィールドを移動する場合(たとえば、「ab」から「c」に名前を変更する場合)、またはその逆の場合も同様です。

SOの質問で提案された動作(つまり、フィールドの名前を変更すると、移動先のフィールドとインデックス内の値の関係が維持されます)は、物事が非常に混乱し、「正しい」期待される動作について推論するのが難しくなる可能性があります。特定の操作用です。たとえば、コレクションのフィールド「A」にインデックスを作成する場合、ドキュメントの1つで「A」の名前を「B」に変更してから、update({"A":}、{"$ set ":{" B ":}})// A =であるドキュメントを検索し、そのBの値をupdate({"B ":}、{" $ set ":{" A ":}})//に設定します。 B =であるドキュメントを検索し、そのAの値をに設定します。

これらは同等である必要がありますか?一般に、データベースにフィールド名ごとにコレクション全体のインデックスを維持させることは、動作を予測可能かつ単純に保つ設計上の決定です。

于 2012-04-27T05:24:09.600 に答える