一、游标
通过一定的操作获取返回结果的对象
var cursor = db.class0.find() 创建游标
cursor.hasNext() 查看是否有下一个数据
cursor.next() 获取下一个数据
通过Python 操作mongodb数据库
二、pymongo模块
Python的第三方模块
安装
sudo pip3 install pymongo
操作步骤
1. 创建mongo数据库的链接对象
conn = pymongo.MongoClient('localhost',27017)
2. 生成数据库对象
db = conn.stu
3. 生成集合对象
my_set = db.class0
4. 增删改差索引聚合操作
调用各种myset的属性函数
5. 关闭数据库连接
conn.close()
三、数据库编程
1、插入数据
insert()
insert_many()
insert_one()
save()
2、数据查找
cursor = find()
功能:查找数据库内容
参数:同 mongo shell find()
返回值:返回一个迭代器游标
cursor对象的属性函数
next()
count()
limit()
skip()
sort()
mongoshell ---> sort({'name':1})
pymongo ---> sort([('name',1)])
* 进行排序时游标要确保没有被访问过
* 使用了next或者for取游标后就不能使用limit sort操作了
find_one()
返回值是一个字典
2、修改操作
update(query,updata,upsert=False,multi=False)
update_many() 匹配到多个文档时全部修改
update_one() 只修改匹配到的第一条文档
* 变成中mongo的数据类型null 可以用Python中的 None替代
3、删除数据
remove(query,multi = True)
multi 默认为True 表示删除所有符合条件的数据
设置为False 表示只删除一条
4、复合功能函数
find_one_and_delete()
5、索引
创建索引
ensure_index()
create_index()
create_indexes() 创建多个索引
查看集合中的索引
list_indexes()
删除索引
drop_index() 删除某一个索引
drop_indexes() 删除所有索引
6、聚合操作
aggregate([])
参数:与mongoshell中聚合参数写法一致
返回值:返回一个迭代游标 同find的返回值
7、GridFS 程序提取
import gridfs
gridfs.GridFS(db)
插入二进制格式数据
import bson.binary
四、示例
1、pymongo模块的基本使用
from pymongo import MongoClient
#创建数据库链接
conn = MongoClient("localhost",27017)
#创建数据库对象 __getitem__ __setitem__
db = conn.stu
# db = conn['stu']
#创建集合对象
myset = db.class5
# myset = db['class']
# print(dir(myset))
#插入操作
# myset.insert({'name':"张铁林",'King':'乾隆'})
# myset.insert([{'name':'张国立','King':'康熙'},{'name':'陈道明','King':'康熙'}])
# myset.insert_many([{'name':'唐国强','King':'雍正'},{'name':'陈建斌','King':'雍正'}])
# myset.insert_one({'name':'郑少秋','King':'乾隆'})
# myset.save({'_id':1,'name':'吴奇隆','King':'雍正'})
#查找操作
# cursor = myset.find({},{'_id':0})
# for i in cursor:
# print(i['name'],'----',i['King'])
# myset = db.class1
# cursor = myset.find({'age':{'$gt':15}},{'_id':0})
# for i in cursor:
# print(i)
# print(cursor.next()) #取下一个值
# print(cursor.count()) #统计数量
# print(cursor.limit(2)) #取前几个文档
# print(cursor.skip(2)) #跳过前几个文档
# for i in cursor.sort([('age',1),('name',-1)]):
# print(i)
# dic = {'$or':[{'age':{'$gt':16}},{'sex':'w'}]}
# data = myset.find_one(dic,{'_id':0})
# print(data)
#修改操作
# myset.update({'name':'张国立'},{'$set':{'name':'国立'}})
#如果文档不存在则插入
# myset.update({'name':'冰冰'},{'$set':{'King':'武则天'}},upsert = True)
# myset.update({'King':'乾隆'},{'$set':{'king_name':'弘历'}},multi = True)
#删除操作
# myset.remove({'name':'冰冰'})
#只删除第一条符合条件的数据
# myset.remove({'King':'乾隆'},multi = False)
#find_one查找并删除
print(myset.find_one_and_delete({'name':'吴奇隆'}))
#关闭链接
conn.close()
2、索引
from pymongo import MongoClient
#创建数据库链接
conn = MongoClient("localhost",27017)
#创建数据库对象
db = conn.stu
#创建集合对象
myset = db.class5
#创建索引
# index = myset.ensure_index('name')
# print(index) #索引名称
#复合索引
# index = myset.ensure_index([('name',1),('age',-1)])
# print(index)
# 创建其他类型索引
# index = myset.ensure_index('name',unique = True,sparse = True)
# print(index)
#查看当前索引
# for i in myset.list_indexes():
# print(i)
#删除索引
# myset.drop_index('name_1')
#删除所有索引
# myset.drop_indexes()
#聚合
l = [
{'$group':{'_id':'$King','num':{'$sum':1}}},
{'$match':{'num':{'$gt':1}}}
]
cursor = myset.aggregate(l)
for i in cursor:
print(i)
conn.close()
3、存文件
from pymongo import MongoClient
import bson.binary
conn = MongoClient("localhost",27017)
db = conn.images
myset = db.jpg
#存储
# f = open('file.jpg','rb')
# #格式转换为mongodb能存储的格式
# content = bson.binary.Binary(f.read())
# myset.insert({'filename':'file.jpg','data':content})
#获取文件
data = myset.find_one({'filename':'file.jpg'})
# data['filename'] 文件名
# data['data'] 文件内容
#通过字典获取内容写入到本地文件
with open(data['filename'],'wb') as f:
f.write(data['data'])
conn.close()
4、读取文件
#用来获取数据库中gridfs的存储文件
from pymongo import MongoClient
#和pymongo 绑定的
import gridfs
conn = MongoClient('localhost',27017)
db = conn.grid
#获取gridfs对象
fs = gridfs.GridFS(db)
#所有文件的游标
files = fs.find()
# print(files)
# print(files.count())
# 代表每个文件的对象
# for file in files:
# print(file.filename)
for file in files:
if file.filename == 'abc.mp4':
with open(file.filename,'wb') as f:
while True:
#file的read()函数可以获取文件内容
data = file.read(4096)
if not data:
break
f.write(data)
conn.close()