如何使用Mongo控制台从MongoDB的GridFS中删除文件(以类似事务的方式)

时间:2011-07-28 12:41:16

标签: mongodb filesystems gridfs nosql

我需要删除存储在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>

1 个答案:

答案 0 :(得分:2)

您建议的方法大多是正确的。唯一指向文件内容的指针是在fs.files中,所以如果你先删除它并且删除了一些错误,那么至少没有任何东西可以引用那些块。

为了安全起见,你可以有一个后台作业,它通过块集合的files_id字段(已编入索引,因此它应该很快),并确保所有files_ids与fs中的doc匹配。文件集合。如果它们没有并且它们不是最近创建的(您可以从_id字段获取它们的时间戳),则可以删除它们。 (如果它们是当前正在插入的文件的一部分,您不希望删除最近创建的块。)