2012-04-04 4 views
0

일괄 처리로 몽고 컬렉션을 쿼리하는 가장 효율적인 방법은 무엇입니까? 내가 here일괄 쿼리에 해당하는 Mongodb 관용구

설명하지만 스킵에 대한 큰 경고가 나에게 나는 그것을 사용하지한다고 생각합니다으로 뭔가를 할 수있는 것으로 나타났습니다

SELECT * FROM Foo WHERE id > {{floor}} limit 1000; 

: SQL의 예를 들어 내가 좋아하는 일을 할 것입니다. (컬렉션이 중요하기 때문에 컬렉션이 충분히 크다고 가정합니다.)

내 모음집에는 자동 생성 된 _id 필드 외에도 색인이 없습니다. 나는 그것과 $ gt $ lt를 사용할 방법이 있는지 확실하지 않습니다.

가 나는 경우 내장 비밀 소스가의 카스바 드라이버를 사용할 것, 중요합니다.

답변

2

몽고 해당 SQL 쿼리의 직역은

db.foo.find({"id": {"$gt": floor}}).limit(1000) 

이 조회 할 수있다 id 필드의 인덱스 (또는 id 대신 해당 열을 사용하면 _id의 기본 인덱스로 제공).

limit()의 성능 문제는 없지만 결과를 반환하기 전에 서버가 많은 양의 레코드를 반복해야하므로 매우 큰 값의 경우에는 skip()이 제대로 수행되지 않을 수 있습니다.

+0

오른쪽, 나는 _id 기본 색인 만 가지고 있으므로 시작할 최소 ID를 모른다. 하지만, 내가 0에서 시작하여 1000을 제한하고 마지막 _id를 가져 와서 증가 시키면 작동한다고 ... 맞습니까? –

+0

실은 db.foo.find ({_id : {$ gt : new ObjectId ("00000000000000000000000000")}}) .limit (1000)와 같은 작업을 수행 할 수 있습니다. 좋은. –

+1

페이지 매김을 위해, 그 접근법 (마지막을 기억하고 그 직후에 시작하는 것)이 권장됩니다. db.foo.find ({_ id : {$ gt : {last_object_id}}) sort ({_ id : 1}). limit (num_per_page)'를 할 수 있습니다. Rembmer가'sort()'를 사용하면 기발한 결과를 얻을 수 있습니다. – dcrosta

관련 문제