2012-04-27 70 views
3

我在多租戶Web應用程序上工作。有必要清除一些容器的用戶,這些容器可能相當大,有許多文檔正在收集。 我需要能夠刪除許多文件是這樣的:從mongodb中刪除很多文檔

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

在某些情況下可以有許多文件符合這一標準,類似的十萬甚至上百萬100S。我擔心這個操作可能會花費很多時間和節制服務器。 如果有很多文件,是否值得排隊這樣的操作將其刪除脫機像僞代碼:

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

我不知道如何通過小portios MongoDB中在這種情況下刪除數據。我還注意到,由於某種原因,在mongodb中刪除相當多的行的速度相當快,我們有用mongodb存儲數據的原型,在mysql中刪除相似數量的行需要更長的時間,但在mysql中,表中的每一行都引用了其他表有了數據,但即使在依賴表中沒有記錄時,它在mongodb中似乎也快得多,在mongodb中,它將所有數據存儲在文檔中,但對我而言,似乎相當奇怪。 或者它可能是多餘的?

謝謝。

+0

你有幾個租戶?如果他們不是成千上萬,你可以爲每個租戶收集一個集合並丟棄整個集合(如果你想要做的是刪除一個租戶的所有數據)。不管你做什麼,這幾乎肯定是一種離線的批量式操作。 – Thilo 2012-04-27 06:16:20

+0

它可以成千上萬的租戶,甚至更多。此操作應清除一個列表的數據,租戶可以有多個列表。 – Oleg 2012-04-27 07:22:18

回答

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); 

你需要讓真正確保您有LISTID索引,否則find(array('LISTID' => $listId)可能使事情變得很慢。

+1

是否有辦法限制MongoDB中刪除文件的數量,如某些數據庫(例如mysql)在刪除操作中的限制。 – Oleg 2012-04-27 13:24:39

+0

這是在mongodb中用小塊刪除文檔的唯一方法嗎? – Oleg 2012-04-27 13:31:10

+0

目前刪除沒有限制,所以這確實是我能想到的唯一方法。 – Derick 2012-04-28 09:27:21