Docs Menu
Docs Home
/ / /
PHP 라이브러리 매뉴얼
/

커서에서 데이터 액세스

이 페이지의 내용

  • 개요
  • 반복적으로 커서 내용에 액세스
  • 문서 개별 조회
  • 모든 문서 검색
  • 테일 커서(tailable cursor)
  • 추가 정보

이 가이드 에서는 MongoDB PHP 라이브러리를 사용하여 커서 에서 데이터에 액세스 하는 방법을 학습 수 있습니다.

커서 는 읽기 작업의 결과를 반복 가능한 배치로 반환하는 메커니즘입니다. 커서는 모든 문서를 한 번에 반환하는 대신 주어진 시간에 문서의 하위 집합만 보유하여 메모리 소비와 서버 요청 수를 모두 줄입니다.

MongoDB PHP 라이브러리는 MongoDB\Collection::find() 메서드를 사용하여 읽기 작업을 수행할 때마다 MongoDB\Driver\Cursor 인스턴스 에서 일치하는 문서를 반환합니다.

이 가이드 의 예제에서는 Atlas 샘플 데이터 세트sample_restaurants 데이터베이스 에 있는 restaurants 컬렉션 을 사용합니다. PHP 애플리케이션 에서 이 컬렉션 에 액세스 하려면 Atlas cluster 에 연결하는 MongoDB\Client 를 인스턴스화하고 $collection 변수에 다음 값을 할당합니다.

$collection = $client->sample_restaurants->restaurants;

무료 MongoDB Atlas cluster 를 생성하고 샘플 데이터 세트를 로드하는 방법을 학습 보려면 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();

고정 사이즈 고정 사이즈 컬렉션 을 쿼리할 때는 클라이언트 가 커서 의 결과를 모두 사용한 후에도 계속 열려 있는 테일 커서( tailable cursor )를 사용할 수 있습니다. 테일 커서( tailable cursor )를 만들려면 배열 에서 cursorType 옵션을 MongoDB\Operation\Find::TAILABLE (으)로 설정하다 합니다. 그런 다음 배열 을 MongoDB\Collection::find() 메서드에 옵션 매개변수로 전달합니다.

예를 예시, 다음 코드와 같이 야채를 나타내는 문서를 저장하는 vegetables 이라는 고정 사이즈 컬렉션 을 만들 수 있습니다.

$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 cursor )를 사용하여 vegetables 컬렉션 의 모든 문서를 조회 합니다. 커서 가 모두 소진되면 세 개의 문서를 검색할 때까지 커서가 열린 상태로 유지됩니다.

$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 cursor)에 학습 보려면 MongoDB Server 매뉴얼에서 테일 커서 (tailable cursor)를 참조하세요.

읽기 작업에 학습 보려면 데이터 조회 가이드 를 참조하세요.

커서에 학습 보려면 확장 API 문서의 다음 페이지를 참조하세요.

find() 메서드에 학습 보려면 MongoDB\Collection::find()에 대한 API 설명서를 참조하세요.

돌아가기

반환할 필드 지정