定義
$setドキュメントに新しいフィールドを追加します。
$setは、入力ドキュメントの既存の全フィールドと、新しく追加されたフィールドを含むドキュメントを出力します。どちらのステージも、入力ドキュメント内の既存のフィールドをすべて明示的に指定し、新しいフィールドを追加する
$projectステージと同等です。
互換性
次の環境でホストされる配置には $set を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$set の形式は次のとおりです。
{ $set: { <newField>: <expression>, ... } }
追加する各フィールドの名前を指定し、その値を集計式空のオブジェクトに設定します。式の詳細については、式を参照してください。
重要
新しいフィールドの名前が既存のフィールド名(_id など)と同じ場合、$set はそのフィールドの既存の値を、指定された式の値で上書きします。
動作
$setは既存のドキュメントに新しいフィールドを追加します。 集計操作には、1 つ以上の$setステージを含めることができます。$setは、集計式または空のオブジェクトに値を設定できるオブジェクトの埋め込みを受け入れます。たとえば、以下のようなネストされたオブジェクトを受け入れられます。{$set: { a: { b: { } } } } 埋め込みドキュメント (配列内のドキュメントを含む) に 1 つまたは複数のフィールドを追加するには、ドット表記を使用します。 例 を参照してください。
$setを使用して既存の配列フィールドに要素を追加するには、$concatArraysを使用します。例を参照してください。
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
2 つの $set ステージを使用します
次の操作では、2 つの$setステージを使用して、出力ドキュメントに 3 つの新しいフィールドを含めます。
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { imdbScoreScaled: { $multiply: [ "$imdb.rating", 10 ] }, runtimeHours: { $floor: { $divide: [ "$runtime", 60 ] } } } }, { $set: { totalScore: { $add: [ "$imdbScoreScaled", "$runtimeHours" ] } } } ] )
[ { _id: ..., title: 'Baseball', runtime: 1140, imdbScoreScaled: 91, runtimeHours: 19, totalScore: 110 }, { _id: ..., title: 'Centennial', runtime: 1256, imdbScoreScaled: 85, runtimeHours: 20, totalScore: 105 } ] ...
埋め込みドキュメントへのフィールドの追加
埋め込みドキュメントに新しいフィールドを追加するには、ドット表記を使用します。
次の集計操作は、埋め込みドキュメントimdb に新しいフィールドnormalizedRating を追加します。
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { "imdb.normalizedRating": { $multiply: [ "$imdb.rating", 10 ] } } } ] )
[ { _id: ..., title: 'Baseball', imdb: { '...': '...', normalizedRating: 91 } }, { _id: ..., title: 'Centennial', imdb: { '...': '...', normalizedRating: 85 } } ] ...
既存のフィールドの上書き
$set操作で既存のフィールド名を指定すると、元のフィールドが置き換えられます。
次の$set操作はratedフィールドを上書きします。
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { rated: "UNRATED" } } ] )
[ { _id: ..., title: 'Baseball', rated: 'UNRATED' } ] ...
あるフィールドを別のフィールドで置き換えることができます。次の例では、titleフィールドが_idフィールドの代わりに を使用します。
次の集計操作では、$set を使用して各ドキュメントの _idフィールドをtitleフィールドの値に置き換え、titleフィールドをstring "movie" に置き換えます。
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { _id: "$title", title: "movie" } } ] )
[ { _id: 'Baseball', title: 'movie' }, { _id: 'Centennial', title: 'movie' } ] ...
配列への要素の追加
$set$concatArraysと$set 式を併用して、既存の配列フィールドに要素を追加できます。次の操作では、 を使用して、genres genresフィールドを、新しいジャンル を含む別の配列に連結された現在の[ "Classic" ] 配列である新しい配列に置き換えます。
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { genres: { $concatArrays: [ "$genres", [ "Classic" ] ] } } } ] )
[ { _id: ..., title: 'Baseball', genres: [ 'Documentary', 'History', 'Sport', 'Classic' ] } ] ...
既存のフィールドを使用した新しいフィールドの作成
次の集計操作では、映画タイトルと公開年を連結する各ドキュメントに新しいフィールドtitleWithYear が追加されます。
db.movies.aggregate( [ { $match: { runtime: { $gt: 1000 } } }, { $set: { titleWithYear: { $concat: [ "$title", " (", { $toString: "$year" }, ")" ] } } } ] )
[ { _id: ..., title: 'Baseball', titleWithYear: 'Baseball (1994)' }, { _id: ..., title: 'Centennial', titleWithYear: 'Centennial (1978)' } ] ...
このページのC#の例では、Atlasサンプルデータセット の sample_mflixデータベースを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 MongoDB .NET/ C#ドライバーのドキュメントの「 開始 」を参照してください。
次の Movie クラスは、sample_mflix.movies コレクション内のドキュメントをモデル化します。
[] public class Movie { [] public ObjectId Id { get; set; } [] public string Title { get; set; } = null!; [] public int? Year { get; set; } [] public int? Runtime { get; set; } [] public string? Rated { get; set; } [] public int Metacritic { get; set; } [] public string? Plot { get; set; } [] public string? Type { get; set; } [] public string[]? Cast { get; set; } [] public string[]? Directors { get; set; } [] public string[]? Writers { get; set; } [] public ImdbData? Imdb { get; set; } }
MongoDB .NET/ C#ドライバーを使用して$set ステージを集計パイプラインに追加するには、 PipelineDefinitionオブジェクトで Set() メソッドを呼び出します。
次の例では、タイトルが "The Godfather" の Movie ドキュメントに一致し、その Rated フィールドを "UNRATED" に設定するパイプライン ステージを作成します。
var pipeline = new EmptyPipelineDefinition<Movie>() .Match(Builders<Movie>.Filter.Eq(m => m.Title, "The Godfather")) .Set(Builders<Movie>.SetFields.Set(m => m.Rated, "UNRATED"));
{ "_id" : "...", "title" : "The Godfather", "runtime" : 175, "rated" : "UNRATED", "metacritic" : 100 }
このページのNode.js の例では、Atlasサンプルデータセット の sample_mflixデータベースを使用します。無料のMongoDB Atlas cluster を作成し、サンプルデータセットをロードする方法については、 MongoDB Node.jsドライバーのドキュメントの開始を参照してください。
MongoDB Node.jsドライバーを使用して $set ステージを集計パイプラインに追加するには、パイプラインオブジェクトで $set 演算子を使用します。
次の例では、各 movie ドキュメントの lastupdated フィールドの値を Date オブジェクトの値に設定するパイプラインステージを作成します。次に、この例は集計パイプラインを実行します。
const pipeline = [{ $set: { lastupdated: new Date() } }]; const cursor = collection.aggregate(pipeline); return cursor;
詳細
関連するパイプラインステージの詳細については、$addFieldsガイドを参照してください。