2012-10-02 6 views
0

J'utilise MongoDB sur la ligne de commande pour faire défiler une série de documents pour une condition particulière, passer d'une collection à une autre collection et la retirer de la collection originale.PHP MongoDB execute() verrouillant la collection

db.coll1.find({'status' : 'DELETED'}).forEach(
    function(e) {db.deleted.insert(e); db.coll1.remove({_id:e._id}); }); 

Cela fonctionne mais je besoin de ce script il déplace tous les documents COLL1 au quotidien de collecte supprimé (ou toutes les heures) par l'intermédiaire d'un script cron. J'utilise PHP donc je pensais que je voudrais écrire un script utilisé la bibliothèque PHP Mongo ::

$db->execute('db.coll1.find({'status' :'DELETED'}).forEach(
    function(e) { db.deleted.insert(e); db.coll1.remove({_id:e._id}); })'); 

Cela fonctionne, mais contrairement à la ligne de commande Mongo, db-> execute() est evaled, ce qui provoque un blocage jusqu'à ce que le bloc d'exécution soit terminé, ce qui empêche toutes les écritures dans la collection. Je ne peux pas le faire dans mon environnement de production.

Y at-il un moyen (sans se connecter manuellement à Mongo et exécuter la commande) et l'exécuter via un script PHP sans verrouillage?

Si j'utilise:

db->selectCollection('coll1')->find(array('status' => 'DELETED')) 

et itérer que je peux sélectionner les documents, sauf dans la collection supprimé et supprimer de la collection COLL1. Cependant cela semble être beaucoup de bande passante pour tout extraire sur le client et pour le sauvegarder sur le serveur.

Des suggestions?

Répondre

2

Existe-t-il un moyen (sans se connecter manuellement à Mongo et exécuter la commande) et l'exécuter via un script PHP sans verrouillage?

Comme vous l'avez dit la meilleure chose est de le faire côté client. Pour ce qui est de la bande passante, à moins d'avoir un réseau pré-90, il y aura très peu de bande passante par rapport à tout ce que vous utiliseriez pour tout le reste, y compris les réplicas.

Ce que vous pouvez faire est Entreposez vos suppressions lors de leur suppression réelle (dans votre application) au lieu d'une fois par jour, puis revenez une fois par jour dans votre collection originale en supprimant toutes les lignes supprimées. De cette façon, la bande passante sera répartie tout au long de la journée et quand il s'agit de nettoyer votre production, vous ne faites qu'une seule commande de suppression.

Une autre alternative serait d'utiliser un MR et de faire de son output cette collection.

Bien qu'en général les suppressions d'entreposage de cette manière sont normalement plus de travail que cela en vaut la peine. Il est généralement préférable de les conserver dans votre collection principale et de traiter vos requêtes autour du drapeau supprimé (comme vous l'avez probablement déjà fait pour ne pas les stocker immédiatement).

+0

Merci pour votre réponse et votre temps sammaye –