转载请注明出处:https://blog.csdn.net/l1028386804/article/details/79995659
GridFS 使用两个表来存储数据:
1) files 包含元数据对象
2) chunks 包含其他一些相关信息的二进制块
为了使多个 GridFS 命名为一个单一的数据库,文件和块都有一个前缀,默认情况下,前缀是fs,所以任何默认的 GridFS 存储将包括命名空间 fs.files 和 fs.chunks。各种第三方语言的驱动有权限改变这个前缀,所以你可以尝试设置另一个 GridFS 命名空间用于存储照片,它的具体位置为:photos.files 和 photos.chunks。
mongofiles 是从命令行操作 GridFS 的一种工具,例如我们将”mongosniff”这个文件存到库里面,具体用法如下:
[root@localhost bin]# ./mongofiles put testfile
connected to: 127.0.0.1
added file: { _id: ObjectId('4fc60175c714c5d960fff76a'), filename: "testfile", chunkSize: 262144,
uploadDate: new Date(1338376565745), md5: "8addbeb77789ae6b2cb75deee30faf1a", length:
16 }
done!
下面我们查一下看库里有哪些 GridFS 文件,在”mongofiles”后加一个参数”list”即可
[root@localhost bin]# ./mongofiles list
connected to: 127.0.0.1
testfile 16
接下来我们进库里看一下是否有新的东西
[root@localhost bin]# ./mongo
MongoDB shell version v3.4.7
connecting to: test
> show collections
fs.chunks --上文提到的 fs.chunks
fs.files --上文提到的 fs.files
system.indexes
system.js
>
我们继续查看 fs.files 中的内容
> db.fs.files.find()
{ "_id" : ObjectId("4fc60175c714c5d960fff76a"), "filename" : "testfile", "chunkSize" : 262144,
"uploadDate" : ISODate("2012-05-30T11:16:05.745Z"), "md5" :
"8addbeb77789ae6b2cb75deee30faf1a", "length" : 16 }
字段说明:
看来 fs.files 中存储的是一些基础的元数据信息
我们继续查看 fs.chunks 中的内容
> db.fs.chunks.find()
{ "_id" : ObjectId("4fc60175cf1154905d949336"), "files_id" :ObjectId("4fc60175c714c5d960fff76a"), "n" : 0, "data" :BinData(0,"SGVyZSBpcyBCZWlqaW5nCg==") }
其中比较重要的字段是”n”,它代表的是 chunks 的序号,此序号从 0 开始,看来 fs.chunks中存储的是一些实际的内容数据信息
[root@localhost bin]# rm testfile
rm:是否删除 一般文件 “testfile”? y --先删文件
[root@localhost bin]# ./mongofiles get testfile --将其从库里取出来
connected to: 127.0.0.1
done write to: testfile
[root@localhost bin]# md5sum testfile --校验 md5,结果跟库里相同
8addbeb77789ae6b2cb75deee30faf1a testfile
[root@localhost bin]#
db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});
这样,一个块就可以利用它的 files_id 和 n 的值进行检索。注意, GridFS仍然可以用 findOne得到第一个块,如下:
db.fs.chunks.findOne({files_id: myFileID, n: 0});