笔记_mongo_04_python操作

版权声明:根据课题笔记整理复制而来 https://blog.csdn.net/weixin_42587525/article/details/83589289

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

操作步骤:

  1. 创建mongodb数据库连接对象
    conn = pymongo.MongoClient('localhost', 27017)

  2. 生成要操作的数据库对象
    db = conn.stu  或 db = conn['stu']

  3. 生成操作的集合对象
    myset = db.class0 或 myset = db['class0']

  4. 通过集合对象调用函数进行数据库连接

  5. 关闭数据库连接
    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

  1. 连接数据库,生成数据库对象(db)

  2. 生成gridfs对象
    fs = gridfs.GridFS(db)

  3. 通过fs获取存储的文件集合
    files = fd.find( )

  4. 挑选想获取的文件进行读取

@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文件存储

  1. 连接数据库,生成数据库对象(db)
  2. 生成gridfs对象
    fs = gridfs.GridFS(db)
  3. 通过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( ) 

猜你喜欢

转载自blog.csdn.net/weixin_42587525/article/details/83589289