zoukankan      html  css  js  c++  java
  • MongoDB修改与聚合二

    1.修改方法

    一 语法
        里面有三个大的语句:一个是查询条件;一个是修改字段;一个是其他参数(目前就有两个)
        db.table.update(
        条件,
        修改字段,
        其他参数
        )
    
    
        update db1.t1 set id=10 where name="egon";#这是sql语句的更新使用
    
        db.table.update(
        {},#这是查询条件
        {"age":11},
        {
            "multi":true,#这是删除查询到的所有数据
            "upsert":true#这是如果找不到这个数据,就新插入
        }
        )
    
        1、update db1.user set age=23,name="武大郎" where name="wupeiqi";
        #覆盖式更新就是替换掉查询到的数据,只能替换掉一个查询数据
        db.user.update(
            {"name":"wupeiqi"},
            {"age":23,"name":"武大郎"}
        )
        #局部修改:$set就是只更改这里面显示的字段。
        db.user.update(
            {"name":"alex"},
            {"$set":{"age":73,"name":"潘金莲-alex"}}
        )
    
        #改多条
        db.user.update(
            {"_id":{"$gte":1,"$lte":2}},
            {"$set":{"age":53,}},
            {"multi":true}
        )
        #有则修改,无则添加
        db.user.update(
            {"name":"EGON"},
            {"$set":{"name":"EGON","age":28,}},
            {
            "multi":true,
            "upsert":true
            }#这个就是参数
        )
    
        #修改嵌套文档
        db.user.update(
            {"name":"潘金莲-alex"},
            {"$set":{"addr.country":"Japan"}}#如果需要查询到里面有嵌套的数据用.就可以查到。
        )
    
        #修改数组
        db.user.update(
            {"name":"潘金莲-alex"},
            {"$set":{"hobbies.1":"Piao"}}#如果需要查询到里面有嵌套的数据用.就可以查到。
        )
    
        #删除字段
        db.user.update(
            {"name":"潘金莲-alex"},
            {"$unset":{"hobbies":""}}#删除一个字段
        )
    
        2、$inc
        db.user.update(
            {},
            {"$inc":{"age":1}},#增加用的,如果是正数就说明是增加,如果是负数,就是减少
            {"multi":true}
        )
    
        db.user.update(
            {},
            {"$inc":{"age":-10}},
            {"multi":true}
        )
    
        3、$push, $pop  $pull#对某个字段的添加或删除
        db.user.update(
            {"name":"yuanhao"},
            {"$push":{"hobbies":"tangtou"}},#对某一个字段是数组添加一个值
            {"multi":true}
        )
    
        db.user.update(
            {"name":"yuanhao"},
            {"$push":{"hobbies":{"$each":["纹身","抽烟"]}}},#对某一个字段是数组添加多个值别忘了用$each
            {"multi":true}
        )
    
        #从头删-1,从尾删1
        db.user.update(
            {"name":"yuanhao"},
            {"$pop":{"hobbies":-1}},#从开始删除
            {"multi":true}
        )
    
        db.user.update(
            {"name":"yuanhao"},
            {"$pop":{"hobbies":1}},#从后面删除
            {"multi":true}
        )
    
        #按条件删
        db.user.update(
            {"name":"yuanhao"},
            {"$pull":{"hobbies":"纹身"}},#"$pull" 把符合条件的统统删掉,而$pop只能从两端删
            {"multi":true}
        )
    
        #3、$addToSet#添加数据,不重复添加
        db.t3.insert({"urls":[]})
        db.t3.update(
            {},
            {"$addToSet":{"urls":{"$each":[
                "http://www.baidu.com",
                "http://www.baidu.com",
                "http://www.baidu.com",
                "http://www.baidu.com",
                "http://www.baidu.com"
            ]}}},
            {"multi":true}
        )
    View Code

    2.删除方法

    db.user.deleteOne({"_id":{"$gte":3}})#在这种方法可以删除查询到的一个
    db.user.deleteMany({"_id":{"$gte":3}})#这种方法可以删除查询到的所有值
    db.user.deleteMany({})#删除所有的的数据
    View Code

    3.聚合方法

    一:$match
        例:
            select post from db1.emp where age > 20 group by post having avg(salary) > 10000;#把这个拆分3句话
    
        #$match#查询的条件的标志
        #1、select post from db1.emp where age > 20#sql
        db.emp.aggregate({"$match":{"age":{"$gt":20}}}) #aggregate是聚合的标志
    
        #$group#分组
        #2、select post from db1.emp where age > 20 group by post;
        db.emp.aggregate(
            {"$match":{"age":{"$gt":20}}},
            {"$group":{"_id":"$post"}}
        )
    
        #3、select post,avg(salary) as avg_salary from db1.emp where age > 20 group by post;
        db.emp.aggregate(
            {"$match":{"age":{"$gt":20}}},
            {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}}}#这是显示的字段  #$salary是说明使用这个字段的值
        )
    
        #select post from db1.emp where age > 20 group by post having avg(salary) > 10000;
        db.emp.aggregate(
            {"$match":{"age":{"$gt":20}}},
            {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}}},
            {"$match":{"avg_salary":{"$gt":10000}}}
        )
    
    二:{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}#映射是说明生成新的并展示新的表
        例1:
        db.emp.aggregate(
            {"$project":{"_id":0,"name":1,"post":1,"annual_salary":{"$multiply":[12,"$salary"]}}},
            {"$group":{"_id":"$post","平均年薪":{"$avg":"$annual_salary"}}},
            {"$match":{"平均年薪":{"$gt":1000000}}},
            {"$project":{"部门名":"$_id","平均年薪":1,"_id":0}}
        )
    
        例2:#$subtract是两个相减
        db.emp.aggregate(
            {"$project":{"_id":0,"name":1,"hire_period":{"$subtract":[new Date(),"$hire_date"]}}}
        )
    
    
        db.emp.aggregate(
            {"$project":{"_id":0,"name":1,"hire_year":{"$year":"$hire_date"}}}#取时间段的年
        )
    
        db.emp.aggregate(
            {"$project":{"_id":0,"name":1,"hire_period":{"$subtract":[{"$year":new Date()},{"$year":"$hire_date"}]}}}#工作了几年
        )
    
        例3:
        db.emp.aggregate(
            {"$project":{"_id":0,"new_name":{"$toUpper":"$name"},}}#名字变成大写
        )
    
        db.emp.aggregate(
            {"$match":{"name":{"$ne":"egon"}}},#ne是比较运算里的
            {"$project":{"_id":0,"new_name":{"$concat":["$name","_SB"]},}}
        )
    
        db.emp.aggregate(
            {"$match":{"name":{"$ne":"egon"}}},
            {"$project":{"_id":0,"new_name":{"$substr":["$name",0,3]},}}#$substr是截取某段
        )
    
    三:{"$group":{"_id":分组字段,"新的字段名":聚合操作符}}
    
        #select post,max,min,sum,avg,count,group_concat from db1.emp group by post;
    
        db.emp.aggregate(
            {"$group":{
                "_id":"$post",
                "max_age":{"$max":"$age"},
                "min_id":{"$min":"$_id"},#$_id去找个字段的值
                "avg_salary":{"$avg":"$salary"},
                "sum_salary":{"$sum":"$salary"},
                "count":{"$sum":1},#获取个数的用法
                "names":{"$push":"$name"}
                }
            }
        )
    
    
    四:排序:$sort、限制:$limit、跳过:$skip
        db.emp.aggregate(
            {"$match":{"name":{"$ne":"egon"}}},
            {"$project":{"_id":1,"new_name":{"$substr":["$name",0,3]},"age":1}},
            {"$sort":{"age":1,"_id":-1}},
            {"$skip":5},
            {"$limit":5}
        )
    
    
    # 补充
    db.emp.aggregate({"$sample":{"size":3}})#随机去三个数
    View Code

    4.使用pymongo模块连接数据库

    from pymongo import MongoClient #pip3 install pymongo
    
    client=MongoClient("mongodb://root:123@127.0.0.1:27017")#连接数据库
    
    # db1=client.db1
    db1=client['db1']
    # print(db1.collection_names())
    
    # table_emp=db1.emp
    table_emp=db1['emp']
    rows=table_emp.find({"_id":{"$gt":10}})
    
    for row in rows:
        print(row)
    View Code

    爬虫提高方法的使用:

    1.同步调用

    import requests
    #同步或者异步是指提交数据的方式
    #同步是值原地等待提交任务返回结果
    #异步是指一个任务提交完了,直接提交下一个任务。
    def parse_page(res):
        print('PARSE %s' %(len(res)))
    
    def get_page(url):
        print('GET %s' %url)
        response=requests.get(url)
        if response.status_code == 200:
            return response.text
    
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.taobao.com',
            'https://www.openstack.org',
        ]
        for url in urls:
            res=get_page(url)
            parse_page(res)
    View Code

    2.多线程与多进程

    import requests
    from threading import Thread,current_thread
    
    def parse_page(res):
        print('%s PARSE %s' %(current_thread().getName(),len(res)))
    
    def get_page(url,callback=parse_page):
        print('%s GET %s' %(current_thread().getName(),url))
        response=requests.get(url)
        if response.status_code == 200:
            callback(response.text)
    
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.taobao.com',
            'https://www.openstack.org',
        ]
        for url in urls:
            t=Thread(target=get_page,args=(url,))
            t.start()
    View Code

    3.线程池与进程池

    import requests
    from threading import current_thread#这个是打印出来现在是哪个线程。
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    
    def parse_page(res):
        res=res.result()
        print('%s PARSE %s' %(current_thread().getName(),len(res)))
    
    def get_page(url):
        print('%s GET %s' %(current_thread().getName(),url))
        response=requests.get(url)
        if response.status_code == 200:
            return response.text#返回的是字符串。
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.taobao.com',
            'https://www.openstack.org',
        ]
        pool=ThreadPoolExecutor(50)#线程池
    
        for url in urls:
            pool.submit(get_page,url).add_done_callback(parse_page)
    
        pool.shutdown(wait=True)#这个是不在往里面放任务。
    View Code

    4.协程

    from gevent import joinall,spawn,monkey;monkey.patch_all()#协程
    import requests
    from threading import current_thread
    
    def parse_page(res):
        print('%s PARSE %s' %(current_thread().getName(),len(res)))
    
    def get_page(url,callback=parse_page):
        print('%s GET %s' %(current_thread().getName(),url))
        response=requests.get(url)
        if response.status_code == 200:
            callback(response.text)
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.taobao.com',
            'https://www.openstack.org',
        ]
    
        tasks=[]
        for url in urls:
            tasks.append(spawn(get_page,url))
    
        joinall(tasks)
    View Code

    5.使用asyncio

    import requests
    import asyncio
    import uuid
    
    User_Agent='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
    
    
    def parse_page(res):
        with open('%s.html' %uuid.uuid1(),'wb') as f:
            f.write(res)
    
    @asyncio.coroutine
    def get_page(host,port=80,url='/',ssl=False,callback=parse_page):
    
        #1、建立连接
        if ssl:
            port=443
        print('下载:https:%s:%s:%s' %(host,port,url))
        recv,send=yield from asyncio.open_connection(host=host,port=port,ssl=ssl)
    
        #2、封装请求头
        request_headers="""GET %s HTTP/1.0
    Host: %s
    User-Agent: %s
    
    """ %(url,host,User_Agent)
        request_headers=request_headers.encode('utf-8')  # socket发送的是bytes类型转成字节形式
    
        #3、发送请求头
    
        send.write(request_headers)
        yield from send.drain()   #这是发送
    
        #4、接收响应头
        while True:
            line=yield from recv.readline()
            if line == b'
    ':
                break
            print('%s 响应头: %s' %(host,line))
    
        #5、接收响应体
        text=yield from recv.read()
        # print(text)
        #6、执行回调函数完成解析
        callback(text)
    
        #7、关闭
        send.close()
    
    if __name__ == '__main__':
        tasks=[
            get_page(host='www.baidu.com',url='/s?wd=美女',ssl=True),
            get_page(host='www.cnblogs.com',url='/linhaifeng/articles/7806303.html',ssl=True)
        ]
    
    
        loop=asyncio.get_event_loop()
        loop.run_until_complete(asyncio.wait(tasks))
        loop.close()
    View Code
  • 相关阅读:
    EBS SQL > Form & Report
    oracle sql 优化分析点
    MRP 物料需求计划
    MRPII 制造资源计划
    Barcode128 应用实务
    Oracle SQL语句优化技术分析
    APPSQLAP10710 Online accounting could not be created. AP Invoice 无法创建会计分录
    Oracle数据完整性和锁机制
    ORACLE Responsibility Menu Reference to Other User
    EBS 常用 SQL
  • 原文地址:https://www.cnblogs.com/1a2a/p/8330590.html
Copyright © 2011-2022 走看看