GridFS 類在 com.mongodb.gridfs 包中的地位類似于 Mongo 類在 com.mongodb 包的作用,主要是提供對外的接口。
它的各個方法是分別委托給不同的類執行的,尤其是 DBColletion 類的實例 _filesCollection 和 _chunkCollection 。
我們先看看它的構造函數:
可以看到,在構造函數中為屬性 _db,_filesCollection ,_chunkCollection 進行了賦值,后續的操作都需要委托給這些屬性。
GridFSDBFile 和 GridFSInputFile 分別表示從數據庫中讀取的文件和將要保存到數據庫中的文件。GridFS 類的部分操作是借助這兩個類的實例實現的。
它的各個方法是分別委托給不同的類執行的,尤其是 DBColletion 類的實例 _filesCollection 和 _chunkCollection 。
我們先看看它的構造函數:
/** * 在數據庫中為指定的 bucket 創建 GridFS 實例 * bucket 可以認為是標識符,用于區分不同的 GridFS 的實例,類似于傳統數據庫中的不同表 * 默認的 bucket 是 "fs" */ public GridFS(DB db, String bucket) { // DB 實例 _db = db; // bucket 名稱 _bucketName = bucket; // files 集合,是 DBCollection 類的實例,用于存放文件的基本信息 _filesCollection = _db.getCollection( _bucketName + ".files" ); // chunks 集合,是 DBCollection 類的實例,用于存放文件的數據 _chunkCollection = _db.getCollection( _bucketName + ".chunks" ); // 如果數據集合較小的話,創建索引 if (_filesCollection.count() < 1000) _filesCollection.ensureIndex( BasicDBObjectBuilder.start().add( "filename" , 1 ).add( "uploadDate" , 1 ).get() ); if (_chunkCollection.count() < 1000) _chunkCollection.ensureIndex( BasicDBObjectBuilder.start().add( "files_id" , 1 ).add( "n" , 1 ).get() ); // 設置 files 集合中存放的數據類型,這里指定為 GridFSDBFile _filesCollection.setObjectClass( GridFSDBFile.class ); }
可以看到,在構造函數中為屬性 _db,_filesCollection ,_chunkCollection 進行了賦值,后續的操作都需要委托給這些屬性。
_db 的相關操作 (數據庫級別的操作)
// 獲取該 GRidFS 實例所屬的 DB 實例 public DB getDB(){ return _db; }
_filesCollection 的相關操作(針對文件基本信息的操作)
// 獲取用于遍歷文件列表的 DBCursor,按文件名稱升序排列 public DBCursor getFileList(){ return _filesCollection.find().sort(new BasicDBObject("filename",1)); } // 根據指定的query,獲取用于遍歷文件列表的 DBCursor,按文件名稱升序排列 public DBCursor getFileList( DBObject query ){ return _filesCollection.find( query ).sort(new BasicDBObject("filename",1)); } // 根據特定條件獲取文件列表 public List<GridFSDBFile> find( DBObject query ){ List<GridFSDBFile> files = new ArrayList<GridFSDBFile>(); DBCursor c = _filesCollection.find( query ); while ( c.hasNext() ){ files.add( _fix( c.next() ) ); } return files; } // 對通過 find 方法返回的結果進行處理 private GridFSDBFile _fix( Object o ){ if ( o == null ) return null; // 包含的數據類型不是 GridFSDBFile,拋異常 if ( ! ( o instanceof GridFSDBFile ) ) throw new RuntimeException( "somehow didn't get a GridFSDBFile" ); // 設置屬性 GridFSDBFile._fs ,指向 GridFS 實例本身 GridFSDBFile f = (GridFSDBFile)o; f._fs = this; return f; }
_chunkCollection 的相關操作(針對文件數據的操作)
// 根據指定的 OBjectId 刪除文件 // 需要同時刪除文件基本信息和文件數據 public void remove( ObjectId id ){ _filesCollection.remove( new BasicDBObject( "_id" , id ) ); _chunkCollection.remove( new BasicDBObject( "files_id" , id ) ); }
GridFSDBFile 和 GridFSInputFile 的相關操作
GridFSDBFile 和 GridFSInputFile 分別表示從數據庫中讀取的文件和將要保存到數據庫中的文件。GridFS 類的部分操作是借助這兩個類的實例實現的。
// 根據特定查詢刪除文件 // 調用了 GridFSDBFile.remove 方法 public void remove( DBObject query ){ for ( GridFSDBFile f : find( query ) ){ f.remove(); } } // 根據指定名稱創建文件 // 返回的是 GridFSInputFile 類的實例 // 可以通過 GridFSInputFile 類的實例的 save 方法保存修改 public GridFSInputFile createFile(String filename) { return new GridFSInputFile( this , filename ); }