Docs Menu
Docs Home
/ /

$set(集計ステージ)

注意

曖昧さ回避

次のページでは、集計ステージ $setについて説明しています。 更新演算子 $setについて詳しくは、 $setを参照してください。

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

    {$set: { a: { b: { } } } }

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

  • $set を使用して既存の配列フィールドに要素を追加するには、$concatArrays を使用します。を参照してください。

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

次の操作では、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 ステージでは、IMDB 評価に 10 を掛ける imdbScoreScaled と、ランタイムを 60 で割り、最近の整数に切り捨てる runtimeHours の 2 つのフィールドが追加されます。
第 2 ステージ($set):
2 番目の $set ステージでは、前のステージで計算された imdbScoreScaledruntimeHours を合計する totalScore が追加されます。

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

次の集計操作は、埋め込みドキュメント 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' }
]
...

あるフィールドを別のフィールドで置き換えることができます。次の例では、_id フィールドの代わりに title フィールドを使用します。

次の集計操作では、$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 コレクション内のドキュメントをモデル化します。

[BsonIgnoreExtraElements]
public class Movie
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("title")]
public string Title { get; set; } = null!;
[BsonElement("year")]
public int? Year { get; set; }
[BsonElement("runtime")]
public int? Runtime { get; set; }
[BsonElement("rated")]
public string? Rated { get; set; }
[BsonElement("metacritic")]
public int Metacritic { get; set; }
[BsonElement("plot")]
public string? Plot { get; set; }
[BsonElement("type")]
public string? Type { get; set; }
[BsonElement("cast")]
public string[]? Cast { get; set; }
[BsonElement("directors")]
public string[]? Directors { get; set; }
[BsonElement("writers")]
public string[]? Writers { get; set; }
[BsonElement("imdb")]
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ガイドを参照してください。

戻る

$searchMeta

項目一覧