有一种方法可以解决这个问题:
@Document(collection="fs.files")
public class MyGridFsFile {
@Id
private ObjectId id;
public ObjectId getId() { return id; }
private String filename;
public String getFilename() { return filename; }
private long length;
public long getLength() { return length; }
...
}
您可以编写一个普通的Spring Mongo Repo。现在,您至少可以使用Spring Data Repo查询fs.files
集合。但是:您无法通过这种方式访问文件内容。
要获取文件内容本身,您至少有两个选择:
使用file = gridOperations.findOne(Query.query(Criteria.where("_id").is(id)));
InputStream is = file.getInputStream();
查看GridFSDBFile
的源代码。在那里,您可以看到它如何在内部查询fs.chunks
集合并填充InputStream。
(选项2非常底层,选项1要容易得多,而且此代码由MongoDB-Java-Driver开发人员维护,尽管我会选择选项1)。
更新GridFS条目:
- GridFS不适用于更新文件内容!
- 尽管仅更新
metadata
字段可能有用。其余字段基本上是静态的。
您应该能够简单地使用自定义的MyGridFsFileRepo
的update
方法。我建议仅为metadata
字段创建一个setter。
不同文件的不同元数据:
我使用具有通用元数据的abstract MyGridFsFile
类来解决这个问题,例如:
@Document(collection="fs.files")
public abstract class AbstractMyGridFsFile<M extends AbstractMetadata> {
...
private M metadata;
public M getMetadata() { return metadata; }
void setMetadata(M metadata) { this.metadata = metadata; }
}
当然,每个实现都有其自己的AbstractMetadata
实现关联。我做了什么? AbstractMetadata
始终具有名为type
的字段。这样,我就可以找到正确的AbstractMyGridFsFile
实现。尽管我还有一个通用的抽象存储库。
顺便说一下:同时,我从使用Spring Repo转换为使用纯粹通过MongoTemplate
进行访问:
protected List<A> findAll(Collection<ObjectId> ids) {
List<A> files = mongoTemplate.find(Query.query(Criteria
.where("_id").in(ids)
.and("metadata.type").is(type)
), typeClass);
return files;
}
希望这可以帮到你。如果你需要更多关于这方面的信息,我可以写更多,告诉我即可。