2012-09-24 3 views
2

내 컬렉션에서 n 번째 항목을 검색하려고합니다.
이것은 find()을 사용하여 작동하는 것 같지만 findOne()sort()을 사용하는 더 깨끗한 해결책이 있다고 생각합니까?
는 사람이php mongodb 컬렉션의 n 번째 항목을 찾습니다.

$mongo = new Mongo(); 
$db = $mongo->mydb; 
$collection = $db->user; 

$cursor = $collection->find(); 
$i=0; 
foreach ($cursor as $obj){ 
    if ($i==3) 
     echo $obj["_id"];//echo's the 3rd entry id 
    $i++; 
} 

solution provided here 내가이 질문을 부탁 해요 왜 내 문제에 적용 할 수 없습니다 기쁘게 작성하는 더 좋은 방법으로 도울 수 있습니다. 의

+0

비슷한 질문이 여기에 대답했다 HTTP : // 유래는 정확한 문서를 조회 할 때 당신은 당신과 같이 그 위치에 가장 가까운 다음 문서를 얻을 수 있도록 삭제하고 하나 limit()를 생략합니다. com/questions/7223273/get-n-th-in-an-array-in-mongo – ncremins

+1

@creminsn은 문서의 배열에 관한 것이고 tq는 컬렉션의 n 번째 문서를 말합니다. –

답변

2

사용 스킵 (N-1) 위의 코드에서 : 나는 가장 좋은 방법은 당신이 인덱스로 사용할 수있는 문서의 카운터를 유지하는 것입니다 아마 생각

$cursor = $collection->find(); 
$cursor->skip(3); 
$cursor->next(); 
$doc = $cursor->current(); 

하지만.

+0

감사합니다. 왜 색인이 필요한지 자세히 설명해 주시겠습니까? btw'$ cursor-> next()', 출력 없음 –

+0

값에 따라 잠재적으로 전체 컬렉션을 "걸을"수있는 커서가 아니라 한 동작으로 해당 문서를 찾을 수 있도록 귀하의 건너 뛰기) –

+0

그래서 내 원래 게시물과 같은 카운터? 또는 다른 것? –

4

Skip()은 인덱스를 효과적으로 사용하지 않으므로 컬렉션 내의 모든 필드에 인덱스를 지정하는 것이 무의미합니다.

skip() 번째 문서를 원하므로 skip() 값이 낮 으면 (시스템에 따라 다르지만 일반적으로 전체 수집 스캔시 100K 행 미만) OK 일 수 있습니다. 문제는 일반적으로 그렇지 않다는 것입니다. Mongo는 인덱스가있는 경우에도 전체 결과 집합을 스 캔할 수 있기 전에 검색하여 쿼리에 상관없이 전체 컬렉션 스캔을 유도해야합니다.

이 작업을 자주하고 무작위로 수행하려는 경우 정확한 문서 번호 (http://www.mongodb.org/display/DOCS/How+to+Make+an+Auto+Incrementing+Field)를 생성하려면 findAndModify이라는 다른 모음을 결합하는 증분 ID를 사용하는 것이 좋습니다.

그러나 이것은 문제를 유발하므로 특히 삭제가 발생할 때이 ID를 유지해야합니다. 이를 해결하는 한 가지 방법은 문서를 실제로 삭제하는 대신 삭제 된 것으로 표시하는 것입니다.

$cur = $db->collection->find(array('ai_id' => array('$gt' => 403454), 'deleted' => 0))->limit(1); 
$cursor->next(); 
$doc = $cursor->current(); 
관련 문제