MongoDBのfindOneAndUpdate()メソッドでドキュメントを更新する方法
MongoDBには、条件に一致する単一のドキュメントを検索して更新するための便利なメソッドとしてfindOneAndUpdate()が用意されています。このメソッドは、指定したフィルター(検索条件)とソート基準に基づいて、コレクション内の1つのドキュメントを更新します。
findOneAndUpdate()の基本構文
db.collection.findOneAndUpdate(filter, update, options)
- filter:更新対象のドキュメントを特定するための検索条件
- update:適用する更新操作($inc、$setなど)
- options:任意のオプション(sort、returnDocumentなど)
デフォルトでは、このメソッドは更新前のドキュメントを返します。更新後のドキュメントを取得したい場合は、{ returnDocument: "after" }オプションを指定します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo328.insertOne({Name:"Chris",Marks:67});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516b19f8647eb59e56207a")
}
> db.demo328.insertOne({Name:"David",Marks:78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516b24f8647eb59e56207b")
}
> db.demo328.insertOne({Name:"Bob",Marks:97});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516b2bf8647eb59e56207c")
}コレクション内の全ドキュメントを表示
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo328.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e516b19f8647eb59e56207a"), "Name" : "Chris", "Marks" : 67 }
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 78 }
{ "_id" : ObjectId("5e516b2bf8647eb59e56207c"), "Name" : "Bob", "Marks" : 97 }findOneAndUpdate()でドキュメントを更新する
次に、findOneAndUpdate()を使ってドキュメントを更新するクエリを見てみましょう。ここでは、特定のドキュメント(Nameが「David」)のMarksフィールドの値を10だけ増加させます。
> db.demo328.findOneAndUpdate({Name:"David"},{ $inc: { "Marks" : 10} });
{
"_id" : ObjectId("5e516b24f8647eb59e56207b"),
"Name" : "David",
"Marks" : 78
}出力結果に注目してください。返されているのは更新前の値(Marks: 78)であることがわかります。これはfindOneAndUpdate()のデフォルトの動作です。
更新後のデータを確認
再度find()メソッドで全ドキュメントを表示し、更新が正しく反映されたか確認します。
> db.demo328.find();
実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e516b19f8647eb59e56207a"), "Name" : "Chris", "Marks" : 67 }
{ "_id" : ObjectId("5e516b24f8647eb59e56207b"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e516b2bf8647eb59e56207c"), "Name" : "Bob", "Marks" : 97 }DavidのMarksフィールドが78から88に更新されていることが確認できます。$inc演算子により、既存の値に対して10が加算されました。
まとめ
findOneAndUpdate()は、フィルター条件に一致する1つのドキュメントを原子的(アトミック)に更新できる強力なメソッドです。検索と更新を1回の操作で行えるため、複数の操作間で競合が発生するリスクを減らせます。デフォルトでは更新前のドキュメントを返す点に注意し、必要に応じてreturnDocumentオプションを活用するとよいでしょう。
-
MongoDBのアグリゲーションで$redact演算子を使う方法
$redact演算子とはMongoDBの$redactステージは、ドキュメント自体に格納されている情報に基づいて、各ドキュメントの内容を制限(フィルタリング)するための機能です。アグリゲーションフレームワークでは、$cond演算子を$redactと組み合わせることで、条件に応じてドキュメントを保持($$KEEP)するか除外($$PRUNE)するかを柔軟に制御できます。ここでは、実際のコード例を通して、$redactの基本的な使い方を見ていきましょう。サンプルコレクションの作成まず、insertOne()メソッドを使って、複数のドキュメントを含むコレクションを作成します。> db.demo
-
MongoDBのupdateOne()とinsertOne()の違いと使い方を実例で解説
MongoDBには、コレクションへのドキュメント追加や更新を行うための便利なメソッドが多数用意されています。本記事では、その中でも特によく使われる insertOne() と updateOne() の役割の違いと具体的な使い方を、実際のコード例とともにわかりやすく解説します。insertOne():コレクションに新しいドキュメントを1件挿入するメソッドです。updateOne():クエリフィルタ(検索条件)に一致したドキュメントのうち、最初の1件のみを更新するメソッドです。insertOne()でサンプルコレクションを作成するまずは insertOne() を使って、サンプル用のコレクション