2012-08-31 26 views
5

Tôi đang sử dụng MongoDBGridFS trong PHP và cố gắng tìm ra cách xóa nhiều tệp theo _id.Xóa nhiều tệp trong MongoDB GridFS trong PHP

Dưới đây là đoạn code tôi có:

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

Bất kỳ ý tưởng những gì tôi đang làm sai?

+0

Kiểm tra kết quả của 'MongoDB :: lastError()' và bài nếu bạn không quan tâm – Lusitanian

Trả lời

3

Điều này không thể thực hiện với một yêu cầu duy nhất do cách mà GridFS thực sự hoạt động.

Bạn có hai bộ sưu tập:

  • tập tin
  • Chunks

Inorder để xóa một GridFs nộp bạn phải truy vấn cả hai bảng. Như vậy hàm remove() thực sự gọi bộ sưu tập đoạn và sau đó loại bỏ tệp khỏi bộ sưu tập tệp.

Vì MongoDB không thể, về cơ bản, truy vấn hai bộ sưu tập trong một yêu cầu (tham gia xóa cơ bản), bạn phải gửi yêu cầu xóa cho mỗi tệp để xóa, nếu không bạn sẽ để lại nhiều phần không gian trong bộ sưu tập khối của mình.

Như vậy, xem xét vấn đề này @ToddMoses là câu trả lời đúng.

Bạn có thể sử dụng khóa học: http://www.php.net/manual/en/mongogridfs.remove.php nhưng tôi tin rằng nó chính xác những điều tương tự, chỉ cần tóm tắt để truy vấn của bạn cần phải có được:

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

Đây là giải pháp, cần mảng thứ hai sử dụng '$ in'. Cảm ơn. – Justin

2

Đầu tiên, sử dụng MongoDB :: lastError() để tìm hiểu điều gì đang xảy ra. MongoGridFS :: xóa sẽ không hiển thị cho bạn một tin nhắn nếu nó không thành công. LÀM một cái gì đó như thế này:

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

Có vẻ vấn đề là bạn không đặt tiêu chí đúng cách. Điều đơn giản nhất để làm là chỉ cần sử dụng Xóa thay vì Di chuyển từ Xoá mất một ID như tham số duy nhất của nó:

public bool MongoGridFS::delete (mixed $id) 

này xóa một tập tin từ cơ sở dữ liệu trong khi loại bỏ xóa các tập tin từ bộ sưu tập. Vì bạn đang lặp lại, bạn có thể làm như sau:

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

Nhưng điều này làm cho nhiều yêu cầu, do đó ít hiệu quả hơn, muốn thực hiện một yêu cầu duy nhất, chuyển qua nhiều id nếu có thể. – Justin

Các vấn đề liên quan