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=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})
留神: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}) #用快照则须要用高级查问
高级查问选项
选项 | 解释 |
---|---|
$query | |
$orderby | |
$maxsan | integer 最多扫描的文档数 |
$min | doc查问开始 |
$max | doc查问完结 |
$hint | doc应用哪个索引 |
$explain | boolean统计 |
$snapshot | boolean 统一快照 |
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.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 testdbdb.changeUserPassword("tom", "123456")
1.6、启用用户
db.auth("tom","123")
16.7、安全检查 --auth
非testdb是不能操作数据库的,启用本人的用户能力拜访非admin数据库的用户不能应用数据库命令,admin数据库中的数据通过认证为管理员用户
关注微信公众号『 Tom弹架构 』回复“MongoDB”可获取配套材料。
本文为“Tom弹架构”原创,转载请注明出处。技术在于分享,我分享我高兴!如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源。关注微信公众号『 Tom弹架构 』可获取更多技术干货!
原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!