我的家園

          我的家園
            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 );
              }
          





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


          網站導航:
           
          主站蜘蛛池模板: 江油市| 兴国县| 普洱| 繁峙县| 二手房| 阜新| 特克斯县| 厦门市| 枣阳市| 渭源县| 常州市| 武冈市| 宣武区| 涞源县| 双辽市| 娱乐| 紫阳县| 福海县| 德格县| 舞阳县| 建瓯市| 吉林省| 白朗县| 洛宁县| 盖州市| 高雄市| 上思县| 吉林省| 江油市| 涞水县| 江达县| 翁牛特旗| 宁远县| 延边| 突泉县| 调兵山市| 沂源县| 恩施市| 南召县| 监利县| 青州市|