我正在开发一个使用 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)仅存储元数据?
非常感谢您阅读我和您的回答:)。