使用Spring Data MongoDB更新GridFS元数据

6

我想更新GrifFs文件集合中的单个元数据字段。

我阅读了Spring Data MongoDB的文档,但没有找到相应的API。

目前我唯一找到的解决方案是直接使用Mongo API删除现有文件,并存储一个具有相同_id的新文件。但这不是有效的解决方案。这个问题特定于Spring Data MongoDB。是否有其他替代方法?

2个回答

4
另一种解决方案是添加或完全替换元数据字段。
Map<String,Object> fields=...;

替换元数据:

List<GridFSDBFile> files = gfs.find(query);

        for (GridFSDBFile file : files) {
            file.setMetaData(new BasicDBObject(fields));
            file.save();
        }

添加元数据:

List<GridFSDBFile> files = gfs.find(query);

        for (GridFSDBFile file : files) {
            if (file.getMetaData() == null)
                file.setMetaData(new BasicDBObject(fields));
            else
                file.getMetaData().putAll(fields);
            file.save();
        }

4

使用mongoOperations。

元数据存储在集合fs.files中;如果您只更新元数据,可以直接使用集合访问并更新它:

DBObject yourObjectWithMetadata = mongoOperations.getCollection("fs.files").findOne(<Object Id>);
mongoOperations.getCollection("fs.files").save(<your db object with updated metadata>);

这个答案乍一看不错,但你硬编码了 "fs.files"。实际上并不能保证这是应用程序中使用的集合(由于配置可能会有所不同)。但事实上,使用 GridFsTemplate,你不能这样做,它似乎是无法实现的… - Wouter
这只是一个示例。由于Mongo GridFS默认创建两个集合(fs.files和fs.chunks),因此实现者需要使用适当的(覆盖或未覆盖)集合名称。GridFsTemplate不允许元数据操作,您必须依赖于mongoOperations的实现,例如MongoTemplate。 - user1568967
你的解决方案很好,但是因为@Sumit只想更新一个字段,所以只需使用mongoOperations.getCollection("fs.files").update(<query>, <update>) - royB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接