我最近发现了GridFS,我想用它来存储带有元数据的文件.我只是想知道是否可以使用MongoRepository来查询GridFS?如果是,有人能给我举个例子吗?

如果有的话,我也会使用Hibernate解决.

原因是:我的元数据包含许多不同的字段,查询存储库比 for each 场景编写new Query(Criteria.where(...))个字段要容易得多.我希望也可以简单地获取一个Java对象,并通过REST API提供它,而不需要文件本身.

编辑:我正在使用

  • spring 4测试版
  • Spring Data Mongo 1.3.1
  • Hibernate 4.3测试版

推荐答案

有一种方法可以解决这个问题:

@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:您不能通过这种方式访问文件内容.

要获取文件内容本身,您(至少)有两个选项:

  1. 使用file = gridOperations.findOne(Query.query(Criteria.where("_id").is(id))); InputStream is = file.getInputStream();

  2. 看看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;
}

希望这有帮助.如果你需要更多信息,我可以写更多.告诉我.

Mongodb相关问答推荐

MongoDB:从集合页面数据中提取不同的值

如何对嵌套在另一个数组中的数组中的字段执行查找?

用Spring Boot查询MongoDB中的对象数组

数组中字符串的Mongo查询集合和推送到新数组嵌套对象

执行聚合以消除重复并获得唯一计数

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

类型错误:db.close is not a function

如何在 Mongo 聚合管道中获取限制之前的计数

解析命令行时出错:unrecognized option --rest

MongoDB 文档操作是原子的和隔离的,但它们是否一致?

Mongodb:查询嵌套在数组中的json对象

通过 Spring Boot 应用程序访问 mongodb 时的身份验证错误

spring-data-mongo - 可选查询参数?

使用 MongoDB 的 map/reduce 来分组两个字段

Mongo: query by key one level deep

Mongoose Select 要从 findOneAndUpdate 返回的字段

Mongodb 按字段名称查找任何值

使用 C# 聚合 $lookup

我需要手动关闭mongoose连接吗?

创建模型时出现mongoose错误