$setField (名前によるフィールド設定)
最終更新:2026-10-09
$setField (名前によるフィールド設定)
$setField はドキュメントに名前付きフィールドを追加・更新し、入力は変更せず新しいドキュメントを返します。構文は { $setField: { field: フィールド名, input: ドキュメント, value: 式 } } で、field には動的な式を指定できます。value が null の場合はフィールドが削除されます。特殊文字を含むフィールド名や、動的に計算する必要があるフィールド名で使われます。null または欠落の入力は null を返します。$set ステージと違い、$setField は入れ子の式の中で動作し、動的なフィールド名をサポートします。
| カテゴリ | リテラル・変数・オブジェクト |
|---|---|
| MongoDB バージョン | 5.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $setField: { field: <field-name>, input: <document-expression>, value: <expression> } }
⚙️ パラメータ
| field | 文字列としてのフィールド名、または文字列に解決される式。 |
|---|---|
| input | 対象ドキュメント。入力が null または欠落している場合は null になります。 |
| value | 設定する値。null の場合はフィールドを削除します。 |
戻り値:フィールドを設定した新しいドキュメント。入力が null または欠落している場合は null
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $setField: 各注文に税率フィールドを追加
db.orders.aggregate([
{ $project: {
doc: { $setField: { field: 'taxRate', input: '$$CURRENT', value: 0.08 } }
} }
])
出力:
{ '_id': 1, 'doc': { '_id': 1, 'price': 100, 'taxRate': 0.08 } }
{ '_id': 2, 'doc': { '_id': 2, 'price': 50, 'taxRate': 0.08 } }
📌 注意事項
- 新しいドキュメントを返し、入力は変更されない
- value が null だとフィールドが削除される
- 動的なフィールド名には $getField と組み合わせる
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$setField は元のドキュメントを変更しますか?
Aいいえ — パイプライン内のドキュメントは変更されません。$setField は新しいドキュメントを返します。
Qフィールドを削除するには?
Avalue に null を設定すると、フィールドが削除されます。
Q$setField と $set ステージの違いは?
A$set は静的なフィールド名だけを扱います。$setField は動的な名前と入れ子の式に対応します。