3

我需要删除一堆文件,这些文件存储在 Mongo 的 GridFS 中,这些文件早于给定日期。这意味着我需要从fs.filesfs.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 控制台来完成此操作。

那么,删除文件的首选方法是什么,匹配两个集合中fs.files中某个字段的某些条件,使用 mongo 控制台或 JS 文件,提供控制台?

4

1 回答 1

2

您建议的方法大多是正确的。指向文件内容的唯一指针位于 fs.files 中,因此如果您先删除该文件,然后在删除块时出现问题,那么至少不会有任何东西可以引用这些块。

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

于 2011-07-28T14:52:12.623 回答