2012-04-27 3 views
3

Je travaille sur une application web multitenant. Il faut effacer certains conteneurs d'utilisateurs, qui peuvent être assez volumineux, ayant de nombreux documents en collection. Je dois être en mesure de supprimer de nombreux documents quelque chose comme:supprimer de nombreux documents de mongodb

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

Dans certains cas, il peut y avoir de nombreux documents qui répondent à ces critères, quelque chose comme 100s de milliers, voire des millions. Je m'inquiète que cette opération peut prendre beaucoup de temps et ralentir le serveur. S'il y a beaucoup de documents, est-il file d'attente une valeur telle opération pour les supprimer quelque chose comme hors ligne pseudo-code:

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

Je me demande comment supprimer des données par portios plus petites dans MongoDB dans ce cas. Je remarque également que pour une raison quelconque la suppression de plusieurs lignes se fait plutôt rapidement dans mongodb, nous avons un prototype avec des données stockées dans mongodb, supprimer un nombre similaire de lignes prend beaucoup plus de temps dans mysql, mais dans mysql avec des données mais même quand therer ne sont pas des enregistrements dans les tables dépendantes, il semble beaucoup plus rapide dans mongodb, dans mongodb il stocke toutes les données dans le document, mais il me semble plutôt étrange de toute façon. Ou peut-être que c'est superflu?

Merci.

+0

Combien de locataires avez-vous? Si elles ne sont pas dans les milliers, vous pouvez avoir une collection par locataire et laisser tomber la collection entière (si vous voulez que vous essayiez de supprimer toutes les données pour un locataire). Quoi que vous fassiez, il s'agit presque certainement d'une opération hors ligne, par lots. – Thilo

+0

Il peut être 10s milliers de locataires et même plus. Cette opération devrait effacer les données d'une liste, les locataires peuvent avoir plusieurs listes. – Oleg

Répondre

5

C'est quelque chose que vous aurez à faire dans votre application. En PHP, vous pouvez f.e. faire quelque chose comme:

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

Vous devez vraiment vous assurer que vous avez un index sur listid, sinon le find(array('LISTID' => $listId) pourrait faire des choses vraiment lent.

+1

N'est-il pas possible de limiter le nombre de documents supprimés dans mongodb comme dans certaines bases de données (par exemple mysql) limite dans l'opération de suppression. – Oleg

+0

Est-ce la seule façon de supprimer des documents par petits morceaux dans mongodb? – Oleg

+0

Il n'y a pas de limite de suppression pour le moment, donc c'est effectivement le seul moyen auquel je peux penser. – Derick

Questions connexes