我需要删除存储在Mongo的GridFS中的一堆文件,这些文件比给定日期早。这意味着我需要从 fs.files 和 fs.chunks 集合中删除。
我正在考虑编写一个函数来查找符合搜索条件的 fs.files 的所有文档,迭代它们并在循环中删除 fs.chunks中的所有文档匹配 fs.files 中相应文档的 files_id 值,但是,根据文档:
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控制台来完成此任务。
那么,删除文件的首选方法是什么,使用mongo控制台或JS文件为两个集合中的 fs.files 中的字段匹配某些条件,为控制台提供信息?< / p>
答案 0 :(得分:2)
您建议的方法大多是正确的。唯一指向文件内容的指针是在fs.files中,所以如果你先删除它并且删除了一些错误,那么至少没有任何东西可以引用那些块。
为了安全起见,你可以有一个后台作业,它通过块集合的files_id字段(已编入索引,因此它应该很快),并确保所有files_ids与fs中的doc匹配。文件集合。如果它们没有并且它们不是最近创建的(您可以从_id字段获取它们的时间戳),则可以删除它们。 (如果它们是当前正在插入的文件的一部分,您不希望删除最近创建的块。)