2012-08-31 26 views
5

Estoy usando MongoDB y GridFS en PHP, y tratando de averiguar cómo eliminar varios archivos por _id.Eliminar varios archivos en MongoDB GridFS en PHP

Aquí está el código que tengo:

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

Alguna idea de lo que estoy haciendo mal?

+0

comprobar el resultado de 'MongoDB :: LastError()' y post si no te importa – Lusitanian

Respuesta

3

Esto imposible de hacer con una sola petición debido a la forma en que realmente funciona GridFS.

usted tiene dos colecciones:

  • Archivos
  • Trozos

finde para borrar un archivo de GridFS debe consultar Ambas mesa. Como tal, la función remove() realmente llama a la colección de fragmentos y luego elimina el archivo de la colección de archivos.

Dado que MongoDB no puede, fundamentalmente, consultar dos colecciones en una sola solicitud (se ha eliminado básicamente) debe enviar una solicitud de eliminación por archivo para eliminar; de lo contrario, habrá sobrantes que ocuparán espacio en la colección de fragmentos.

Como tal, teniendo esto en cuenta la respuesta de @ToddMoses es la correcta.

Puede, por supuesto uso: http://www.php.net/manual/en/mongogridfs.remove.php pero creo que hace exactamente lo mismo, solo abstraído por lo que su consulta debería haber sido:

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

Esta fue la solución, necesita la segunda matriz usando '$ in'. Gracias. – Justin

2

Primero, use MongoDB :: lastError() para descubrir qué está pasando mal. MongoGridFS :: remove no le presentará un mensaje si falla. HAGA algo como esto:

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

Parece que el problema es que no está estableciendo los criterios correctamente. La cosa más fácil que hacer es usar Borrar en lugar de desde Retire Eliminar toma un ID como su único parámetro:

public bool MongoGridFS::delete (mixed $id) 

Esto elimina un archivo de la base de datos mientras que retire elimina los archivos de la colección. Dado que se recorre todos modos, se puede hacer algo como esto:

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

, pero esto hace que las solicitudes múltiples, por lo tanto, menos eficientes, prefieran hacer una única solicitud, que pasa en varios identificadores si es posible. – Justin