盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述MongoDB常用命令相关的知识,希望能为你提供帮助。
1、创建数据库
use testdb
2、创建集合
db.t_member.insert(name:"zhaomin",age:23)
3、查询
db.t_member.find()
db.t_member.findOne()
4、修改
db.t_member.update(name:"zhaomin",$set:age:18) #不会影响其他属性列 ,主键冲突会报错
db.t_member.update(name:"zhaomin",$set:age:18,true)#第三个参数为true 则执行insertOrUpdate操作,查询出则更新,没查出则插入,或者
var p = db.t_member.findOne();
db.t_member.update(p,name:"zhaomin1") #会删除其他的属性列
5、删除
db.t_member.remove(age:1) #删除满足条件的第一条 只删除数据 不删除索引
#删除集合
db.t_member.drop();
#删除数据库
db.dropDatabase();
6、查看集合
show collections
7、查看数据库
show dbs
8、插入数据
db.t_member.insert() #不允许键值重复
db.t_member.save() #若键值重复,可改为插入操作
9、批量更新
db.t_member.update(name:"zhaomin",$set:name:"zhanmin11",false,true);
批量操作需要和选择器同时使用,第一个false表示不执行insertOrUpdate操作,第二个true表示执行批量
10、更新器$set : 指定一个键值对,若存在就进行修改,不存在则添加
$inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:
db.t_member.update(name:"zhangsan",$inc:age:2)
执行结果是名字叫“zhangsan”的年龄加了2
$unset : 删除指定的键
db.t_member.update(name:"zhangsan",$unset:age:1)
$push : 数组键操作:1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;
$pushAll : 批量想数组键插入值
db.t_member.update(name:"zhangsan",$pushAll:classes:["English","Math","Chinese"]);
$addToSet : 当指定的数组中有这个值时,不插入,反之插入
db.t_member.update(name:"zhangsan",$addToSet:classes:"English");
#则不会添加到数组里
$pop:删除指定数组的值,当value=https://www.songbingjia.com/android/1 删除最后一个值,当value=-1 删除第一个值
db.t_member.update(name:"zhangsan",$pop:classes:1) #删除了最后一个值
$pull : 删除指定数组指定的值
db.persons.update(name:"zhangsan",$pull:classes:"Chinese") #$pullAll批量删除指定数组db.t_member.update(name:"zhangsan",$pull:classes:["Chinese"])
#若数组中有多个Chinese,则全删除
$ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:
db.t_member.update("classes.type":"AA",$set:"classes.$.sex":"male")
$addToSet 与 $each结合完成批量数组更新操作
db.t_member.update(name:"zhangsan",$set:classes:$each:["chinese","art"])
11、runCommand函数和findAndModify函数
runCommand(
findAndModify:"persons",
query:查询器,
sort:排序,
update:修改器,
new:true 是否返回修改后的数据
);
runCommand函数可执行mongdb中的特殊函数
findAndModify就是特殊函数之一,用于返回执行返回update或remove后的文档
例如:
ps=db.runCommand(
findAndModify:"persons",
query:name:"zhangsan",
update:$set:name:"lisi",
new:true
)
ps.value
12、系统命令举例1、查询服务器版本号和主机操作系统
db.runCommand(buildInfo:1)
2、查询执行集合的详细信息,大小,空间,索引等
db.runCommand(collStats:"persons")
3、查看操作本集合最后一次错误信息
db.runCommand(getLastError:"persons")
13、固定集合1、特性
固定集合默认是没有索引的就算是_id也是没有索引的,由于不需分配新的空间他的插入速度非常快,固定集合的顺是确定的导致查询速度非常快,最适合就是日志管理
2、创建固定集合
创建一个新的固定集合要求大小是100个字节,可以存储文档10个
db.createCollection("mycoll",size:100,capped:true,max:10)
把一个普通集合转换成固定集合
db.runCommand(convertToCapped:"persons",size:1000)
3、对固定集合反向排序,默认情况是插入的顺序排序
db.mycoll.find().sort($natural:-1)
14、MongoDB高级查询
db.t_member.find(,_id:0,name:1)
第一个空括号表示查询全部数据,第二个括号中值为0表示不返回,值为1表示返回,默认情况下若不指定主键,主键总是会被返回;
db.persons.find(条件,指定键);
比较操作符:$lt: < $lte: < = $gt: > $gte: > = $ne: !=
14.1、查询条件
db.t_member.find(age:$gte:25,$lte:27,_id:0,name:1,age:1)
#查询年龄大于等于25小于等于27的人
db.t_member.find(country:$ne:"韩国",_id:0,name:1,country:1)
#查询出所有国籍不是韩国的人的数学成绩
14.2、包含与不包含(仅针对于数组)
$in 或 $nin
db.t_member.find(country:$in:["China","USA"],_id:0,name:1:country:1)
#查询国籍是中国或美国的学生信息
14.3、$or查询
db.t_member.find($or:[c:$gt:85,e:$gt:90],_id:0,name:1,c:1,e:1) #查询语文成绩大于85或者英语大于90的学生信息
db.t_member.update(country:"China",$set:sex:"m",false,true)
#把中国国籍的学生上增加新的键sex
db.t_member.find(sex:$in:[null],_id:0,name:1,sex:1)
#查询出sex为null的人
14.4、正则表达式
db.t_member.find(name:/li/i,_id:0,name:1)
#查询出名字中存在”li”的学生的信息
14.5、$not的使用
$not和$nin的区别是$not可以用在任何地方儿$nin是用到集合上的
db.t_member.find(name:$not:/li/i,_id:0,name:1)
#查询出名字中不存在”li”的学生的信息
14.6、$all与index的使用
db.t_member.find(books:$all:["JS","MONGODB"],_id:0,name:1)
#查询喜欢看MONGOD和JS的学生
db.t_member.find("books.1":"java",_id:0,name:1,books:1)
#查询第二本书是JAVA的学习信息
14.7、$size的使用,不能与比较查询符同时使用
db.t_member.find(books:$size:4,_id:0,name:1)
#查询出喜欢的书籍数量是4本的学生
14.8、查询出喜欢的书籍数量大于4本的学生本的学生
1、增加size键
db.t_member.update(,$set:size:4,false,true)
2、添加书籍,同时更新size
db.t_member.update(name:"jim",$push:books:"ORACL",$inc:size:1)
3、查询大于3本的
db.t_member.find(size:$gt:4,_id:0,name:1,size:1)
14.9、$slice操作符返回文档中指定数组的内部值
db.t_member.find(name:"jim",_id:0,name:1,books:$slice:[1,3])
#查询出Jim书架中第2~4本书
db.t_member.find(name:"jim",_id:0,name:1,books:$slice:-1)
#查询出最后一本书
14.10、文档查询
查询出在K上过学且成绩为A的学生
1、绝对查询,顺序和键个数要完全符合
db.t_member.find(school:school:"K","score":"A",_id:0,name:1)
2、对象方式,但是会出错,多个条件可能会去多个对象查询
db.t_member.find("school.school":"K","school.score":"A",_id:0,name:1)
3、正确做法单条条件组查询$elemMatch
db.t_member.find(school:$elemMatch:school:"K",score:"A",_id:0,name:1)
db.t_member.find(age:$gt:22,books:"C++",school:"K",_id:0,name:1,age:1,books:1,school:1)
14.11、分页与排序
1、limit返回指定条数 查询出persons文档中前5条数据:
db.t_member.find(,_id:0,name:1).limit(5)
2、指定数据跨度 查询出persons文档中第3条数据后的5条数据
db.t_member.find(,_id:0,name:1).limit(5).skip(3)
3、sort排序 1为正序,-1为倒序
db.t_member.find(,_id:0,name:1,age:1).limit(5).skip(3).sort(age:1)
14.12、游标
利用游标遍历查询数据
var persons = db.persons.find();
while(persons.hasNext())
obj = persons.next();
print(obj.name)
游标几个销毁条件
1).客户端发来信息叫他销毁
2).游标迭代完毕
3).默认游标超过10分钟没用也会别清除
14.13 聚合查询(Count 、Distinct、Group)
1、count 查询结果条数
db.persons.find(country:"USA").count()
2、Distinct 去重
请查询出persons中一共有多少个国家分别是什么
db.runCommand(distinct:"persons",key:"country").values
#key表示去重的键
3、group分组
db.runCommand( group:
ns:"集合的名字",
key:"分组键对象",
initial:"初始化累加器",
$reduce:"分解器",
condition:"条件",
finalize:"组完成器"
)
分组首先会按照key进行分组,每组的 每一个文档全要执行$reduce的方法,他接收2个参数一个是组内本条记录,一个是累加器数据.
请查出persons中每个国家学生数学成绩最好的学生信息(必须在90以上)
db.runCommand(
group:
ns:"persons",
key:"country":true,
initial:m:0,
$reduce:function(doc,prev)
if(doc.m>
prev.m)
prev.m = doc.m;
prev.name = doc.m;
prev.country = doc.country;
,
condition:m:$gt:90,
finalize:function(prev)
prev.m = prev.name+" comes from "+prev.country+" ,Math score is "+prev.m;
)
14.15 函数格式化分组键
如果集合中出现键Counrty和counTry同时存在
$keyf:function(doc)
if(doc.country)
return country:doc.countryreturn country:doc.counTry
15、MongoDB快照管理快照后就会针对不变的集合进行游标运动了,看看使用方法.
db.persons.find($query:name:”Jim”,$snapshot:true)
#用快照则需要用高级查询
高级查询选项 |
选项 | 解释 |
---|---|---|
$query | ||
$orderby | ||
$maxsan | integer 最多扫描的文档数 | |
$min | doc查询开始 | |
$max | doc查询结束 | |
$hint | doc使用哪个索引 | |
$explain | boolean统计 | |
$snapshot | boolean 一致快照 |
db.map.find(gis:$near:[70,180],_id:0,gis:1).limit(3)
15.2、查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点
db.map.find(gis:$within:$box:[[50,50],[190,190]],_id:0,gis:1)
15.3、查询出以圆心为(56,80)半径为50规则下的圆心面积中的点
db.map.find(gis:$with:$center:[[56,80],50],_id:0,gis:1)
16、MongoDB用户管理 16.1、添加用户
为testdb添加tom用户
use testdb
db.createUser(user:"tom",pwd:"123",roles:[ role:"dbAdmin",db:"testdb"])
具体角色有
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
16.2查看所有用户
db.system.users.find()
和用户管理相关的操作基本都要在admin数据库下运行,要先use admin;
如果在某个单一的数据库下,那只能对当前数据库的权限进行操作
16.3、用户删除操作
db.system.users.remove(user:"tom");
16.4查看当前用户权限
db.runCommand(usersInfo:"tom",showPrivileges:true)
16.5修改密码
use testdb
db.changeUserPassword("tom", "123456")
1.6、启用用户
db.auth("tom","123")
16.7、安全检查 --auth
非testdb是不能操作数据库的,启用自己的用户才能访问
非admin数据库的用户不能使用数据库命令,admin数据库中的数据经过认证为管理员用户
关注微信公众号『 Tom弹架构 』回复“MongoDB”可获取配套资料。
【MongoDB常用命令】原创不易,坚持很酷,都看到这里了,小伙伴记得点赞、收藏、在看,一键三连加关注!如果你觉得内容太干,可以分享转发给朋友滋润滋润!
推荐阅读
- Python中的图形绘制——3D绘图
- Shell脚本练习题 一(if case)
- shell脚本练习题 二(for循环)
- CentOS8 CA服务器
- shell编程免交互
- 在单个产品页面中添加自定义文本字段
- 在wp主题的滑块上添加logo
- 如何覆盖子主题中的媒体查询()
- 如何在WordPress页脚中添加保护我的版权链接()