2012-04-27 4 views
3

나는 멀티 테넌트 웹 응용 프로그램에서 작업합니다. 다소 큰 컨테이너 일 수있는 사용자 컨테이너를 수집해야하는 경우가 많습니다. 이 기준을 충족 많은 문서, 수천 또는 수백만의 수백과 같이있을 수mongodb에서 많은 문서 삭제

return self::remove(array('LISTID' => $listId), array('safe' => true)); 

어떤 경우 : 내가 좋아하는 많은 문서 뭔가를 삭제 할 수 있어야합니다. 나는이 작업이 많은 시간과 스로틀 서버를 소비 할 수 있다고 걱정한다. 많은 문서가있을 경우, 그들에게 의사와 같은 오프라인 뭔가를 삭제하는 가치 큐 같은 작업입니다 :

while (there are documents) { 
    delete(1000 documents); 
    sleep(); 
} 

내가이 경우 MongoDB를 더 작은 portios하여 데이터를 삭제하는 방법을 생각해 본다. 어떤 이유로 mongodb에서 오히려 빠른 행을 삭제하는 몇 가지 이유 때문에 mongodb에 데이터를 저장하는 프로토 타입이 있는데, 비슷한 수의 행을 삭제하면 mysql에서 훨씬 더 오래 걸립니다. 그러나 mysql에서 테이블의 각 행에는 다른 테이블에 대한 참조가 있습니다 데이터가 있지만 종속 테이블에 레코드가없는 경우에도 mongodb에서 훨씬 빨라 보인다. mongodb에서는 모든 데이터를 문서에 저장하지만, 어쨌든 나에게는 이상한 것처럼 보인다. 아니면 불필요한가요?

감사합니다.

+0

몇 명의 임차인이 있습니까? 수천 명이 아닌 경우 세입자 당 컬렉션을 가지고 전체 컬렉션을 삭제할 수 있습니다 (하나의 세입자에 대한 모든 데이터 삭제). 여러분이 무엇을 하든지간에 이것은 거의 확실하게 오프라인의 일괄 처리 작업입니다. – Thilo

+0

10 억 명의 세입자가 될 수 있습니다. 이 작업은 한 목록의 데이터를 지워야하며 세입자는 여러 목록을 가질 수 있습니다. – Oleg

답변

5

이것은 응용 프로그램에서해야 할 일입니다. PHP에서는 f.e.

$found = false; 
$ids = $collection->find(array('LISTID' => $listId), array('_id' => 1))->limit(1000); 
do { 
    $found = 0; 
    $idsToDelete = array(); // we'll collect all the ids here, so that we can delete them in a batch 
    foreach($ids as $res) 
    { 
     $found++; 
     $idsToDelete[] = $res['_id']; 
    } 
    $collection->remove(array('_id' => array('$in' => $idsToDelete))); 
    sleep(15); 
} while ($found); 

당신은 그렇지 않으면 find(array('LISTID' => $listId)이 일이 정말 느리게 만들 수있는, 당신이 LISTID에 인덱스가 정말 있는지 확인해야합니다 : 그런 짓을.

+1

mongodb에서 삭제 된 문서의 수를 제한하는 방법은 제거 작업의 일부 데이터베이스 (예 : mysql) 제한과 같습니다. – Oleg

+0

이 방법은 mongodb의 작은 덩어리로 문서를 삭제하는 유일한 방법입니까? – Oleg

+0

현재 삭제에 제한이 없으므로 이것이 내가 생각할 수있는 유일한 방법입니다. – Derick

관련 문제