有一种方法可以解决这个问题:
@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。现在您至少可以fs.files
使用 Spring Data Repo 查询集合。但是:您不能以这种方式访问文件内容。
为了获取文件内容本身,您有(至少)2个选项:
采用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
字段可能很有用。其余字段有点静态。
您应该能够简单地使用您的 customMyGridFsFileRepo
方法update
。我建议只为该metadata
字段创建一个设置器。
不同文件的不同元数据:
我使用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 切换到使用普通访问 via 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;
}
希望这可以帮助。如果您需要有关此的更多信息,我可以写更多。就告诉我嘛。