MongoDBでカーソルの値を取得する方法|hasNext()とnext()の使い方を解説
MongoDBでクエリを実行すると、結果は「カーソル」と呼ばれるオブジェクトとして返されます。このカーソルからドキュメント(値)を1件ずつ取り出すには、hasNext() メソッドと next() メソッドを組み合わせて使用します。
本記事では、実際にコレクションを作成しながら、カーソルの値を取得する具体的な手順をわかりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。以下では insertOne() メソッドを使って、4件の従業員データを demo191 コレクションに登録しています。
> db.demo191.insertOne({"EmployeeId":1,"EmployeeName":"Chris Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad95303d395bdc21346c5")
}
> db.demo191.insertOne({"EmployeeId":2,"EmployeeName":"David Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad95f03d395bdc21346c6")
}
> db.demo191.insertOne({"EmployeeId":1,"EmployeeName":"John Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad96803d395bdc21346c7")
}
> db.demo191.insertOne({"EmployeeId":1,"EmployeeName":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad97003d395bdc21346c8")
}find()メソッドで全ドキュメントを表示する
作成したコレクション内のすべてのドキュメントを確認するには、find() メソッドを使用します。
> db.demo191.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e3ad95303d395bdc21346c5"), "EmployeeId" : 1, "EmployeeName" : "Chris Brown" }
{ "_id" : ObjectId("5e3ad95f03d395bdc21346c6"), "EmployeeId" : 2, "EmployeeName" : "David Miller" }
{ "_id" : ObjectId("5e3ad96803d395bdc21346c7"), "EmployeeId" : 1, "EmployeeName" : "John Doe" }
{ "_id" : ObjectId("5e3ad97003d395bdc21346c8"), "EmployeeId" : 1, "EmployeeName" : "John Smith" }hasNext()とnext()でカーソルの値を取得する
それでは本題です。カーソルオブジェクトから値を取得するには、まず条件に合致するドキュメントを変数に格納し、その後 while ループ内で hasNext() を使って次のドキュメントが存在するかを判定します。存在する場合は next() でドキュメントを取り出し、tojson() で整形して表示します。
> var cursor = db.demo191.find( { "EmployeeId":1 } );
> while (cursor.hasNext()) {
... print(tojson(cursor.next()));
...}このクエリでは EmployeeId が「1」のドキュメントのみを抽出しています。実行結果は以下の通りです。
{
"_id" : ObjectId("5e3ad95303d395bdc21346c5"),
"EmployeeId" : 1,
"EmployeeName" : "Chris Brown"
}
{
"_id" : ObjectId("5e3ad96803d395bdc21346c7"),
"EmployeeId" : 1,
"EmployeeName" : "John Doe"
}
{
"_id" : ObjectId("5e3ad97003d395bdc21346c8"),
"EmployeeId" : 1,
"EmployeeName" : "John Smith"
}ポイントまとめ
- hasNext():カーソルにまだ未読のドキュメントが残っているかどうかを真偽値(true/false)で返します。
- next():カーソルが現在指している次のドキュメントを1件返します。
- tojson():ドキュメントを見やすいJSON形式に整形して出力します。
このように、hasNext() を条件としたループ処理と next() を組み合わせることで、MongoDBのカーソルから効率的にドキュメントを1件ずつ取得できます。大量のデータを扱う場合にも、メモリを圧迫せずに逐次処理できるのがカーソル操作の大きなメリットです。
-
MongoDBでカーソルの反復回数をカウントする方法を解説
MongoDBでカーソルの反復をカウントするには?MongoDBにおいて、whileループとfind()メソッドが返すカーソルを組み合わせた独自のロジックを実装することで、カーソルの反復回数(特定の条件に一致するドキュメント数)をカウントできます。本記事では、実際のコード例を通じて、その具体的な手順をわかりやすく解説します。1. ドキュメントを含むコレクションを作成するまず、サンプル用のドキュメントを挿入してコレクションを作成します。> db.demo724.insertOne( ... { ... details: ... { ...
-
MongoDBでグループごとの最大値を取得する方法($sortと$groupの活用)
MongoDBで、重複している個別の要素(グループ)ごとに最大値を取得したい場合、aggregate()メソッドと$sort・$groupステージを組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここではdemo750というコレクションに、idとvalueフィールドを持つドキュメントを挿入します。> db.demo750.insertOne({id:101,value:50}); { acknowledged : true, inserted