1、聚合
聚合:聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果
测试数据db.stu.insert([{name:"a", hometown: '东北', age: 20, gender: true},{name:"b", hometown: '长沙', age: 18, gender: false},{name:"c ", hometown: '武汉', age: 18, gender: false},{name:"d", hometown: '华山', age: 40, gender: true},{name:"e", hometown: '山东', age: 16, gender: true},{name:"f", hometown: '江苏', age: 45, gender: true},{name:"g", hometown: '大理', age: 18, gender: true}])
常见的管道有
① $group:将集合中的文档分组,可用于统计结果
② $match:过滤数据,只输出符合条件的文档
③ $sort:将输入文档排序后输出
④ $limit:限制聚合管道返回的文档书
⑤ $skip:跳过指定数量的文档,并返回余下的文档
常见的表达式有
① $sum: 计算总和, $sum:1 表示以⼀倍计数0表示0倍2表示2倍
② $avg: 计算平均值
③ $min: 获取最⼩值
④ $max: 获取最⼤值
⑤ $push: 在结果⽂档中插⼊值到⼀个数组中
⑥ $first: 根据资源⽂档的排序获取第⼀个⽂档数据
⑦ $last: 根据资源⽂档的排序获取最后⼀个⽂档数据
表达式要配合管道使用
1.1group的具体应用
$group将集合中的文档分组,课用于统计结果
_id表示分组的依据,使用某个字段的格式为 ‘$字段’
通过性别分组并且分别人数db.stu.aggregate({$group:{_id:$gender}},count:{$sum:1})
按照gender分组,获取不同组的平均年龄db.stu.aggregate({$group:{_id:'$gender',avg_age:{$avg:'$age'}}})
1.2match的具体应用
match是管道命令,能将结果交给后一个管道,查询年龄大于20的学生db.stu.aggregate({$match:{age:{$gt:20}}})
询年龄大于20的男生,女生人数db.stu.aggregate({$match:{age:{$gt:20}}},{$group:{_id:'$gender',count:{$sum:1}}})
1.3distinct的应用
通过key快速区分集合中的不同字段有哪些,比如person集合中的不同country有哪些
2、mongodb创建索引
创建索引的意义:加快查询速度,进行数据的去重
语法:db.集合名.ensureIndex({属性:1}),1表示升序, -1表示降序
测试数据for(i=0;i<100000;i++){db.test.insert({name:'test'+i,age:i})}
未创建索引之前通过普通查询一条数据要花费83毫秒db.test.find({name:'test9999'}).explain('executionStats')
根据这行命令可以显示查找的详细信息
创建索引db.test.ensureIndex({name:1})
创建索引后的查询db.test.find({name:'test9999'}).explain('executionStats')
查看索引db.test.getIndexes()
删除索引db.test.dropIndex({name:1})
3、mongodb和python的交互
3.1插入一条数据
import pymongo
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db =self.r['test']['stu']
def add(self,data):
self.db.insert_one(data)
if __name__ == '__main__':
a = mongodata()
a.add({'name':'北月'})
3.2插入多条数据
import pymongo
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db =self.r['test']['stu']
def add(self,data):
self.db.insert_many(data)
if __name__ == '__main__':
a = mongodata()
a.add([{'age':1},{'age':2},{'age':3}])
3.3查询一条数据
import pymongo
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db =self.r['test']['stu']
def get(self,data):
result = self.db.find_one(data)
return result
if __name__ == '__main__':
a = mongodata()
h = a.get({'name':'北月'})
print(h)
3.4查询多条数据
import pymongo
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db =self.r['test']['stu']
def get(self,data):
result = self.db.find(data)
return result
if __name__ == '__main__':
a = mongodata()
item = a.get({})
for every in item:
print(every)
根据主键查找要导入模块
3.5修改一条数据
import pymongo
# from bson import ObjectId
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db =self.r['test']['stu']
def get(self,data,query=None):
r = self.db.update_one(data,{'$set':query})
return r.modified_count
if __name__ == '__main__':
a = mongodata()
item = a.get({'name':'beiyue'},query={'name':'heiheihei'})
print(item)
# for every in item:
# print(every)
修改多条数据只需要将查询条件变为查询所有
3.6删除数据
删除一条用delet_one()删除多条用delet_many()
import pymongo
# from bson import ObjectId
class mongodata():
def __init__(self):
self.r = pymongo.MongoClient()
self.db = self.r['test']['stu']
def get(self, query=None):
r = self.db.delete_many(query)
return r.deleted_count
if __name__ == '__main__':
a = mongodata()
item = a.get({'name':'heiheihei'})
print(item)