Как я могу удалить файлы (по типу транзакции) из GridFS MongoDB с помощью консоли Mongo - PullRequest
3 голосов
/ 28 июля 2011

Мне нужно удалить группу файлов, хранящихся в GridFS Монго, которые старше указанной даты.Это подразумевает, что мне нужно удалить как из fs.files , так и fs.chunks коллекций.

Я думал о написании функции, которая находит все документы из fs.files , которые соответствуют критериям поиска, выполните итерацию по ним и в цикле удалите все документы из fs.chunks , которые соответствуют значению files_id соответствующего документаоднако в fs.files , согласно документам:

MongoDB поддерживает атомарные операции с отдельными документами.MongoDB не поддерживает традиционную блокировку и сложные транзакции

, что заставляет меня думать, что мой предложенный подход может быть неправильным.

Я знаю, что мог бы использовать один из клиентовдрайверы для работы с GridFS напрямую.Например, используя PHP, я мог бы реализовать его следующим образом:

<?php
$grid = $db->getGridFS('fs');

$grid->remove(array(
    "uploadDate" => array(
        '$lt' => new MongoDate(strtotime("2011-02-01 00:00:00"))
    )
));

... однако я хочу сделать это, используя только консоль mongo.

Итак, какой способ предпочтительнееудалить файлы, соответствующие определенным критериям, относящимся к полю в fs.files , из обеих коллекций, используя консоль mongo или файл JS, подающий консоль?

1 Ответ

2 голосов
/ 28 июля 2011

Ваш предложенный подход в основном правильный. Единственный указатель на содержимое файла находится в файле fs.files, поэтому, если вы сначала удалите этот файл и что-то пойдет не так, удаляя куски, по крайней мере, вокруг не будет ничего, что могло бы ссылаться на эти куски.

Чтобы быть в безопасности, у вас может быть фоновое задание, которое проходит через поле files_id коллекции chunks (которое проиндексировано, поэтому оно должно быть быстрым) и гарантирует, что все files_ids совпадают с документами в fs. Коллекция файлов. Если они этого не делают и не были созданы сравнительно недавно (вы можете получить метку времени, в которой они были созданы из поля _id), вы можете удалить их. (Вы не хотите удалять недавно созданные чанки, если они являются частью файла, который вставляется в данный момент.)

...