簡體   English   中英

使用GridFSOperations獲取所有文檔

[英]Get all documents with GridFSOperations

我決定將我們的一個項目從PostgreSQL遷移到MongoDB,這個項目處理圖像。 我現在可以保存圖像並通過其_id檢索它們,但是找不到帶有GridFSOperations的函數,可以安全地獲取所有文檔。 我這樣做是為了獲取與圖像一起保存的照片元數據,並使用Lucene對其進行索引(因為我需要對一些相關元數據進行全文搜索,以及將來可能需要重建Lucene索引的情況)

在舊代碼中,我發現(困難的方式)我的開發系統只能對5k的組進行批量Lucene添加,因​​此我僅具有一個具有偏移量和SQL查詢限制的函數。 是否有使用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;
}

使用GridFS時,信息將存儲在MongoDB數據庫中的兩個集合中。 第一個是fs.files ,它具有對文件的主要引用,而fs.chunks實際上包含數據的“塊”。 看例子

集合: 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文檔和正常的集合。

如您所見,您可以通過多種方式使用標准API“查詢”這些集合:

  • 對象ID是單調的,因此不斷增加。 較新的條目將具有比較舊的條目更高的ObjectId值。 最重要的是,索引的最后一個ID。

  • updloadDate還包含一個常規日期時間戳記,您可以將其用於基於日期范圍的查詢。

因此,您將看到GridFS實際上只是與普通MongoDB文檔一起使用的“驅動程序級魔術”,並將二進制數據視為單個文檔。

因為它們只是帶有常規文檔的常規集合,除非您要檢索或更新內容,否則只需使用常規方法進行選擇和查找即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM