0

我正在开发一个使用 mongodb 的插件。该插件必须将一些 .dcm 文件(DICOM 文件)作为二进制文件存储在数据库中。之后,插件必须存储文件的元数据,并且只能对这些元数据进行一些查询。

自然地,我选择了 GridFs 来回答我的问题。因为我可以使用同一个文件来存储 chunks 集合中的二进制数据和 files 集合中 metadata 字段中的元数据(并绕过 MongoDB 的大小限制)。

但另一个问题出现在我身上。这个解决方案会很棒,但我同时存储二进制数据和元数据。让我解释一下:首先我存储二进制文件,然后我检索文件并从中读取元数据并将元数据存储在同一个文件中。由于某些外部原因,这对我来说是一项义务。所以我浪费了很多时间来检索文件并再次恢复它。为了从已存储的文件中更新元数据,我正在使用以下代码:

    GridFSDBFile file = saveFs.findOne(uri.getFileName());
    if (file == null) {
        return false;
    } else {
        file.setMetaData(new BasicDBObject());
        file.save();
        return true;
    }

主要问题是我必须先找到文件才能修改它然后再存储它!

所以我的第一个问题是:有没有从数据库中检索文件而不是 findOne(String fileName) 的最佳方法?findOne(ObjectID id) 方法是否更快?(我不这么认为,因为我认为 fileName 默认已经被索引了,不是吗?)

我尝试了另一种方法来做到这一点。为了绕过这个问题,我决定存储 2 个不同的文件,一个用于二进制数据,一个用于元数据。在这种情况下,我不会浪费时间来检索数据库中的文件。但是我有 2 倍的文件...但我几乎可以肯定它存在更好的方法来做到这一点!

所以我的第二个问题:你认为我必须使用 2 个不同的集合吗?一种使用 GridF 存储二进制数据,另一种使用经典 mongo 存储(或 GridFS)仅存储元数据?

非常感谢您阅读我和您的回答:)。

4

1 回答 1

1

对于您的第一个问题,默认情况下,_id 和文件名字段都被索引。虽然 _id 字段是唯一的,但文件名不是。因此,如果您有具有相同文件名的文件,则获取具有该文件名的文件将比通过 _id 字段获取文件要慢。

对于您的第二个问题,您始终可以拥有您插入的任何 GirdFS 文件的元数据。这意味着您不必拥有比 GridFS 更多的东西。使用 GridFS 插入数据,但在插入之前,将元数据分配给要插入的文件。这样您就可以使用元数据查询文件。如果您想要的元数据对于所有文档都是固定的,那么您也可以将这些字段编入索引,并且当然是可查询的。

于 2013-11-28T00:05:08.327 回答