mongo_04_python操作
固定集合
指的是mongodb中创建的固定大小集合,称之为固定集合。
特点:
能够淘汰早期数据, 可以控制集合的大小, 插入查找速度较快。
使用:
日志处理, 临时缓存。
创建:
db.createCollection(collection, {capped: true,size: 10000,max: 100})
- capped:true 创建固定集合
- size:10000 固定集合的大小(字节)
- max:1000 最多存放多少条文档
eg.:
创建固定集合log, 设置size 1000, max 3
db.createCollection(‘log’,{capped: true, size: 1000, max: 3})
文件的存储
文件存储数据库的方式
1.存储路径:将本地文件所在的路径以字符串存储到数据库。
优点:节省书库空间。
缺点:当数据库或者文件发生移动时必须要修改数据库内容。
2.存储文件本身:将文件转换为二进制存储到数据库。
优点:文件随数据库移动,数据库在文件就在
缺点:占用数库空间大,存储效率低
GridFS 文件存储方案
目的:
更好的存储mongodb中超过16M的大文件
方案解释:
在mongodb数据库中创建两个集合,共同存储文件,一个存储文件信息,一个存出文件内容,两个集合相互配合。
两个集合如下:
- fs.files: 存储文件信息(文件名,文件大小等)
- fs.chunks: 以mongodb二进制格式存储文件内容
文件的存储:
mongofiles -d dbname(数据库名) put files(要存储的文件)
注1:数据库不存在,则会自动创建
eg.:
将某路径下的111.mp3文件 存储到grid库中 (没有grid库则会新创建一个)
mongofiles -d grid put …/111.mp3
文件的获取:
mongofiles -d dbname get files
注:file目标文件为fs.files集合文档中的‘filename’
eg.:
从grid数据库中获取文件111.mps
mongofiles -d grid get ./111.mp3
优点: 存储方便,提供可靠的命令,方便数据库移动.
缺点: 读写效率低,不建议用来存储小文件.
mongo shell 对 javascript
在mongo shell 下可以直接运行基本的 js 代码。
游标:获取数据库操作结果集合的量。
var cursor = db.class0.find( ) #获取游标
cursor.next( ) #通过游标获取文档内容
cursor.hasNext( ) #查看是否有下一个文档
python操作
pymongo (第三方python模块)
安装:sudo pip3 install pymongo
操作步骤:
-
创建mongodb数据库连接对象
conn = pymongo.MongoClient('localhost', 27017)
-
生成要操作的数据库对象
db = conn.stu
或db = conn['stu']
-
生成操作的集合对象
myset = db.class0
或myset = db['class0']
-
通过集合对象调用函数进行数据库连接
-
关闭数据库连接
conn.close( )
示例:
@import “./code/mongo.py”
from pymongo import MongoClient
# 创建数据连接
conn = MongoClient('localhost', 27017)
#创建数据库(stu)对象
db = conn.stu
#创建集合对象
myset = db.class4
#数据操作
...
插入操作
insert( ) 插入一条或多条文档
insert_many( ) 插入多条文档
insert_one( ) 插入一个文档
save( ) 插入一条或多条文档,当有_id域时,_id域重复会替换原文档。
(pymongo中save参数是字典,不能为列表))
...
#插入文档
myset.insert_many([{'name':'张铁林','king':'乾隆'},{'name':'张国立','king':'康熙'}])
myset.insert_one({'name':'任贤齐','role':'杨过'})
myset.insert([{'name':'李若彤','role':'小龙女'},{'name':'刘亦菲','role':'王语嫣'}])
myset.save({'name':'胡军','role':'萧峰'})
myset.save({'_id':1, 'name':'李亚鹏', 'role':'郭靖'})
myset.save({'_id':1, 'name':'林志颖', 'role':'段誉'})
...
查找操作
find( )
功能: 查找所有文档
参数: 同mongo shell 中的find
返回: 游标变量
注1:pymongo中,在操作数据库时,mongodb shell中所有的操作符($sum等)均使用引号引起来,当做字符串传入。
注2:mongodb中,true /false使用python的True /False即可,null使用python的None即可。
- cursor游标对象属性函数
next( ) 获取下一个文档
limit( ) 显示前几条文档
skip( ) 跳过前几条显示后面的内容
count( ) 统计计数
sort( ) 排序
pythongo: sort([(‘age’,1)(‘name’,1)])
mongo shell: sort({age:1,name:-1})
注1:当使用游标对象(cursor)对象调用limit /skip /sort等函数取值时,要求游标必须是初始游标,即没有被for 或者next取值过。
find_one( )
功能: 查找一条文档
参数: 同find
返回值: 一个字典(注:与find方法不同,find返回的是一个函数对象)
#查找操作
cursor = myset.find({'role':{'$exists':True} },{'_id': 0})
print(cursor) #得到一个函数对象
for i in cursor:
print(i['name'],'***',i['role'])
print(cursor.next( )) #打印下一条文档
print(cursor.next( ))
for i in cursor.skip(1).limit(3):#跳过第一条,取后2条文档
print(i)
for i in cursor.sort([('name', 1)]):
for i in cursor.sort([('name', 1),('role',-1)]): #复合排序
print(i)
dic = {'$or':[{'role':{'$exists':False}},{'name':'古天乐'}]}
d = myset.find_one(dic)
print(d)
修改操作
update( )
update_one( )
update_many( )
#修改操作
myset.update_one({'king':{'$exists':True}},{'$set':{'name':'陈小春','king':'韦小宝'}})
myset.update_many({'king':{'$exists':True}},{'$rename':{'king':'role'}})
myset.update({'name':'张国立'},{'$set':{'name':'张卫健'}})
myset.update({'name':'高圆圆'},{'$set':{'role':'周芷若'}}, upsert=True)
删除操作
remove(query, multi=True)
注:默认(True)删除多个,当multi设置为False时,删除一个
delete( )
delete_one( )
delete_many( )
#删除操作
myset.delete_one({'name':'张铁林'})
myset.delete_many({'role':'康熙'})
myset.remove({'name':'林志颖'})
索引聚合操作
createIndex( )
功能: 创建索引
参数: 域名,则默认对该域创建正向索引,
传入列表,列表中每个二维元组代表一个索引项
eg.: [(‘age’,-1)] #对age创建逆向索引
list_indexes( ) 查看索引
drop_index( ) 删除一个索引
drop_indexes( ) 删除所有索引
聚合操作
aggregate([ ])
参数: 同mongodb shell中的聚合
返回值: 返回一个和find函数相同的游标对象
示例:@impoet “./code/mongo1.py”
from pymongo import MongoClient
# 创建数据连接
conn = MongoClient('localhost', 27017)
#创建数据库(stu)对象
db = conn.stu
#创建集合对象
myset = db.class0
#创建索引
# index_name = myset.create_index('name')
# print(index_name)
# index_name = myset.create_index([('age',-1)]) #逆向索引
# #查看索引
# for i in myset.list_indexes( ):
# print(i)
#删除索引
# myset.drop_index('name_1')
# myset.drop_indexes( ) #删除所有索引(不删除_id)
#其他索引类型
# index = myset.create_index('name',unique=True,sparse=True)#为name创建唯一/稀疏索引
#聚合操作
l = [{'$group':{'_id':"$sex",'num':{'$sum':1}}}]
cursor = myset.aggregate(l)
for i in cursor:
print(i)
conn.close( )
文件操作
GridFS文件提取
import gridfs
-
连接数据库,生成数据库对象(db)
-
生成gridfs对象
fs = gridfs.GridFS(db)
-
通过fs获取存储的文件集合
files = fd.find( )
-
挑选想获取的文件进行读取
@import “./code/grid_read.py”
from pymongo import MongoClient
import gridfs
#获取数据库对象
conn = MongoClient('localhost', 27017)
db = conn.grid
#获取文件集合对象
fs = gridfs.GridFS(db)
#获取文件集
files = fs.find( )
for file in files:
# print(file.filename) #filename获取文件名称
if file.filename == './Fairy In The Midnight [mqms2].mp3':
with open(file.filename,'wb') as f:
#从数据库读取
data = file.read( )
#写入本地
f.write(data)
conn.close( )
GridFS文件存储
- 连接数据库,生成数据库对象(db)
- 生成gridfs对象
fs = gridfs.GridFS(db)
- 通过fs.put( )函数将读取出来的文件内容存入数据库
fs.put(data, filesname)
参数: data 要存入的二进制内容
filesname 文件存入的名称
@import “./code/grid_write.py”
from pymongo import MongoClient
import gridfs
#获取数据库对象
conn = MongoClient('localhost', 27017)
db = conn.grid
#获取文件集合对象
fs = gridfs.GridFS(db)
#将本地文件读取出来,写入到数据库中
with open('./444.mp3','rb') as f:
fs.put(f.read( ), filename='mm.jpg')
conn.close( )