【问题标题】:Delete multiple files in MongoDB GridFS in PHP在 PHP 中删除 MongoDB GridFS 中的多个文件
【发布时间】:2012-08-25 20:17:51
【问题描述】:

我在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));

知道我做错了什么吗?

【问题讨论】:

  • 查看MongoDB::lastError()的结果,不介意就贴出来

标签: php mongodb delete-file gridfs


【解决方案1】:

由于 GridFS 的实际工作方式,这对于单个请求是不可能的。

你有两个收藏:

  • 文件

要删除 GridFs 文件,您必须同时查询这两个表。因此 remove() 函数实际上调用块集合,然后从文件集合中删除文件。

由于 MongoDB 从根本上说不能在一个请求中查询两个集合(基本上是加入删除),因此您必须为每个文件发送一个删除请求以删除,否则您将留下占用块集合中空间的块。

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

您当然可以使用:http://www.php.net/manual/en/mongogridfs.remove.php,但我相信它的作用完全一样,只是被抽象化了,因此您的查询应该是:

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

【讨论】:

  • 这是解决方案,需要使用$in 的第二个数组。谢谢。
【解决方案2】:

首先,使用 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);
 }

【讨论】:

  • 但这会产生多个请求,因此效率较低,宁愿发出一个请求,如果可能的话,它会传入多个 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多