使用GridFSOperations获取所有文档

时间:2014-03-14 05:24:38

标签: java spring mongodb gridfs

我决定将我们的一个项目从PostgreSQL移到MongoDB,这个项目处理图像。我现在能够保存图像并通过它们的_id检索它们,但我找不到GridFSOperations的功能,我可以安全地获取所有文件。我这样做是为了让我可以拍摄我用图像保存的照片元数据并用Lucene索引它们(因为我需要对一些相关元数据进行全文搜索,以及我们可能需要重建Lucene索引的未来可能情况)

在旧代码中,我只是有一个带有偏移量和SQL查询限制的函数,因为我发现(困难的方式)我们的开发系统只能批量生成Lucene以5k为一组添加。是否有一种与GridFS相同的方法?

编辑:

从旧接口继承的函数:

public List<Photo> getPublicPhotosForReindexing(long offset, long limit) {
    List<Photo> result = new ArrayList<>();
    List<GridFSDBFile> files = gridFsOperations.find(new Query().limit((int) limit).skip((int) offset));
    for(GridFSDBFile file:files) {
        result.add(convertToPhoto(file));
    }
    return result;
}

一个简单的转换器,它将部分元数据放入我制作的POJO中:

private Photo convertToPhoto(GridFSDBFile fsFile) {
    Photo resultPhoto = new Photo(fsFile.getId().toString());
    try {
        resultPhoto
                .setOriginalFilename(fsFile.getFilename())
     //         .setPhotoData(IOUtils.toByteArray(fsFile.getInputStream()))
                .setDateAdded(fsFile.getUploadDate());
    } catch (Exception e) {
        logger.error("Should not hit this one", e);
    }
    return resultPhoto;
}

1 个答案:

答案 0 :(得分:1)

当您使用GridFS时,信息将存储在MongoDB数据库中的两个集合中。第一个是fs.files,其中包含对文件的主要引用,fs.chunks实际上包含&#34;块&#34;数据的。参见示例

收藏: fs.files

{
    "_id" : ObjectId("53229d20f3dde871df8b89a7"),
    "filename" : "receptor.jpg",
    "chunkSize" : 262144,
    "uploadDate" : ISODate("2014-03-14T06:09:36.462Z"),
    "md5" : "f1e71af6d0ba9c517280f33b4cbab3f9",
    "length" : 138905
}

收藏: fs.chunks

{
    "_id" : ObjectId("53229d20824b12efe88cc1f2"),
    "files_id" : ObjectId("53229d20f3dde871df8b89a7"),
    "n" : 0,
    "data" : // all of the binary data

}

所以这些只是普通的MongoDB文档和普通集合。

正如您所看到的,您可以通过多种方式查询&#34;这些集合使用标准API:

  • 对象ID是单调的,因此不断增加。较新的条目将具有比旧条目更高的ObjectId值。最重要的是,索引的最后一个ID。

  • updloadDate还包含可用于基于日期范围的查询的常规日期时间戳。

所以你看,GridFS真的只是&#34; Driver level magic&#34;使用普通的MongoDB文档,并将二进制数据视为单个文档。

由于它们只是普通文档的普通集合,除非您正在检索或更新内容,否则只需使用常规方法进行选择和查找。