マイク・オブライエンの引用:
$ 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の値をに設定します。
これらは同等である必要がありますか?一般に、データベースにフィールド名ごとにコレクション全体のインデックスを維持させることは、動作を予測可能かつ単純に保つ設計上の決定です。