このチュートリアルでは、カーソルでドキュメントにアクセスする方法を説明します。
カーソル内のドキュメントにアクセスするには、カーソルを手動で反復処理するか、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' |
} |