python爬虫二十:mongodb的高级使用以及python操作mongodb

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)


在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值