2012-08-31 13 views
5

Sto utilizzando MongoDB e GridFS in PHP e sto cercando di capire come eliminare più file dallo _id.Elimina più file in MongoDB GridFS in PHP

Ecco il codice che ho:

$ids = array("50401f40ff558cec38000061", "62401f40ff558cec38000072", "73401f40ff558cec38000083"); 
$mongo_ids = array(); 
foreach($ids as $id) { 
    $mongo_ids[] = new MongoId($id); 
} 

$mongo_grid_fs->remove(array("_id" => $mongo_ids)); 

Qualsiasi idea di cosa sto facendo male?

+0

controllare il risultato di 'MongoDB :: UltimoErrore()' e post se non ti dispiace – Lusitanian

risposta

3

Questa impossibile da fare con una singola richiesta a causa del modo in cui GridFS effettivamente funziona.

si hanno due collezioni:

  • File
  • Bocconcini

Inorder per cancellare un file GridFS è necessario interrogare entrambi questi tavolo. In quanto tale, la funzione remove() chiama effettivamente la raccolta di blocchi e quindi rimuove il file dalla raccolta di file.

Dal momento che MongoDB non può, fondamentalmente, interrogare due raccolte in una richiesta (unita eliminata fondamentalmente) è necessario inviare una richiesta di cancellazione per file da eliminare altrimenti resteranno dei blocchi che occupano spazio nella propria collezione di chunk.

Come tale, prendendo in considerazione la risposta @ToddMoses è quella corretta.

È possibile di utilizzo naturalmente: http://www.php.net/manual/en/mongogridfs.remove.php ma credo che fa esattamente la stessa cosa, solo astrae così la query avrebbe dovuto essere:

$mongo_grid_fs->remove(array("_id" => array('$in' => $mongo_ids))); 
+0

Questa era la soluzione, serve il secondo array usando '$ in'. Grazie. – Justin

2

In primo luogo, utilizzare MongoDB :: lastError() per scoprire cosa non funziona. MongoGridFS :: remove non ti presenterà un messaggio se fallisce. FARE qualcosa del genere:

$errorArray = $db->lastError(); 
var_dump($errorArray); 

Sembra che il problema non sia quello di impostare correttamente i criteri. La cosa più facile da fare è semplicemente usare Elimina invece di rimuovere dal Elimina prende un ID come unico parametro:

public bool MongoGridFS::delete (mixed $id) 

Questo elimina un file dal database, mentre rimuovere elimina i file dalla raccolta. Dal momento che si sta loop in ogni caso, si può fare qualcosa di simile:

foreach($ids as $id) { 
    $mongo_grid_fs->delete($id); 
} 
+0

Ma questo rende più richieste, quindi meno efficienti, preferirebbe fare una singola richiesta, che passa in più ID se possibile. – Justin

Problemi correlati