2015-02-02 3 views
2

데이터 저장소로 mongo를 사용하는 레일 응용 프로그램이 있습니다. Mongo는 3 개의 쿼리 라우터와 16 개의 샤드로 구성됩니다. 내가 다음과 같이하면 :mongoid 쿼리가 실제로 열거자를 사용하는 것과 다른 수를 반환합니다.

count = Item.where(:confirmed => true).count 

약 800,000 점이 있습니다. 나는 실제로 항목을 도보로 일괄 처리를 실행할 때, 카운트는 실질적으로 작 :

batch_size = 10000 
offset_count = 0 
completed_count = 0 

# prime the pump 
q = Item.where(:confirmed => true).limit(batch_size).skip(offset_count * batch_size).to_a 

while q.count > 0 
    # do something 
    completed_count += q.count 
    offset_count += 1 
    q = Item.where(:confirmed => true).limit(batch_size).skip(offset_count * batch_size).to_a 
end 

# here, completed count is << count (where "count" is the initial .where count) 

어떤 생각이 여기에 무슨 일이야? 몽고는 지수로 계산하지 않고 총계를 계산합니까?

FWIW에 대한 항목에 대한 색인이 있습니다. 확인되었습니다. 인덱스를 손상시키지 않으려면이 항목을 실행하기 전에 인덱스를 다시 만듭니다.

도움 주셔서 감사합니다. 케빈

+0

답장을 보내 주셔서 감사합니다. 정렬을 추가해 보았습니다. 아무런 차이가 없었습니다. 여전히 첫 번째 쿼리에서 반환 된 항목 수의 절반 정도만 얻었습니다. – user1130176

답변

0

정답. 그러나 그것은 운영의 순서 인 것처럼 보인다. 건너 뛰고 한계를 시도하십시오. 1000으로 제한 한 다음 처음 0, 1000, 2000을 건너 뛰는 것처럼 보입니다. 1000로 제한된 레코드 세트에서 2000을 건너 뛰면 0이 반환되고 테스트에서는 중지됩니다.

+0

감사합니다. gabe,이 시도, 운이없는, 같은 문제. – user1130176

+0

연결이 전체 샤드의 하위 집합에 도달 할 가능성이 있습니다. 800k 결과는 "Item.where"코드를 한 번 실행합니다. 다른 하나는 "Item.where"를 실행하여 아마도 여러 번 잠재적으로 죽은 샤드에 연결되어 예외를 던지거나? –

관련 문제