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

$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: { } } } }

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

  • $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 ステージでは、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)' }
]
...

関連ステージについては、$addFields を参照してください。

このページを評価