定義
$setドキュメントに新しいフィールドを追加します。
$setは、入力ドキュメントの既存の全フィールドと新しいフィールドを含むドキュメントを出力します。$setステージは$addFieldsのエイリアスです。どちらのステージも、入力ドキュメント内の既存のフィールドをすべて明示的に指定し、新しいフィールドを追加する
$projectステージと同等です。
互換性
次の環境でホストされる配置には $set を使用できます。
- MongoDB Atlas はクラウドでのMongoDB配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$set の形式は次のとおりです。
{ $set: { <newField>: <expression>, ... } }
追加する各フィールドの名前を指定し、その値を集計式または空のオブジェクトに設定します。
重要
新しいフィールド名が既存のフィールド名(_idなど)と一致する場合、$set はそのフィールドの値を指定された式で上書きします。
動作
$set既存のドキュメントに新しいフィールドを追加します。集計操作には 1 つ以上の$setステージを含めることができます。$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 } ] ...
- 第 1 ステージ(
$set): - 最初の
$setステージでは、2 つのフィールドが追加されます。imdbScoreScaledは IMDB 評価に10を乗じ、runtimeHoursは実行時間を60で分割し、最も近い整数に切り捨てられます。 - 第 2 ステージ(
$set): - 2 番目の
$setステージではtotalScoreが追加されます。これにより、前のステージで計算されたimdbScoreScaledとruntimeHoursが合計されます。
埋め込みドキュメントへのフィールドの追加
埋め込みドキュメントに新しいフィールドを追加するには、ドット表記を使用します。
次の集計操作は、埋め込みドキュメント 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操作は、ratedフィールドを上書きします。
db.movies.aggregate( [ { $match: { title: "Baseball" } }, { $set: { rated: "UNRATED" } } ] )
[ { _id: ..., title: 'Baseball', rated: 'UNRATED' } ] ...
あるフィールドを別のフィールドで置き換えることができます。次の操作では、_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' } ] ...
配列への要素の追加
既存の配列フィールドに要素を追加するには、 と$concatArrays を併用します。次の操作では、 フィールドを、現在の$setgenres 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オブジェクトで UnionWith() メソッドを呼び出します。
次の例では、タイトルが "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"));
このページのNode.jssample_mflix の例では、Atlasサンプルデータセットの データベースを使用します。無料の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 を参照してください。