MongoDB Java Driver 源码分析(11):GridFS 类

  GridFS 类在 com.mongodb.gridfs 包中的地位类似于 Mongo 类在 com.mongodb 包的作用,主要是提供对外的接口。
  它的各个方法是分别委托给不同的类执行的,尤其是 DBColletion 类的实例 _filesCollection 和 _chunkCollection 。

  我们先看看它的构造函数:
[code]
/**
* 在数据库中为指定的 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 );
}
[/code]
  可以看到,在构造函数中为属性 _db,_filesCollection ,_chunkCollection 进行了赋值,后续的操作都需要委托给这些属性。

[size=medium][align=center][b]_db 的相关操作 (数据库级别的操作)[/size][/b][/align]
[code]
// 获取该 GRidFS 实例所属的 DB 实例
public DB getDB(){
return _db;
}
[/code]
[size=medium][align=center][b]_filesCollection 的相关操作(针对文件基本信息的操作)[/b][/align][/size]
[code]
// 获取用于遍历文件列表的 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;
}
[/code]

[size=medium][align=center][b]_chunkCollection 的相关操作(针对文件数据的操作)[/b][/align][/size]
[code]
// 根据指定的 OBjectId 删除文件
// 需要同时删除文件基本信息和文件数据
public void remove( ObjectId id ){
_filesCollection.remove( new BasicDBObject( "_id" , id ) );
_chunkCollection.remove( new BasicDBObject( "files_id" , id ) );
}
[/code]

[size=medium][align=center][b] GridFSDBFile 和 GridFSInputFile 的相关操作[/b][/align][/size]

  GridFSDBFile 和 GridFSInputFile 分别表示从数据库中读取的文件和将要保存到数据库中的文件。GridFS 类的部分操作是借助这两个类的实例实现的。

[code]
// 根据特定查询删除文件
// 调用了 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 );
}
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值