定義
$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を使用します。例を参照してください。
例
このページの例では、付属の sample_mflixサンプルデータセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「サンプルデータセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
2 つの $addFields ステージを使用します
次の操作では、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' ] } ] ...
removeFields
$$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' } ] ...
このページのNode.js の例では、Atlasサンプルデータセット の sample_mflixデータベースを使用します。無料のMongoDB Atlas cluster を作成し、サンプルデータセットをロードする方法については、 MongoDB Node.jsドライバーのドキュメントの開始を参照してください。
MongoDB Node.jsドライバーを使用して $addFields ステージを集計パイプラインに追加するには、パイプラインオブジェクトで $addFields 演算子を使用します。
次の例では、各映画ドキュメントに totalReviewsフィールドを追加するパイプラインステージを作成します。このフィールドには映画のレビュー総数が含まれます。次に、この例では集計パイプラインを実行します。
const pipeline = [ { $addFields: { totalReviews: { $add: ["$imdb.votes", "$tomatoes.viewer.numReviews"] } } } ]; const cursor = collection.aggregate(pipeline); return cursor;
Tip
$project との比較
ドキュメントフィールドを削除するには、$addFields または $project ステージを使用できます。最適なアプローチは、パイプラインと、元のドキュメントをどれだけ保持するかによって異なります。
$project ステージで $$REMOVE を使用する例については、「条件付きでのフィールドの除外」を参照してください。