MongoDBで更新されたドキュメントの数を取得する方法
MongoDBで更新操作を実行した際に、実際に何件のドキュメントが更新されたのかを確認したいケースはよくあります。そのような場合は、runCommandとgetlasterrorを組み合わせて使用することで、更新されたドキュメントの件数を取得できます。
手順1:テスト用のコレクションとドキュメントを作成する
まず、insertOne()メソッドを使って、サンプル用のコレクションに複数のドキュメントを挿入します。
> db.getNumberOfUpdatedDocumentsDemo.insertOne({"StudentName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca28c1d6304881c5ce84bad")
}
> db.getNumberOfUpdatedDocumentsDemo.insertOne({"StudentName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca28c226304881c5ce84bae")
}
> db.getNumberOfUpdatedDocumentsDemo.insertOne({"StudentName":"Robert"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca28c276304881c5ce84baf")
}
> db.getNumberOfUpdatedDocumentsDemo.insertOne({"StudentName":"Ramit"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca28c366304881c5ce84bb0")
}
> db.getNumberOfUpdatedDocumentsDemo.insertOne({"StudentName":"Adam"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca28c436304881c5ce84bb1")
}
手順2:登録されたドキュメントを確認する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.getNumberOfUpdatedDocumentsDemo.find().pretty();
実行すると、以下のように5件のドキュメントが出力されます。
{ "_id" : ObjectId("5ca28c1d6304881c5ce84bad"), "StudentName" : "David" }
{ "_id" : ObjectId("5ca28c226304881c5ce84bae"), "StudentName" : "Chris" }
{ "_id" : ObjectId("5ca28c276304881c5ce84baf"), "StudentName" : "Robert" }
{ "_id" : ObjectId("5ca28c366304881c5ce84bb0"), "StudentName" : "Ramit" }
{ "_id" : ObjectId("5ca28c436304881c5ce84bb1"), "StudentName" : "Adam" }
手順3:ドキュメントを一括更新する
次に、update()メソッドを使ってすべてのドキュメントを更新します。第4引数にtrueを指定することで(multiオプション)、条件に一致したすべてのドキュメントが更新対象になります。
> db.getNumberOfUpdatedDocumentsDemo.update({}, {$set : {"StudentName" : "Carol"}}, true, true);
WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 5 })
Now, get the number of updated documents:
> db.runCommand( "getlasterror" );
続けてdb.runCommand( "getlasterror" )を実行すると、直前の操作の結果情報が取得できます。
手順4:更新されたドキュメントの数を確認する
getlasterrorの実行結果では、nフィールドに更新されたドキュメントの件数が格納されています。この例では n : 5 となっており、5件のドキュメントが更新されたことを示しています。
{
"connectionId" : 4,
"updatedExisting" : true,
"n" : 5,
"syncMillis" : 0,
"writtenTo" : null,
"err" : null,
"ok" : 1
}
主なフィールドの意味は次のとおりです。
- n: 更新(または一致)されたドキュメントの総件数
- updatedExisting: 既存のドキュメントが更新されたかどうか
- err: エラーが発生した場合にその内容が格納される
- ok: コマンド自体の実行が成功したかどうか
手順5:更新後のデータを確認する
最後に、再度find()メソッドを実行して、すべてのドキュメントが正しく更新されているかを確認しましょう。
> db.getNumberOfUpdatedDocumentsDemo.find().pretty();
出力を見ると、5件すべてのStudentNameが「Carol」に変更されていることがわかります。
{ "_id" : ObjectId("5ca28c1d6304881c5ce84bad"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5ca28c226304881c5ce84bae"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5ca28c276304881c5ce84baf"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5ca28c366304881c5ce84bb0"), "StudentName" : "Carol" }
{ "_id" : ObjectId("5ca28c436304881c5ce84bb1"), "StudentName" : "Carol" }
まとめ
MongoDBで更新されたドキュメントの数を取得するには、更新処理の直後にdb.runCommand( "getlasterror" )を実行し、返却結果のnフィールドを参照します。なお、モダンなドライバやMongoDBの新しいバージョンでは、updateMany()などの戻り値であるWriteResultオブジェクトからも同様にnModified(実際に変更が加えられた件数)を確認できるため、用途に応じて使い分けるとよいでしょう。
-
MongoDBでレコード数(ドキュメント数)を取得する方法
MongoDBでコレクション内のレコード数(ドキュメント数)を取得するには、count()メソッドを使用します。この記事では、実際にコレクションを作成し、レコード数を取得する手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成しましょう。> db.demo697.insertOne({Name:Chris,Age:21}); { acknowledged : true, insertedId : ObjectId(5ea6d7d1551299a9f98c9395) } > db.demo
-
MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法
MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...