MongoDBで検索条件を指定して最後のドキュメントを更新する方法
MongoDBでは、findAndModify()メソッドを使うことで、検索条件に一致するドキュメントの中から最後の1件を更新できます。この記事では、実際のコード例を通してその手順を詳しく解説します。
コレクションの作成とドキュメントの挿入
まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。
> db.demo516.insertOne({"Name":"John","Age":22,"Score":56});{
"acknowledged" : true,
"insertedId" : ObjectId("5e889fdb987b6e0e9d18f591")
}
> db.demo516.insertOne({"Name":"John","Age":23,"Score":67});{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ff1987b6e0e9d18f592")
}
> db.demo516.insertOne({"Name":"John","Age":22,"Score":56});{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ff3987b6e0e9d18f593")
}
> db.demo516.insertOne({"Name":"John","Age":22,"Score":66});{
"acknowledged" : true,
"insertedId" : ObjectId("5e889ffa987b6e0e9d18f594")
}find()メソッドで全ドキュメントを表示
挿入したデータを確認するために、find()メソッドでコレクション内のすべてのドキュメントを表示します。
> db.demo516.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 66 }findAndModify()で最後のドキュメントを更新する
ここからが本題です。MongoDBで検索条件に一致する最後の行(ドキュメント)を更新するには、findAndModify()を使用します。ポイントは以下の4つです。
- query:更新対象を絞り込む検索条件を指定します
- sort:
{_id: -1}と指定することで、新しい順に並べ替え、最新のドキュメントを先頭にします - update:適用する更新内容を指定します(ここでは
$set演算子でScoreを変更) - new: true:更新後のドキュメントを返すように設定します
具体的なクエリは次のとおりです。
> db.demo516.findAndModify({
... query: {Name: "John", Age: 22},
... sort: {_id: -1},
... update: {$set: {Score: 98}},
... new: true
... })
{
"_id" : ObjectId("5e889ffa987b6e0e9d18f594"),
"Name" : "John",
"Age" : 22,
"Score" : 98
}この例では、「NameがJohnかつAgeが22」という条件に一致するドキュメントのうち、_idが最も大きい(=最後に挿入された)ドキュメントが選択され、Scoreが98に更新されました。戻り値として更新後のドキュメントが返されている点にも注目してください。
更新結果の確認
再度find()メソッドを実行して、コレクション全体を確認してみましょう。
> db.demo516.find();
出力は以下のようになります。
{ "_id" : ObjectId("5e889fdb987b6e0e9d18f591"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ff1987b6e0e9d18f592"), "Name" : "John", "Age" : 23, "Score" : 67 }
{ "_id" : ObjectId("5e889ff3987b6e0e9d18f593"), "Name" : "John", "Age" : 22, "Score" : 56 }
{ "_id" : ObjectId("5e889ffa987b6e0e9d18f594"), "Name" : "John", "Age" : 22, "Score" : 98 }ご覧のとおり、条件に一致した複数のドキュメントのうち、最後の1件(ObjectId「5e889ffa987b6e0e9d18f594」)だけが更新されていることがわかります。他のドキュメントは元のScoreのまま変更されていません。
まとめ
MongoDBで検索条件に一致する最後のドキュメントのみを更新したい場合は、findAndModify()にquery・sort・update・newの各オプションを組み合わせるのが効果的です。特にsort: {_id: -1}を指定することで、最新のドキュメントを確実に対象にできるのが大きな特徴です。なお、MongoDB 4.2以降では同様の操作をfindOneAndUpdate()でも実現できるため、用途に応じて使い分けるとよいでしょう。
-
MongoDBで特定の文字列を使ってフィールドのすべての値を一括更新する方法
MongoDBでフィールドのすべての値を一括更新する方法MongoDBのコレクション内に存在するすべてのドキュメントの特定フィールドを、同じ文字列でまとめて更新したい場合があります。そのようなときは、update()メソッドにオプション「multi: true」を指定します。この記事では、実際のコマンド例をもとに、手順をわかりやすく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用コレクション「demo720」に複数のドキュメントを挿入します。> db.demo720.insertOne({SubjectName:MySQL}); {
-
MySQLの単一クエリでIDが最も高い行を更新する方法
はい、単一のクエリで実行可能です。まずはサンプル用のテーブルを作成しましょう。mysql> create table DemoTable ( ID int, GameScore int ); Query OK, 0 rows affected (0.55 sec)次に、INSERTコマンドを使用してテーブルにレコードをいくつか挿入します。mysql> insert into DemoTable