日期:2014-05-16 浏览次数:20507 次
/** * 在数据库中为指定的 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 ); }
// 获取该 GRidFS 实例所属的 DB 实例 public DB getDB(){ return _db; }
// 获取用于遍历文件列表的 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; }
// 根据指定的 OBjectId 删除文件 // 需要同时删除文件基本信息和文件数据 public void remove( ObjectId id ){ _filesCollection.remove( new BasicDBObject( "_id" , id ) ); _chunkCollection.remove( new BasicDBObject( "files_id" , id ) ); }
// 根据特定查询删除文件 // 调用了 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 );