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的二进制存储格式

posted on 2018-10-26 12:09  蓝天梦nice  阅读(507)  评论(0)    收藏  举报

导航