MongoDB 的 GridFS 详细分析

from: http://www.open-open.com/lib/view/open1330171884015.html


GridFS简介

GridFSMongoDB中的一个内置功能,可以用于存放大量小文件。

http://www.mongodb.org/display/DOCS/GridFS

http://www.mongodb.org/display/DOCS/GridFS+Specification

GridFS使用

MongoDB提供了一个命令行工具mongofiles可以来处理GridFS,在bin目录下。

列出所有文件:

mongofiles list

上传一个文件:

mongofiles put xxx.txt

下载一个文件:

mongofiles get xxx.txt

查找文件:

mongofiles search xxx    //会查找所有文件名中包含“xxx”的文件

mongofiles list xxx //会查找所有文件名以“xxx”为前缀的文件

参数说明:

�Cd 指定数据库 ,默认是fsMongofiles list �Cd testGridfs

-u �Cp 指定用户名,密码

-h  指定主机

-port 指定主机端口

-c 指定集合名,默认是fs

-t 指定文件的MIME类型,默认会忽略

使用MongoVUE来查看,管理GridFS

MongoVUE地址:http://www.mongovue.com/

MongoVUE是个免费软件,但超过15天后功能受限。可以通过删除以下注册表项来解除限制:

[HKEY_CURRENT_USER\Software\Classes\CLSID\{B1159E65-821C3-21C5-CE21-34A484D54444}\4FF78130]

把这个项下的值全删掉就可以了。

java驱动上传下载文件:

下载地址:https://github.com/mongodb/mongo-java-driver/downloads

官方的文档貌似不是最新的,不过通过查看api来使用也不困骓。

http://api.mongodb.org/java/2.7.2/

以下代码基于mongo-2.7.3.jar


001 importjava.io.FileInputStream;
002 importjava.io.IOException;
003 importjava.io.InputStream;
004 importjava.net.UnknownHostException;
005 importjava.security.NoSuchAlgorithmException;
006
007 importcom.mongodb.BasicDBObject;
008 importcom.mongodb.DB;
009 importcom.mongodb.DBCollection;
010 importcom.mongodb.DBObject;
011 importcom.mongodb.Mongo;
012 importcom.mongodb.MongoException;
013 importcom.mongodb.gridfs.GridFS;
014 importcom.mongodb.gridfs.GridFSDBFile;
015 importcom.mongodb.gridfs.GridFSInputFile;
016
017 publicclassTest {
018 Mongo connection;
019 DB db;
020 DBCollection collection;
021 GridFS myFS;
022
023 String mongoDBHost = "127.0.0.1";
024 intmongoDBPort = 27017;
025 String dbName = "testGridfs";
026 String collectionName = "fs";
027
028 publicstaticvoidmain(String[] args) throwsMongoException, IOException, NoSuchAlgorithmException {
029 Test t = newTest();
030
031 String fileName = "F:/CPU.txt";
032 String name = "CPU.txt";
033
034 //把文件保存到gridfs中,并以文件的md5值为id
035 t.save(newFileInputStream(fileName), name);
036
037 //据文件名从gridfs中读取到文件
038
039 GridFSDBFile gridFSDBFile = t.getByFileName(name);
040 if(gridFSDBFile != null){
041 System.out.println("filename:"+ gridFSDBFile.getFilename());
042 System.out.println("md5:"+ gridFSDBFile.getMD5());
043 System.out.println("length:"+ gridFSDBFile.getLength());
044 System.out.println("uploadDate:"+ gridFSDBFile.getUploadDate());
045
046 System.out.println("--------------------------------------");
047 gridFSDBFile.writeTo(System.out);
048 }else{
049 System.out.println("can not get file by name:"+ name);
050 }
051 }
052
053 publicTest() throwsUnknownHostException, MongoException, NoSuchAlgorithmException {
054 _init();
055 }
056
057
058 publicTest(String mongoDBHost, intmongoDBPort, String dbName,
059 String collectionName) throwsUnknownHostException, MongoException, NoSuchAlgorithmException {
060 this.mongoDBHost = mongoDBHost;
061 this.mongoDBPort = mongoDBPort;
062 this.dbName = dbName;
063 this.collectionName = collectionName;
064 _init();
065 }
066
067
068 privatevoid_init() throwsUnknownHostException, MongoException, NoSuchAlgorithmException{
069 connection = newMongo(mongoDBHost, mongoDBPort);
070 db = connection.getDB(dbName);
071 collection = db.getCollection(collectionName);
072 myFS = newGridFS(db);
073 }
074
075 /**
076 * 用给出的id,保存文件,透明处理已存在的情况
077 * id 可以是string,long,int,org.bson.types.ObjectId 类型
078 * @param in
079 * @param id
080 */
081 publicvoidsave(InputStream in, Object id){
082 DBObject query  = newBasicDBObject("_id", id);
083 GridFSDBFile gridFSDBFile = myFS.findOne(query);
084
085 if(gridFSDBFile != null)
086 return;
087
088 GridFSInputFile gridFSInputFile = myFS.createFile(in);
089 gridFSInputFile.save();
090 return;
091 }
092
093 /**
094 * 据id返回文件
095 * @param id
096 * @return
097 */
098 publicGridFSDBFile getById(Object id){
099 DBObject query  = newBasicDBObject("_id", id);
100 GridFSDBFile gridFSDBFile = myFS.findOne(query);
101 returngridFSDBFile;
102 }
103
104 /**
105 * 据文件名返回文件,只返回第一个
106 * @param fileName
107 * @return
108 */
109 publicGridFSDBFile getByFileName(String fileName){
110 DBObject query  = newBasicDBObject("filename", fileName);
111 GridFSDBFile gridFSDBFile = myFS.findOne(query);
112 returngridFSDBFile;
113 }
114 }


你可能感兴趣的:(数据库,search,密码,用户名)