Docs Menu
Docs Home
/ / /
PHP ライブラリ マニュアル
/

カーソルからデータにアクセスする

項目一覧

  • 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ドキュメントの次のページを参照してください。

find()メソッドの詳細については、 MongoDB\Collection::find()のAPIドキュメントを参照してください。

戻る

返すフィールドを指定する