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}
)
2.删除方法
db.user.deleteOne({"_id":{"$gte":3}})#在这种方法可以删除查询到的一个
db.user.deleteMany({"_id":{"$gte":3}})#这种方法可以删除查询到的所有值
db.user.deleteMany({})#删除所有的的数据
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}})#随机去三个数
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)
爬虫提高方法的使用:
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)
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()
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)#这个是不在往里面放任务。
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)
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\r\nHost: %s\r\nUser-Agent: %s\r\n\r\n""" %(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'\r\n':
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()
MongoDB修改与聚合二的更多相关文章
- 【mongodb系统学习之十二】mongodb修改数据(一)
十二.mongodb修改数据:update 1).修改数据库数据:update:语法 db.collectionName.update({},{},boolean,boolean): 2).updat ...
- MongoDB学习:(二)MongoDB简单使用
MongoDB学习:(二)MongoDB简单使用 MongoDB使用: 执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面 >mongo 提示该错误,说明我们系统缺少一个补丁,该 ...
- Mongodb更新数组$pull修饰符 (mongodb 修改器($inc/$set/$unset/$push/$pop/upsert))
mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)) https://www.jb51.net/article/112588.htm http://bl ...
- [转]搭建高可用mongodb集群(二)—— 副本集
在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...
- 搭建高可用mongodb集群(二)—— 副本集
在上一篇文章<搭建高可用MongoDB集群(一)——配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...
- mongodb修改器
mongodb修改器 转载自:http://blog.csdn.net/mcpang/article/details/7752736 mongodb修改器(\(inc/\)set/\(unset/\) ...
- vue.js+socket.io+express+mongodb打造在线聊天[二]
vue.js+socket.io+express+mongodb打造在线聊天[二] 在线地址观看 http://www.chenleiming.com github地址 https://github. ...
- 转:mongoDB 修改 ulimit
转自:http://blog.yucanlin.cn/2015/03/23/mongodb-%E4%BF%AE%E6%94%B9-ulimit/ mongoDB 修改 ulimit 一切都源于mong ...
- 注册MongoDB为系统服务(二)
注册MongoDB为系统服务(二)http://blog.csdn.net/qq_35685189/article/details/52304245
随机推荐
- c++语言的输入输出流库
1.c++语言标准输入输出流 <1>控制符的用法 #include <iostream> #include <iomanip> using namespace st ...
- [转]微擎应用笔记3--manifest.xml文件使用说明
本文转自:https://blog.csdn.net/seven_north/article/details/79508121 微擎在安装或卸载模块时会根据manifest.xml生成(或删除)数据库 ...
- T-SQL:排除阻塞(十六)
当一个事务持有事务的资源锁,并且另一个事务请求同一资源的不兼容锁时,请求被阻塞并且请求者进入等待状态,直到锁定者释放干扰锁. 长时间运行事务会导致锁被长时间持有,所以只对要开启事务的表操作代码开启事务 ...
- 如何将一个HTML页面嵌套在另一个页面中
一 在原页面嵌入其他页面 1.使用iframe框架 客户端页面嵌套可以使用iframe的方法,弊端是必须事先想好被嵌套的页面在首页中要占多大的位置. 如果被嵌套页面太大,超过事先定义的宽度或高度,则首 ...
- JS 判断是否是手机端并跳转操作
JS 判断运行当前脚本的应用程序是否为手机端或者一些其他信息,在我的工作中遇到的不是十分频繁,被我的同事一问就给问住了,所以把之前找到的一些知识点整理出来,供大家参考,若哪里不对欢迎指出,我会及时的更 ...
- Oracle总结一
1 数据库相关概念 1.1 数据 数据是描述事物的符号,它有多种表现形式:文本,图形,音频,视频.计算机处理数据的基本单位是字节. 1.2 数据库(Database, 简称DB) 同粮库,车库类似,数 ...
- 3038 3n+1问题
3038 3n+1问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 3n+1问题是一个简单有趣而又没有 ...
- Android EditText自定义样式
第一步:为了更好的比较,准备两个一模一样的EditText(当Activity启动时,焦点会在第一个EditText上,如果你不希望这样只需要写一个高度和宽带为0的EditText即可避免,这里就不这 ...
- (网页)Java日志记录框架Logback配置详解(企业级应用解决方案)(转)
转自CSDN: 前言 Logback是现在比较流行的一个日志记录框架,它的配置比较简单学习成本相对较低,所以刚刚接触该框架的朋友不要畏惧,多花点耐心很快就能灵活应用了.本篇博文不会具体介绍Logbac ...
- python网络编程:socket、服务端、客户端
本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...