有一种方法可以解决这个问题:
@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回购协议.现在,至少可以使用Spring数据Repo查询fs.files
个集合.But:您不能通过这种方式访问文件内容.
要获取文件内容本身,您(至少)有两个选项:
使用file = gridOperations.findOne(Query.query(Criteria.where("_id").is(id)));
InputStream is = file.getInputStream();
看看GridFSDBFile
的源代码.在这里,您可以看到它如何在内部查询fs.chunks
集合并填充InputStream.
(选项2的级别非常低,选项1简单得多,这段代码由MongoDB Java驱动程序开发人员维护,尽管选项1是我的 Select ).
Updating GridFS entries:
- GridFS是为更新文件内容而设计的!
- 虽然只有更新
metadata
字段才有用.其余的田地都是静止的.
您应该能够简单地使用自定义的MyGridFsFileRepo
's update
方法.我建议为metadata
字段创建一个setter.
Different metadata for different files:
我用一个带有通用元数据的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; }
}
当然,每个impl都有自己的AbstractMetadata
个impl关联.我做了什么?AbstractMetadata
总是有一个叫做type
的字段.这样我就能找到正确的AbstractMyGridFsFile
impl.虽然我也有一个通用的抽象存储库.
顺便说一句:在此期间,我从使用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) // this is hardcoded for each repo impl
), typeClass); // this is the corresponding impl of AbstractMyGridFsFile
return files;
}
希望这有帮助.如果你需要更多信息,我可以写更多.告诉我.