我决定将我们的一个项目从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;
}
答案 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文档,并将二进制数据视为单个文档。
由于它们只是普通文档的普通集合,除非您正在检索或更新内容,否则只需使用常规方法进行选择和查找。