このチュートリアルでは、カーソルでドキュメントにアクセスする方法を説明します。
カーソル内のドキュメントにアクセスするには、カーソルを手動で反復処理するか、toArray() メソッドを使用します。
このチュートリアルでは、次の方法について概説します。
mongosh を使用して、デフォルトのtestデータベースを使用して新しいコレクションにドキュメントを挿入します。
| db.users.insertMany( [ |
| { _id: 0, type: "admin", email: "admin@example.com", name: "Admin User" }, |
| { _id: 1, type: "user", email: "user1@example.com", name: "Test User 1" }, |
| { _id: 2, type: "user", email: "user2@example.com", name: "Test User 2" } |
| ] ) |
mongosh では、カーソルをlet キーワードを使用して変数に代入する場合、自動的には繰り返し処理されません。
| let myCursor = db.users.find( { type: "user" } ) |
シェルで cursor 変数を呼び出して、最大 20 回 を反復処理し、一致するドキュメントを出力できます。
| [ |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| }, |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
| ] |
返されたカーソルが let キーワードを使用して変数に割り当てられていない場合、カーソルはバッチ サイズ まで自動的に繰り返し処理され、最初のバッチの結果が出力されます。
| db.users.find( { type: "user" } ) |
| [ |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| }, |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
| ] |
カーソル メソッド next() を使用してドキュメントにアクセスすることもできます。next() は、カーソルが現在指しているドキュメントを返し、カーソルを次のドキュメントに移動します。
| let myCursor = db.users.find( { type: "user" } ) |
|
| myCursor.next() |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| } |
カーソル メソッド hasNext() は true または false を返して、カーソルから返されるドキュメントが他にもあるかどうかを示します。
| let myCursor = db.users.find( { type: "user" } ) |
|
| myCursor.hasNext() |
hasNext() メソッドと next() メソッドを使用して、printjson() ヘルパーを使い、カーソルから残りのすべてのドキュメントを印刷できます。
| let myCursor = db.users.find( { type: "user" } ) |
|
| while ( myCursor.hasNext() ) { |
| printjson( myCursor.next() ) |
| } |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| } |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
同様に、カーソル内の各ドキュメントに対して forEach() カーソル メソッドを使用し、printjson() などのヘルパーを適用することができます。
| let myCursor = db.users.find( { type: "user" } ) |
|
| myCursor.forEach( myDocument => printjson(myDocument) ) |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| } |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
mongosh 2.1.0 から、また、for-of ループを使用してカーソルを反復処理することもできます。次の例では、前の例と同じ結果が返されます。
| let myCursor = db.users.find( { type: "user" } ) |
|
| for ( let myDocument of myCursor ) { |
| printjson( myDocument ) |
| } |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| } |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
カーソル メソッドの詳細については、「 JavaScript カーソル メソッド」およびドライバーのドキュメントを参照してください。
mongosh では、toArray() メソッドを使用してカーソルが反復処理され、ドキュメントが配列で返されます。
| let myCursor = db.users.find( { type: "user" } ) |
|
| let documentArray = myCursor.toArray() |
|
| documentArray |
| [ |
| { |
| _id: 1, |
| type: 'user', |
| email: 'user1@example.com', |
| name: 'Test User 1' |
| }, |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
| ] |
結果のドキュメント配列には、従来の配列としてアクセスすることができます。
| let myCursor = db.users.find( { type: "user" } ) |
|
| let documentArray = myCursor.toArray() |
|
| documentArray[1] |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |
toArray() メソッドは、カーソルによって返されるすべてのドキュメントを RAM に読み込み、カーソルを使い切ります。
一部のドライバーでは、カーソルのインデックス(つまり、cursor[index])を使用してドキュメントにアクセスできます。これは、最初に toArray() メソッドを呼び出し、次に結果の配列のインデックスを使用するショートカットです。
| let myCursor = db.users.find( { type: "user" } ) |
|
| myCursor.toArray() [1] |
| { |
| _id: 2, |
| type: 'user', |
| email: 'user2@example.com', |
| name: 'Test User 2' |
| } |