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
}

📌 注意事項

さらなる実践ケースを近日公開予定。

📚 関連チュートリアル

❓ よくある質問

QfindOneAndUpdate は更新前と更新後のどちらのドキュメントを返しますか?
Aデフォルトでは更新前のドキュメントを返します。更新後を得るには {returnDocument: 'after'} を渡します。
QfindOneAndUpdate と updateOne の違いは何ですか?
AupdateOne() はカウンタのみを返します。findOneAndUpdate() はドキュメントを返すため、旧値または新値が必要な場合に便利です。
Q一致するものが無い場合、findOneAndUpdate は何を返しますか?
Anull を返します(upsert オフの場合)。upsert オンの場合は新しいドキュメントが挿入され、それが返されます。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%