我的家園

          我的家園
            GridFS 類在 com.mongodb.gridfs 包中的地位類似于 Mongo 類在 com.mongodb 包的作用,主要是提供對外的接口。
            它的各個方法是分別委托給不同的類執行的,尤其是 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 );
              }
          





          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 曲靖市| 深泽县| 新沂市| 盐津县| 留坝县| 堆龙德庆县| 湘阴县| 房产| 海宁市| 南澳县| 陇西县| 蛟河市| 泰和县| 柳江县| 荔浦县| 衡阳县| 塔河县| 开封县| 寿宁县| 勃利县| 桑日县| 城固县| 三亚市| 遂川县| 青龙| 合水县| 江山市| 浪卡子县| 建湖县| 湘西| 玉林市| 壶关县| 潼南县| 静安区| 越西县| 林甸县| 滕州市| 六安市| 仁化县| 龙川县| 百色市|