写点什么

MongoDB 常用命令(2)

作者:Tom弹架构
  • 2022 年 1 月 04 日
  • 本文字数:5003 字

    阅读完需:约 16 分钟

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、更新器

inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:


db.t_member.update({name:"zhangsan"},{$inc:{age:2}})
复制代码


执行结果是名字叫“zhangsan”的年龄加了 2$unset : 删除指定的键


db.t_member.update({name:"zhangsan"},{$unset:{age:1}})
复制代码


pushAll : 批量想数组键插入值


db.t_member.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}});
复制代码


$addToSet : 当指定的数组中有这个值时,不插入,反之插入


db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #则不会添加到数组里
复制代码


$pop:删除指定数组的值,当 value=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"}})
复制代码


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({条件},{指定键});
复制代码


比较操作符:lte: <= 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、包含与不包含(仅针对于数组)

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 的使用

nin 的区别是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})
复制代码


注意:mongodb 的 key 可以存不同类型的数据排序就也有优先级最小值->null->数字->字符串->对象/文档->数组->二进制->对象 ID->布尔->日期->时间戳->正则->最大值

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.country}  }  return {country:doc.counTry}}
复制代码

15、MongoDB 快照管理

快照后就会针对不变的集合进行游标运动了,看看使用方法.


db.persons.find({$query:{name:”Jim”},$snapshot:true}) #用快照则需要用高级查询
复制代码


高级查询选项


15.1、查询点(70,180)最近的 3 个点

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 testdbdb.createUser({user:"tom",pwd:"123",roles:[{ role:"dbAdmin",db:"testdb"}]})
复制代码


具体角色有 read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profileuserAdmin:允许用户向 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 testdbdb.changeUserPassword("tom", "123456")
复制代码

1.6、启用用户

db.auth("tom","123")
复制代码

16.7、安全检查 --auth

非testdb是不能操作数据库的,启用自己的用户才能访问非admin数据库的用户不能使用数据库命令,admin数据库中的数据经过认证为管理员用户
复制代码


关注微信公众号『 Tom 弹架构 』回复“MongoDB”可获取配套资料。


本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom 弹架构 』可获取更多技术干货!


原创不易,坚持很酷,都看到这里了,小伙伴记得点赞、收藏、在看,一键三连加关注!如果你觉得内容太干,可以分享转发给朋友滋润滋润!

发布于: 1 小时前
用户头像

Tom弹架构

关注

不只做一个技术者,更要做一个思考者 2021.10.22 加入

畅销书作者,代表作品:《Spring 5核心原理》、《Netty 4核心原理》、《设计模式就该这样学》

评论

发布
暂无评论
MongoDB常用命令(2)