$setOnInsert (挿入時のみ設定)
最終更新:2026-10-09
$setOnInsert (挿入時のみ設定)
$setOnInsert は、upsert が新しいドキュメントを挿入した場合にのみフィールド値を設定し、既存ドキュメントに一致した場合は無視されます。`{ $setOnInsert: { createdAt: new Date() } }` のように使います。upsert: true と組み合わせると、作成タイムスタンプの記録やデフォルト値の初期化ができます — 作成時のみ設定し、更新時は変更しないセマンティクスです。
| カテゴリ | フィールド更新 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $setOnInsert: { <field>: <value> } }
⚙️ パラメータ
| フィールド | 挿入時のみ設定されるフィールド。 |
|---|---|
| 値 | 初期値(例: 作成時刻)。 |
戻り値:更新結果
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $setOnInsert: createdAt は挿入時のみ設定される
db.users.updateOne(
{ email: 'alice@example.com' },
{
$set: { name: 'Alice' },
$setOnInsert: { createdAt: new Date() }
},
{ upsert: true }
)
出力:
// createdAt は最初の挿入時に記録され、その後の更新では変更されない
📌 注意事項
- upsert が挿入した場合にのみ適用される
- $set と併用すると初期化と更新をそれぞれ分担できる
- createdAt のような不変フィールドに最適
🏷️ 関連タグ
💡 関連ケース
📚 関連チュートリアル
❓ よくある質問
Q$setOnInsert はいつ有効になりますか?
Aupsert が実際に挿入した場合のみです。既存ドキュメントの更新時は無視されます。
Q$setOnInsert と $set は併用できますか?
Aはい。$set は毎回適用され、$setOnInsert は挿入時のみ適用されます。
Qupsert: true は必須ですか?
Aはい。なければ純粋な更新では発動しません。