2012-08-31 16 views
5

Używam MongoDB i GridFS w PHP i próbuję dowiedzieć się, jak usunąć wiele plików przez _id.Usuwanie wielu plików w GridFS MongoDB w PHP

Oto kod mam:

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

Każdy pomysł co robię źle?

+0

sprawdzić wynik 'MongoDB :: lastError()' i post Jeśli nie masz nic przeciwko temu, – Lusitanian

Odpowiedz

3

jest to niemożliwe do zrobienia z pojedynczego żądania ze względu na sposób, że GridFS faktycznie działa.

Masz dwie kolekcje:

  • Pliki
  • Kawałki

Inorder usunąć GridFs złożyć trzeba kwerendy obie te stole. Jako taka funkcja remove() faktycznie wywołuje kolekcję porcji, a następnie usuwa plik z kolekcji plików.

Ponieważ MongoDB nie może, zasadniczo, przesyłać kwerendy do dwóch kolekcji w jednym żądaniu (połączone w zasadzie usunięto), należy wysłać żądanie usunięcia dla każdego pliku, aby usunąć, w przeciwnym razie pozostawisz fragmenty zajmujące miejsce w kolekcji porcji.

Jako taka, biorąc pod uwagę odpowiedź @ToddMoses jest poprawna.

Można użytkowania przedmiotu: http://www.php.net/manual/en/mongogridfs.remove.php ale uważam, że jest dokładnie to samo, tylko oderwane więc zapytanie powinno być:

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

To było rozwiązanie, potrzebuję drugiej tablicy używając '$ in'. Dzięki. – Justin

2

Najpierw użyj funkcji MongoDB :: lastError(), aby dowiedzieć się, co dzieje się nie tak. MongoGridFS :: remove nie wyświetli wiadomości, jeśli się nie powiedzie. Zrobić coś takiego:

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

Wydaje problemu jest to, że nie zostały ustalone kryteria prawidłowo. Najprostszym rozwiązaniem jest po prostu użyć Usuń zamiast Delete Usuń ponieważ zajmuje identyfikator jako jedyny parametr:

public bool MongoGridFS::delete (mixed $id) 

to usunięcie pliku z bazy danych natomiast usunąć usuwa pliki z kolekcji. Ponieważ jesteś zapętlenie tak, można zrobić coś takiego:

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

Powoduje to jednak, że wiele żądań, a tym samym mniej wydajnych, wolałoby wykonać pojedyncze żądanie, które w miarę możliwości przechodzi w wiele identyfikatorów. – Justin

Powiązane problemy