在PHP中删除MongoDB GridFS中的多个文件


Delete multiple files in MongoDB GridFS in PHP

我在PHP中使用MongoDBGridFS,并试图找出如何通过_id删除多个文件。

这是我的代码:

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

知道我做错了什么吗?

由于GridFS的实际工作方式,这不可能只处理一个请求。

您有两个集合:

  • 文件
  • Chunks

为了删除GridFs文件,您必须查询这两个表。因此,remove()函数实际上调用了chunk集合,然后从files集合中删除该文件。

从根本上讲,MongoDB不能在一个请求中查询两个集合(基本上是连接-删除的),因此必须为每个文件发送一个删除请求以进行删除,否则会留下块来占用块集合中的空间。

因此,考虑到这一点,@ToddMoses的答案是正确的。

您当然可以使用:http://www.php.net/manual/en/mongogridfs.remove.php但我相信它做了完全相同的事情,只是抽象了一下,所以你的查询应该是:

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

首先,使用MongoDB::lastError()找出问题所在。如果MongoGridFS::remove失败,它不会向您显示消息。这样做:

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

问题似乎是您没有正确设置标准。最简单的方法是使用Delete而不是Remove,因为Delete将ID作为其唯一参数:

public bool MongoGridFS::delete ( mixed $id )

这将从数据库中删除一个文件,而remove则从集合中删除文件。既然你无论如何都在循环,你可以这样做:

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