python mongodb操作大全
数据库
增
use db1 #有则切换,无则新增
查
show dbs #查看所有
db #当前
删
db.dropDatabase()
集合:
增:
db.user
db.user.info
db.user.auth
查看
show collections
show tables
删
db.user.info.drop()
文档:
增
db.user.insert({"_id":1,"name":"egon"})
user0={
"name":"egon",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'BJ'
}
}
db.user.insert(user0)
db.user.insertMany([user1,user2,user3,user4,user5])
db.t1.insert({"_id":1,"a":1,"b":2,"c":3})
#有相同的_id则覆盖,无相同的_id则新增,必须指定_id
db.t1.save({"_id":1,"z":6})
db.t1.save({"_id":2,"z":6})
db.t1.save({"z":6})
save与insert的区别:
若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改原来的内容为新内容。
如:
已存在数据: {_id : 1, " name " : " n1 " },再次进行插入操作时,
insert({_id : 1, " name " : " n2 " }) 会报主键重复的错误提示
save({ _id : 1, " name " : " n2 " }) 会把 n1 修改为 n2 。
相同点:
若新增的数据中没有主键时,会增加一条记录。
已存在数据: { _id : 1, " name " : " n1 " },再次进行插入操作时,
insert({ " name " : " n2 " }) 插入的数据因为没有主键,所以会增加一条数据
save({ " name " : " n2 " }) 增加一条数据。
查
比较运算:=,!=,>,<,>=,<=
#1、select * from db1.user where id = 3
db.user.find({"_id":3})
#2、select * from db1.user where id != 3
db.user.find({"_id":{"$ne":3}})
#3、select * from db1.user where id > 3
db.user.find({"_id":{"$gt":3}})
#4、select * from db1.user where age < 3
db.user.find({"age":{"$lt":3}})
#5、select * from db1.user where id >= 3
db.user.find({"_id":{"$gte":3}})
#6、select * from db1.user where id <= 3
db.user.find({"_id":{"$lte":3}})
#逻辑运算:$and,$or,$not
#1 select * from db1.user where id >=3 and id <=4;
db.user.find({"_id":{"$gte":3,"$lte":4}})
#2 select * from db1.user where id >=3 and id <=4 and age >=40;
db.user.find({
"_id":{"$gte":3,"$lte":4},
"age":{"$gte":40}
})
db.user.find({"$and":[
{"_id":{"$gte":3,"$lte":4}},
{"age":{"$gte":40}}
]})
#3 select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao";
db.user.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"yuanhao"}
]})
#4 select * from db1.user where id % 2 = 1;
db.user.find({"_id":{"$mod":[2,1]}})
db.user.find({
"_id":{"$not":{"$mod":[2,1]}}
})
#成员运算:$in,$nin
db.user.find({"name":{"$in":["alex","egon"]}})
db.user.find({"name":{"$nin":["alex","egon"]}})
#正则匹配
select * from db1.user where name regexp "^jin.*?(g|n)$";
db.user.find({
"name":/^jin.*?(g|n)$/i
})
#查看指定字段
select name,age from db1.user where name regexp "^jin.*?(g|n)$";
db.user.find({
"name":/^jin.*?(g|n)$/i
},
{
"_id":0,
"name":1,
"age":1
}
)
#查询数组相关
db.user.find({
"hobbies":"dancing"
})
db.user.find({
"hobbies":{"$all":["dancing","tea"]}
})
db.user.find({
"hobbies.2":"dancing"
})
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":[1,2]},
}
)
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":2},
}
)
db.user.find(
{
"addr.country":"China"
}
)
db.user.find().sort({"_id":1,"age":-1})
db.user.find().limit(2).skip(0)
db.user.find().limit(2).skip(2)
db.user.find().limit(2).skip(4)
db.user.find().distinct()
改
一 语法:
db.table.update(
条件,
修改字段,
其他参数
)
update db1.t1 set id=10 where name="egon";
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":["纹身","抽烟"]}}},
{"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":"纹身"}},
{"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}
)
删
db.user.deleteOne({"_id":{"$gte":3}})
db.user.deleteMany({"_id":{"$gte":3}})
db.user.deleteMany({})
聚合
一:$match
例:
select post from db1.emp where age > 20 group by post having avg(salary) > 10000;
#$match
#1、select * from db1.emp where age > 20
db.emp.aggregate({"$match":{"age":{"$gt":20}}})
#$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"}}}
)
#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:
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"}}},
{"$project":{"_id":0,"new_name":{"$concat":["$name","_SB"]},}}
)
db.emp.aggregate(
{"$match":{"name":{"$ne":"egon"}}},
{"$project":{"_id":0,"new_name":{"$substr":["$name",0,3]},}}
)
三:{"$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"},
"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}}) #随机选取3个文档
python mongodb操作大全的更多相关文章
- Python列表操作大全(非常全)
Python列表操作大全(非常全!!!) 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且 ...
- python列表操作大全
Python列表操作大全 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列 ...
- Python文件操作大全
Python 编程文件操作大全 文件打开模式 打开模式 执行操作 'r' 以只读方式打开文件(默认) 'w' 以写入的方式打开文件,会覆盖已存在的文件 'x' 如果文件已经存在,使用此模式打开将引 ...
- Python字典操作大全
//2018.11.6 Python字典操作 1.对于python编程里面字典的定义有以下几种方法: >>> a = dict(one=1, two=2, three=3) > ...
- python文件目录操作大全
python只获取当前目录下的文件夹及文件名 list = os.listdir(rootdir)#列出目录下的所有文件和目录 for line in list: filepath = os.path ...
- 转:关于python文件操作大全
转自:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html python中对文件.文件夹(文件操作函数)的操作需要涉及到o ...
- Python文件操作大全,随机删除文件夹内的任意文件
在读文件的时候往往需要遍历文件夹,python的os.path包含了很多文件.文件夹操作的方法: os.path.abspath(path) #返回绝对路径os.path.basename(path ...
- python字符串操作大全
1.去空格 strip() >>> s = 'a b c d ' >>> s.strip() 'a b c d' 2.lstrip() 方法用于截掉字符串左边的空格 ...
- Python字符串操作大全(非常全!!!)
1. python编程里字符串的内置方法(非常全) capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居 ...
随机推荐
- [iOS]UIDynamicAnimator动画
创建动画 UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 协议代理 ...
- form组件-字段
Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...
- 关于json时间数据格式转换与修改
使用easyui获取JSON时间数据时间数据时,通常是一长串的数字而不是我们想要的类似2018-11-01的普通时间格式. 此时我们就需要使用到关于JSON时间的格式化,而将时间转化成我们想要的格式. ...
- 如何提交代码到git仓库
首先连接远程仓库 git remote add origin 仓库地址 然后拉取分支 git pull origin master 随后可查看本地增删改的文件 git status 增加本地的更改 g ...
- Windows8系统下设置Mongodb开机启动
1. 官网下载安装 MongoDB https://www.mongodb.com/ 2. 环境变量设置 把 mongod.exe 所在路径加入到环境变量的PATH, 我这里安装的路径是 D:\db\ ...
- 解决GetTickCount的问题
GetTickCount是一个api,它是反应到从开机到当前的毫秒数,这个很好.可以做一些短途的计时器. 比如说做服务器中对象池计时器,对象超过多少时间就自动释放对象. 但是GetTickCount也 ...
- Home Assistant系列 -- 设置界面语言与地理位置
Home Assistant 安装的时候会自动根据你的系统语言设置默认语言,安装完成以后也可以根据需要自己设置选择语言.启动 Home Assistant ,浏览器打开web 界面,点击左上角的用户图 ...
- Ruby中区分运行来源的方法(转)
Ruby中区分运行来源的方法 这篇文章主要介绍了Ruby中区分运行来源的方法,本文讲解的是类似Python中的if name == 'main':效果,其实Ruby中也有类似语法,需要的朋友可以参考下 ...
- C语言中的if与else if
今天发现一个比较不理解的代码,是关于else if这个判断语句的代码.代码如下 #include<stdio.h> ; int main(void) { ) { printf(" ...
- stm32 IO口八种模式区别
初学STM32,遇到I/O口八种模式的介绍,网上查了一下资料,下面简明写出这几种模式的区别,有不对的地方请大家多多指正! 上拉输入模式:区别在于没有输入信号的时候默认输入高电平(因为有弱上拉).下拉输 ...