カーソルからデータにアクセスする
Overview
このガイドでは、 MongoDB PHPライブラリを使用して、カーソルからデータにアクセスする方法を学習できます。
カーソルは、読み取り操作の結果を反復可能なバッチで返すメカニズムです。 カーソルは、すべてのドキュメントを一度に返すのではなく、常にドキュメントのサブセットのみを保持することで、メモリ消費とサーバーリクエスト数の両方を削減します。
MongoDB PHPライブラリが MongoDB\Collection::find()
メソッドを使用して読み取り操作を実行するたびに、 MongoDB\Driver\Cursor
インスタンスに一致するドキュメントが返されます。
サンプル データ
このガイドの例では、 Atlasサンプルデータセットのsample_restaurants
データベースのrestaurants
コレクションを使用します。 PHPアプリケーションからこのコレクションにアクセスするには、Atlas クラスターに接続するMongoDB\Client
をインスタンス化し、 $collection
変数に次の値を割り当てます。
$collection = $client->sample_restaurants->restaurants;
MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 「Atlas を使い始める」ガイドを参照してください。
カーソルの内容に反復的にアクセスする
MongoDB\Driver\Cursor
クラスはIterator
インターフェースを実装しているため、 foreach
ループを使用してその内容を反復処理できます。
次の例では、 MongoDB\Collection::find()
メソッドを使用して、 name
フィールドの値が'Dunkin' Donuts'
であるすべてのドキュメントを取得します。 次に、 find()
メソッドによって返されたカーソルから各ドキュメントを出力します。
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); foreach ($cursor as $doc) { echo json_encode($doc), PHP_EOL; }
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40363098"} {"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40395071"} ...
ドキュメントを個別に検索する
カーソルから個々のドキュメントを検索するには、 MongoDB\Driver\Cursor
インスタンスでcurrent()
メソッドを呼び出します。 このメソッドは、カーソルが最初に指したドキュメントを返します。 next()
メソッドを呼び出すことで、カーソルを続行できます。このメソッドは、次に検索されたドキュメントを点ようにカーソルに指示します。
次の例では、 name
の フィールド値が'Dunkin' Donuts'
であるすべてのドキュメントを検索します。 次に、カーソルでcurrent()
メソッドを呼び出して、最初に検索されたドキュメントを出力します。
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $cursor->rewind(); echo json_encode($cursor->current());
{"_id":{"$oid":"..."},..."name":"Dunkin' Donuts","restaurant_id":"40379573"}
すべてのドキュメントを検索する
警告
クエリによって返されたドキュメントの数とサイズが利用可能なアプリケーション メモリを超えると、プログラムはクラッシュします。 大規模な結果セットが予想される場合は、カーソルに反復的にアクセスしてください。
カーソルからすべてのドキュメントを検索するには、次のいずれかの方法を使用してカーソルを配列に変換します。
MongoDB\\Driver\\Cursor::toArray()
:MongoDB\Driver\Cursor
オブジェクトで を呼び出すiterator_to_array()
:MongoDB\Driver\Cursor
オブジェクトをパラメーターとして渡す
次の例では、カーソルでtoArray()
メソッドを呼び出し、その結果を配列に保存します。
$cursor = $collection->find(['name' => 'Dunkin\' Donuts']); $array_results = $cursor->toArray();
テール可能カーソル
CappedCappedコレクションをクエリする場合、クライアントがカーソルの結果を使い果たした後も開いたままになる 追尾可能 ( 追尾可能 (tailable) カーソルを使用できます。 追尾可能 ( 追尾可能 (tailable) カーソルを作成するには、 cursorType
オプションを配列でMongoDB\Operation\Find::TAILABLE
に設定します。 次に、その配列をオプション パラメーターとしてMongoDB\Collection::find()
メソッドに渡します。
例、次のコードに示すように、植物を表すドキュメントを保存するvegetables
というCappedコレクションを作成できます。
$db = $client->db; $create_coll = $db->createCollection( 'vegetables', ['capped' => true, 'size' => 1024 * 1024] ); $vegetables = [ ['name' => 'cauliflower'], ['name' => 'zucchini'] ]; $collection = $db->vegetables; $result = $collection->insertMany($vegetables);
次のコードでは、追尾可能 (tailable) カーソルを使用して、 vegetables
コレクション内のすべてのドキュメントを検索します。 カーソルが使い果たされた後も、次の 3 つのドキュメントを検索するまで開いたままになります。
$cursor = $collection->find([], ['cursorType' => MongoDB\Operation\Find::TAILABLE]); $cursor->rewind(); $docs_found = 0; while ($docs_found < 3) { if ($cursor->valid()) { $doc = $cursor->current(); echo json_encode($doc), PHP_EOL; $docs_found++; } $cursor->next(); }
{"_id":{"$oid":"..."},"name":"cauliflower"} {"_id":{"$oid":"..."},"name":"zucchini"}
vegetables
コレクションに別のドキュメントを挿入すると、上記のコードによって新しいドキュメントが出力され、 while
ループが閉じられます。
追尾可能 (tailable) カーソルの詳細については、 MongoDB Serverマニュアルの「追尾可能(tailable) カーソル 」を参照してください。
詳細情報
読み取り操作の詳細については、 データの取得ガイドを 参照してください。
カーソルの詳細については、 拡張APIドキュメントの次のページを参照してください。
API ドキュメント
find()
メソッドの詳細については、 MongoDB\Collection::find()
のAPIドキュメントを参照してください。