AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$addFields(集計ステージ)

$addFields

ドキュメントに新しいフィールドを追加します。$addFields は、入力ドキュメントの既存の全フィールドと、新しく追加されたフィールドを含むドキュメントを出力します。

$addFields ステージは、入力ドキュメント内のすべての既存のフィールドを明示的に指定し、新しいフィールドを追加する $project ステージと同等です。

注意

$addFields のエイリアスである $set ステージを使用することもできます。

次の環境でホストされる配置には $addFields を使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

このステージの構文は、次のとおりです。

{ $addFields: { <newField>: <expression>, ... } }

追加する各フィールドの名前を指定し、その値を集計式または空のオブジェクトに設定します。

重要

新しいフィールドの名前が既存のフィールド名(_id など)と同じ場合、$addFields はそのフィールドの既存の値を、指定された式の値で上書きします。

  • $addFields 既存のドキュメントに新しいフィールドを追加します。集計操作には 1 つ以上の $addFields ステージを含めることができます。

  • $addFields は、集計式または空のオブジェクトに値を設定できるオブジェクトの埋め込みを受け入れます。たとえば、以下のようなネストされたオブジェクトを受け入れられます。

    {$addFields: { a: { b: { } } } }

    埋め込みドキュメント (配列内のドキュメントを含む) に 1 つまたは複数のフィールドを追加するには、ドット表記を使用します。 例 を参照してください。

  • $addFields を使用して既存の配列フィールドに要素を追加するには、$concatArrays を使用します。See 例.

このページの例では、sample_mflix データセット のデータを使用しています。自己管理型 MongoDB 配置にこのデータセットをロードする方法の詳細については、「サンプル データセットのロード」を参照してください。サンプル データベースに何らかの変更を加えた場合は、今ページの例を実行するには、データベースを削除して再作成する必要がある可能性があります。

次の操作では、2 つの $addFields ステージを使用して、まず実行時間を 時間に変換し、次に 1 時間あたり $0.50 のライセンス料金を計算します。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { runtimeHours: { $floor: { $divide: [ "$runtime", 60 ] } }, ratingOutOf100: { $multiply: [ "$imdb.rating", 10 ] } } }, { $addFields: { licenseFeeUSD: { $multiply: [ "$runtimeHours", 0.50 ] } } }] )
[ { _id: ..., title: 'Baseball', runtime: 1140, runtimeHours: 19, licenseFeeUSD: 9.5 }, { _id: ..., title: 'Centennial', runtime: 1256, runtimeHours: 20, licenseFeeUSD: 10 }]...

埋め込みドキュメントに新しいフィールドを追加するには、ドット表記を使用します。

次の集計操作では、各映画に埋め込まれた imdbドキュメントに certifiedフィールドが追加されます。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { "imdb.certified": true } }] )
[ { _id: ..., title: 'Baseball', imdb: { certified: true, '...': '...' } }, { _id: ..., title: 'Centennial', imdb: { certified: true, '...': '...' } }]...

$addFields 操作で既存のフィールド名を指定すると、元のフィールドが置き換えられます。

次の $addFields操作では、runtimeフィールドを上書きして 15 分を追加します。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { runtime: { $add: [ "$runtime", 15 ] } } }] )
[ { _id: ..., title: 'Baseball', runtime: 1155 }, { _id: ..., title: 'Centennial', runtime: 1271 }]...

あるフィールドを別のフィールドで置き換えることもできます。次の操作では、_id を映画のタイトルに設定し、titleフィールドを映画のプライマリジャンルに置き換えます。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { _id: "$title", title: { $arrayElemAt: [ "$genres", 0 ] } } }] )
[ { _id: 'Baseball', title: 'Documentary' }, { _id: 'Centennial', title: 'Action' }]...

$addFields と $concatArrays 式を併用して、既存の配列フィールドに要素を追加できます。次の操作では、Centennial というタイトルの映画の genres 配列に Epic が追加されます。

db.movies.aggregate( [ { $match: { title: "Centennial" } }, { $addFields: { genres: { $concatArrays: [ "$genres", [ "Epic" ] ] } } }] )
[ { _id: ..., title: 'Centennial', genres: [ 'Action', 'Adventure', 'Drama', 'Epic' ] }]...

$$REMOVE 変数で $addFields を使用すると、ドキュメント フィールドを削除できます。

次の操作では、$addFields を使用して、$$REMOVE 変数を持つ plotフィールドを削除します。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { plot: "$$REMOVE" } }] )
[ { _id: ..., title: 'Baseball', runtime: 1140 }, { _id: ..., title: 'Centennial', runtime: 1256 }]...

$$REMOVE を使用して条件付きでフィールドを削除することもできます。たとえば、次の集計では、rated が null であるドキュメントから rated フィールドが削除されます。

db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $addFields: { rated: { $ifNull: [ "$rated", "$$REMOVE" ] } } }] )
[ { _id: ..., title: 'Baseball', rated: 'TV-PG' }, { _id: ..., title: 'Centennial' }]...

Tip

$project との比較

ドキュメントフィールドを削除するには、$addFields または $project ステージを使用できます。最適なアプローチは、パイプラインと、元のドキュメントをどれだけ保持するかによって異なります。

$project ステージで $$REMOVE を使用する例については、「条件付きでのフィールドの除外」を参照してください。

関連するパイプラインステージの詳細については、$projectガイドと$setガイドを参照してください。

このページを評価