看教程不够直观,那就看视频吧! >>点击加载视频
对于MongoDB这种Document数据库,一个Collection对应关系型数据库的表,一个Document对应关系型数据库的一条记录。
那么问题来了?关系型数据库比如MySQL一条记录的大小是有一定限制的,那么MongoDB的Document大小有限制吗?
答案是有的。MongoDB的一个Document最大为16MB,那么大于16MB的Document该怎么存储?
这个就要用到MongoDB的GridFS了,从字面上理解GridFS就是想格子一个文件系统,所谓的格子,在MongoDB里面就是
chunk,把文件(任何文件都行,不只是能够存在数据库里面的结构化的文件也可以是非结构化的文本数据)分为若干个chunk
存储,这个chunk又可以是分布式的,也就是说可以存储到不同的主机,可以减轻每台主机的IO问题。
那GridFS这么好该怎么用呢?以下以PyMongo为例说明,其他驱动都差不多。
首先引入Pymongo和GridFS:
import pymongo
from gridfs import GridFS
建立MongoDB实例:
mongo = pymongo.MongoClient('mongodb://user:pwd@localhost:27017/db')
采用的URI的方式,具体形式是这样的:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
建立GridFS实例:
fs = GridFS(mongo.get_database('db'))
GridFS的第一个参数是mongo的一个数据库对象:
比如我现在有一个字符串'foo\nbar\n', 我想把这个字符串写入一个叫foo.txt的文件里就可以这么做:
txt = 'foo\nbar\n'
Python3这里有一个问题就是fs.put方法的第一个参数必须是bytes对象,也就是我们得把txt编码成字节才行:
fs.put(txt.encode('ascii'), filename='foo.txt')
那么db这个数据库里面就会出现两个表fs.files和fs.chunks两个表,分别是文件属性表和真正的文件chunk表。两个表之间通过file_id对应起来。
如果过了几天我想用这个文件该怎么用呢?
f = fs.find_one({'filename': 'foo.txt'})
注意这里传入的是一个字典,这是MongoDB的风格。
find_one方法的返回值是一个GridOut对象,具有read、readline等方法,你可以选择按行读还是一次读取所有的chunk。
在Python3里read、readline的返回值是bytes对象,需要decode才行。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!