2012-04-27 9 views
3

私はマルチテナントWebアプリケーションで作業します。むしろ大規模になりがちなコレクションの中に多数の文書を持つユーザーのコンテナを明確にする必要があります。この基準を満たしている多くの文書、数千または数百万もの数百のようなものがあることができ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

あなたはいくつのテナントを持っていますか?数千人でない場合は、テナントごとにコレクションを作成し、コレクション全体を削除することができます(1人のテナントのすべてのデータを削除しようとする場合)。あなたが何をしても、これはオフラインのバッチ型操作です。 – Thilo

+0

それは10万人以上のテナントになる可能性があります。この操作は1つのリストのデータをクリアし、テナントは複数のリストを持つことができます。 – Oleg

答えて

5

これは、アプリケーションで行う必要があることです。 PHPでは、あなたがそうでなければfind(array('LISTID' => $listId)は物事が本当に遅い作ることができ、あなたがLISTIDにインデックスを持っていることを本当に確認する必要があり

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

:ような何かを行います。

+1

削除操作の一部のデータベース(mysqlなど)のようなmongodbの削除文書の数を制限する方法はありません。 – Oleg

+0

これは、mongodbの小さな塊でドキュメントを削除する唯一の方法ですか? – Oleg

+0

現時点では削除に制限はないので、これは私が考えることができる唯一の方法です。 – Derick