5

で と を使用してMongoDBおりGridFSPHPで複数のファイルを削除する方法を見つけようとしています _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));

私が間違っていることは何ですか?

4

2 に答える 2

3

GridFSが実際に機能する方法のため、これを1つのリクエストで行うことは不可能です。

2つのコレクションがあります。

  • ファイル
  • チャンク

GridFsファイルを削除するには、これらのテーブルの両方を照会する必要があります。そのため、remove()関数は実際にチャンクコレクションを呼び出してから、ファイルコレクションからファイルを削除します。

基本的に、MongoDBは1つのリクエストで2つのコレクションをクエリできないため(基本的には結合削除)、削除するにはファイルごとに削除リクエストを送信する必要があります。そうしないと、チャンクコレクションのスペースを占めるチャンクが残ります。

したがって、これを考慮に入れると、@ToddMosesの答えが正しいものになります。

もちろん使用できます:http ://www.php.net/manual/en/mongogridfs.remove.phpですが、まったく同じことを行うと思います。抽象化されているため、クエリは次のようになります。

$mongo_grid_fs->remove(array("_id" => array('$in' => $mongo_ids)));
于 2012-08-31T07:42:18.693 に答える
2

まず、MongoDB::lastError() を使用して、何が問題なのかを調べます。MongoGridFS::remove は、失敗してもメッセージを表示しません。次のようにします。

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

問題は、基準を適切に設定していないことです。最も簡単な方法は、Remove の代わりに Delete を使用することです。これは、Delete が唯一のパラメーターとして ID を受け取るためです。

public bool MongoGridFS::delete ( mixed $id )

これはデータベースからファイルを削除しますが、remove はコレクションからファイルを削除します。とにかくループしているので、次のようなことができます:

foreach($ids as $id) {
    $mongo_grid_fs->delete($id);
 }
于 2012-08-31T03:32:12.493 に答える