2012-04-20 12 views
0

NoSqlデータベースでは外部キーの制約が当てはまりませんが、フィールドの名前を変更できるようにするにはインデックスを更新しないようにしてください。 http://www.mongodb.org/display/DOCS/Updating#Updating-%24renameMongoはインデックスの更新ではなく名前の変更

{ $rename : { old_field_name : new_field_name } } 

が、私は

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

を持っていた場合、インデックスが自動的に更新された場合、それは素晴らしいことではないでしょうか?

system.indexesは単なる別のテーブルなので、このような自動更新では、外部キー制約のソートが行われるため、インデックスの更新は行われませんか?あるいは、私は特定の旗が欠けていますか?

答えて

1

$リネームオペレータが$セット/単一のアトミック操作で$解除を行うことに似ています。これは、値を取って別のフィールドに移動する必要がある状況で、2つのステップ(フィールドの値を取得するもの、新しいものを設定するもの)で行う必要がない場合のショートカットです。

$名前を変更すると、データが変更されていることを意味します。名前を変更して "x"という名前のフィールドの名前を "y"に変更したが、 "y"という名前のフィールドがドキュメント内に既に存在する場合、 "y"の古い値は上書きされ、フィールド "x"はもはやもう存在しない。 「x」または「y」のいずれかが索引付けされている場合、操作はその索引を更新して操作の最終値を反映します。リネームを使用して埋め込みドキュメント内からトップレベルまでフィールドを移動する場合(たとえば、「a.b」から「c」に名前を変更する場合)、またはその逆の場合も同様です。

SOの質問で提案された動作(フィールドの名前を変更すると、移動したフィールドとインデックスの値の関係が維持されます)では、実際には混乱を招く可能性があり、正しい動作 "は、特定の操作のためのものです。たとえば、コレクションのフィールド「A」にインデックスを作成し、ドキュメントの1つで「A」の名前を「B」に変更してから、次のようにします。 update({"A":}、{"$ {B "}} {//"セット ":{" B ":}})// A =のドキュメントを見つけ、Bの値を に設定します// BをAとする文書を見つけ、Aの値を

に設定する

これは同等であるべきですか? 一般に、コレクションのフィールド名によるインデックスをデータベースで管理することは、動作を予測可能かつ単純に保つ設計上の決定です。

1

それはしません。

"インデックスが自動的に更新された場合、それは素晴らしいことではないでしょうか?"は、"いいえ、実際にはありません"です。

フィールドの名前を変更することをお勧めします。自分で新しいインデックスを追加することもできます。フィールド内の名前の変更(クエリ、更新、マップ操作の削減など)を反映するために、コード内で行うべき他の多くの変更が行われる可能性が高いので、インデックスレクリエーションを発生させるべきものあなたが手動で行う必要があるのは多くののうちのほんの1つのものである場合、非常にまれな操作です。

この機能を気にする人は、10Genが提案に非常に敏感ですが、答えがの場合、私は驚かないでしょう。マイクO」オブライエンを引用

+0

リインデックスは、相対的に言えば、かなりリッチな操作であることを指摘する価値があります。リネームがデフォルトで再インデックスを開始できるようにするのは危険なことがあります。オプション。開発者がどのように10genで動作するかを知っていると、ノブとオプションを最小限に抑え、多くの場合に混乱するオプションを追加するのではなく、デフォルトの動作について賢明にする努力があると言えます。それが何かであれば、Jiraでリクエストを提出して、どのような反応を得るかを見たいと思っています。 –

+0

この場合、リネームフィールド操作は使用できません。 dbには、フィールドの名前が変更され、警告されるということがわかります。 –

+0

個人的に私は彼らが良い選択をしたと思います。 10Genの提案は、主観的な議論の場ではなく、Q&Aフォーラムであるため、「行うべきこと」に関するあなたの意見は、10Genの提案を提出することによって最もよく対処されます。 –

関連する問題