mongodb 与 python
pymongo 模块
安装 : sudo pip3 install pymongo
操作步骤
1. 创建mongodb的数据库连接对象
conn = pymongo.MongoClient('localhost',27017)
2. 生成数据库对象 (__setitem__ __getitem__)
db = conn.stu
db = conn['stu']
3. 生成集合对象
myset = db.class0
myset = db['class0']
4. 集合操作 (增删改查索引聚合)
5. 关禁数据库连接
conn.close()
插入操作
insert()
insert_many()
insert_one()
save()
查找操作
find()
功能 : 查找数据库内容
参数 : 同mongo shell find()
返回值: 返回一个结果游标
find_one()
功能:查询第一条符合条件的文档
参数: 同find()
返回值: 返回一个字典
* 在pymongo中所有操作符的用法同mongo shell相同,只是操作时加引号,以字符串的方式写入python代码
cursor对象的属性
next()
limit()
skip()
count()
sort()
pymongo -> sort([('age',1),('name',-1)])
mongo shell -> sort({age:1,name:-1})
* 使用for 或者next 使游标位置不再指向来头位置的时候调用limit skip sort就会报错
修改操作
update(query,update,upsert=False,multi=False)
update_many()
update_one()
删除操作
remove(query,multi = True)
multi默认是true表示删除所有query过滤文档
设置为False表示只删除第一个
* python中 True ==》 true
False ==》 false
None ===》 null
# -*- coding: utf-8 -*-
from pymongo import MongoClient
# 创建数据库连接
conn = MongoClient('localhost', 27017)
# 创建数据库对象
db = conn.stu
#db = conn['stu']
# 创建集合对象
myset = db.class4
# 数据操作
# 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':'乾隆'})
# myset.save({'_id':1,'name':'吴奇隆','King':'四爷'})
# 查找
# cursor = myset.find({},{'_id':0})
# print(cursor)
# for i in cursor:
# print(i['name'],'---',i['King'])
# dic = myset.find_one({},{'_id':0})
# print(dic)
# 操作符使用
myset1 = db.class0
# cursor = myset1.find({'age':{'$gt':18}},{'_id':0})
# for i in cursor:
# print(i)
# 获取下一条数据
# print(cursor.next())
# print(cursor.next())
# for i in cursor.skip(1).limit(3):
# print(i)
# for i in cursor.sort([('age',1),('name',-1)]):
# print(i)
# query = {'$or':[{'gender':'w'},{'age':{'$lt':19}}]}
# cursor = myset1.find(query,{'_id':0})
# for i in cursor:
# print(i)
# 修改
# myset1.update({'name':'Jame'},{'$unset':{'tel':''}})
# 同时修改多条文档
# myset1.update({'name':'Jame'},\
# {'$set':{'age':21}},multi = True)
# 如果匹配文档不存在则插入
# myset.update({'name':'梁家辉'},\
# {'$set':{'King':'咸丰'}},upsert = True)
# myset.update_many({'King':'咸丰'},\
# {'$set':{'name':'阿辉'}})
# myset.update_one({'King':'康熙'},\
# {'$set':{'kingName':'玄烨'}})
# 删除
# myset.remove({'King':'四爷'})
# 只删除一个符合条件的文档
# myset.remove({'King':'咸丰'},multi = False)
# myset1.remove({'gender':{'$exists':False}})
# 复合操作
# 查找king=咸丰 并删除
print(myset.find_one_and_delete({'King': '咸丰'}))
# 关闭连接
conn.close()
索引操作
ensure_index()
list_indexes()
drop_index()
drop_indexes()
聚合操作
aggregate([])
参数:和mongo shell一样
返回值:返回和find()函数相同的游标对象
聚合练习
grade数据库 class集合
1. 为所有人添加score域 值为
{'chinese':88,'math':77,'english':78}
from random import randint
cursor = myset.find()
for i in cursor:
update({'_id':i['_id']},{'$set':{'score':{'chinese':randint(60,100),'math':randint(60,100),'english':randint(60,100)}}})
2. 按照性别分组统计每组人数
3. 统计每名男生的语文成绩
4. 将女生按照英语成绩降序排列
# -*- coding: utf-8 -*-
from pymongo import MongoClient
conn = MongoClient('localhost', 27017)
db = conn.stu
myset = db.class0
# 索引操作
# 默认创建正向索引
# index = myset.ensure_index('name')
# print(index)
# 创建逆向索引
# index = myset.ensure_index([('age',-1)])
# 获取当前集合中索引
# for i in myset.list_indexes():
# print(i)
# 删除所有索引
# myset.drop_indexes()
# 删除单个索引
# myset.drop_index("name_1")
# 其他索引类型
# 复合索引
# myset.ensure_index([('name',1),('age',-1)])
# 唯一索引
# myset.ensure_index('name',\
# name = "MyIndex",unique = True)
# 稀疏索引
# myset.ensure_index('age',sparse = True)
# 聚合操作
myset1 = db.class4
p = [
{'$group': {'_id': '$King', 'count': {'$sum': 1}}},
{'$match': {'count': {'$gt': 1}}},
]
cursor = myset1.aggregate(p)
for i in cursor:
print(i)
conn.close()
pymongo 实现gridfs存储
import gridfs
GridFS()
功能: 生成grid数据库对象
存储小文件
import bson
bson.binary.Binary()
功能 : 将bytes格式子串转换为mongodb的二进制存储格式

浙公网安备 33010602011771号