【MongoDB】findOneAndUpdate()メソッドで単一ドキュメントを更新する方法
findOneAndUpdate()メソッドとは
MongoDBのfindOneAndUpdate()は、条件に一致する1つのドキュメントだけを更新したい場合に使用するメソッドです。updateOne()と似ていますが、findOneAndUpdate()は更新対象となったドキュメントそのものを戻り値として返す点が大きな特徴です。本記事では、実際のコード例を通じてその使い方を解説します。
準備:コレクションの作成とドキュメントの挿入
まず、insertOne()メソッドを使って、サンプル用コレクション「demo349」に複数のドキュメントを挿入します。
db.demo349.insertOne({"Name":"Chris","Marks":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e55384af8647eb59e5620b4")
}
db.demo349.insertOne({"Name":"David","Marks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e553853f8647eb59e5620b5")
}
db.demo349.insertOne({"Name":"Chris","Marks":89});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e55385af8647eb59e5620b6")
}
db.demo349.insertOne({"Name":"David","Marks":54});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e55385ff8647eb59e5620b7")
}挿入したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo349.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 78 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }findOneAndUpdate()でドキュメントを更新する
それでは、findOneAndUpdate()を使った更新クエリを見ていきましょう。ここでは「Name」フィールドが「David」と一致する最初のドキュメントを検索し、$inc演算子で「Marks」フィールドの値を10増やします。
> db.demo349.findOneAndUpdate({ "Name" : "David" },{$inc:{Marks:10}});
{
"_id" : ObjectId("5e553853f8647eb59e5620b5"),
"Name" : "David",
"Marks" : 78
}出力を見ると、更新対象として選ばれたのは「Marks」が78だったドキュメント(_id: 5e553853...)であることがわかります。なお、findOneAndUpdate()はデフォルトでは更新前の値を返すため、表示されているMarksは78のままになっています。
更新後のコレクション全体を確認する
もう一度find()メソッドですべてのドキュメントを表示し、更新結果を確認してみましょう。
> db.demo349.find();
実行結果は以下の通りです。
{ "_id" : ObjectId("5e55384af8647eb59e5620b4"), "Name" : "Chris", "Marks" : 56 }
{ "_id" : ObjectId("5e553853f8647eb59e5620b5"), "Name" : "David", "Marks" : 88 }
{ "_id" : ObjectId("5e55385af8647eb59e5620b6"), "Name" : "Chris", "Marks" : 89 }
{ "_id" : ObjectId("5e55385ff8647eb59e5620b7"), "Name" : "David", "Marks" : 54 }ご覧のように、「David」という名前のドキュメントが2つ存在しているにもかかわらず、更新されたのは条件に一致した最初の1件だけです。具体的には、_idが「5e553853...」のドキュメントのMarksだけが78から88に増加し、もう一方の「Marks: 54」のドキュメントは変更されていません。これがfindOneAndUpdate()の「単一ドキュメントのみ更新する」という動作です。
まとめ
findOneAndUpdate()は、クエリ条件に一致する最初の1件のみを更新し、そのドキュメントを返す便利なメソッドです。更新後の値を受け取りたい場合は、第3引数のオプションで{ returnDocument: "after" }を指定すれば、更新後のドキュメントを取得することもできます。アトミックな更新処理や、更新結果を即座に利用したい場面でぜひ活用してください。
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...
-
MongoDBのドキュメントの最大サイズはどれくらい?16MB制限の基本を解説
MongoDBのドキュメントとはMongoDBにおける「ドキュメント」とは、コレクション内に格納される1件のレコードのことです。ドキュメントはJSONに似たBSON形式で表現され、波括弧({})で囲まれたデータ構造を持ちます。重要なポイントとして、各ドキュメントには16MBというサイズ上限が設けられています。この制限を超えるサイズのドキュメントを挿入しようとすると、エラーが発生します。なお、画像や動画などの大きなバイナリデータを扱いたい場合は、GridFSという仕組みを利用することで、16MBを超えるデータも保存可能です。ドキュメントを含むコレクションを作成するそれでは、実際にinsertOn