findOneAndUpdate() (更新してドキュメントを返す)
最終更新:2026-10-09
findOneAndUpdate() (更新してドキュメントを返す)
findOneAndUpdate() はフィルタに一致する最初のドキュメントを更新し、そのドキュメント自体を返します。更新前か更新後かは `returnDocument`: 'before'(デフォルト)または 'after' で制御します。例: `db.users.findOneAndUpdate({ name: 'Alice' }, { $set: { age: 22 } }, { returnDocument: 'after' })`。カウンタのみを返す updateOne() と異なり、ドキュメントを読み戻すため、カウンタやステートマシン遷移など、更新直後の値を必要とするフローに適しています。
| カテゴリ | 書き込み |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
db.<collection>.findOneAndUpdate(<filter>, <update>, { returnDocument: 'after', upsert: <bool> })
⚙️ パラメータ
| フィルター条件 | 更新対象のドキュメントに一致する述語。 |
|---|---|
| 更新操作 | 更新演算子のオブジェクト(例: {$inc: {count: 1}})。 |
| returnDocument | 任意。'before' は更新前、'after' は更新後のドキュメントを返します。既定は 'before'。 |
| upsert | 任意。マッチしない場合に挿入します。既定は false。 |
戻り値:更新前(または更新後)のドキュメント。何もマッチせず upsert が無効の場合は null。
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// findOneAndUpdate: Alice を更新し、新しいドキュメントを返す
const doc = db.users.findOneAndUpdate(
{ name: 'Alice' }, { $set: { age: 22 } },
{ returnDocument: 'after' }
)
doc
出力:
{
_id: ObjectId('64c8a1b20000000000000001'),
name: 'Alice',
age: 22
}
📌 注意事項
- デフォルトでは更新前のドキュメントを返す。新値を得るには returnDocument: 'after' を設定する
- レガシードライバではこの機能を findAndModify + new オプションで呼ぶ
- updateOne() はカウンタを返す。ドキュメント自体が必要な場合はこのメソッドを使う
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
QfindOneAndUpdate は更新前と更新後のどちらのドキュメントを返しますか?
Aデフォルトでは更新前のドキュメントを返します。更新後を得るには {returnDocument: 'after'} を渡します。
QfindOneAndUpdate と updateOne の違いは何ですか?
AupdateOne() はカウンタのみを返します。findOneAndUpdate() はドキュメントを返すため、旧値または新値が必要な場合に便利です。
Q一致するものが無い場合、findOneAndUpdate は何を返しますか?
Anull を返します(upsert オフの場合)。upsert オンの場合は新しいドキュメントが挿入され、それが返されます。