定義
$set$set演算子は、フィールドの値を指定された値に置き換えます。
互換性
次の環境でホストされる配置には $set を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$set演算子式の形式は次のとおりです。
{ $set: { <field1>: <value1>, ... } }
<field> を埋め込みドキュメントまたは配列で指定するには、ドット表記を使用します。
動作
MongoDB 5.0 以降、更新演算子では名前が文字列ベースのドキュメントフィールドを辞書順に処理します。数値名のフィールドは、数値順に処理されます。詳細については、「更新演算子の動作」を参照してください。
フィールドが存在しない場合、$set は、新しいフィールドが型制約に違反しない場合、指定された値を持つ新しいフィールドを追加します。存在しないフィールドにドットパスを指定すると、$set は、フィールドへのドットパスを満たすために必要に応じて埋め込みドキュメントを作成します。
複数のフィールドと値のペアを指定すると、 $setは各フィールドを更新または作成します。
MongoDB 5.0 以降、$setなどの更新演算子を空のオペランド式({ })と併用しても、mongod でエラーが発生しなくなりました。空の更新を使用すると変更は一切されず、oplog エントリも作成されません(操作は実行されません)。
$set の利点
$set 演算子には、完全なドキュメント置換と比較して次の利点があります。
ターゲット更新:
$setは指定されたフィールドのみを変更し、大規模なドキュメントを操作する際に不要な書き込みとオーバーヘッドを回避することで効率的な更新を可能にします。効率的な Oplog エントリ:
$setは、ドキュメント全体ではなく、更新されたフィールドのみをoplogに書込むことでレプリケーションを最適化します。このプロセスによりoplogエントリのサイズが縮小され、ノードは変更をより効率的に複製できます。簡素化されたロジック:
$setを使用するアプリケーションは、更新を送信する前に変更されたフィールドを計算する必要はありません。MongoDB はデルタ計算を内部的に処理することで複雑さを軽減します。
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
最上位フィールドの設定
次の例では、$set 演算子を使用して、一致する映画ドキュメントに label および status フィールドを追加します。
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { label: "Award Winner", status: "classic" } } )
この操作では、次の結果を返します。
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
埋め込みドキュメントでのフィールドの設定
次の例では、一致する動画の imdb 埋め込みドキュメントの highlight フィールドをドット表記を使用して更新します。
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { "imdb.highlight": "Critics' Choice" } } )
この操作では、次の結果を返します。
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
重要
前の例では、ドット表記を使用して埋め込みドキュメント imdb の highlight フィールドを更新します。代わりに次の形式では、埋め込みドキュメント全体が置き換えられ、imdb から他のすべてのフィールドが削除されます。
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { imdb: { highlight: "Critics' Choice" } } } )
配列内の要素の設定
次の例では、$set 演算子を使用して、一致するムービー ドキュメントの genres 配列の最初の要素(配列インデックス 0)を更新します。
db.movies.updateOne( { title: "The Dark Knight" }, { $set: { "genres.0": "Thriller" } } )
この操作では、次の結果を返します。
{ acknowledged: true, insertedId: null, matchedCount: 1, modifiedCount: 1, upsertedCount: 0 }
配列のその他の更新演算子については、「配列更新演算子」を参照してください。