当前位置: 首页 > 后端技术 > Java

MongoDB常用命令(二)

时间:2023-04-01 15:51:32 Java

1.创建数据库使用testdb2。创建一个集合?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操作,如果查询到则更新,找不到则插入,否则varp=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、查看集合showcollections7,查看数据库showdbs8,插入数据db.t_member.insert()#不允许重复键值db.t_member.save()#如果键值重复,可以更改9.批量更新db.t_member.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true);batch操作需要和selector同时使用,第一个false表示不执行insertOrUpdate操作,第二个true表示执行batch10、updater$set:指定一个键值对,如果存在修改它,不存在则添加$inc:仅用于数值类型,可以对指定键值对的数值类型进行加减运算:db.t_member.update({name:"zhangsan"},{$inc:{age:2}})执行结果为名字“zhangsan”的年龄增加2$unset:删除指定keydb.t_member.update({name:"zhangsan"},{$unset:{age:1}})$push:数字组键操作:1、如果指定的数组存在,则为其添加一个值;2.如果指定的数组不存在,则创建一个数组键并添加一个值;3、如果指定的key不是数组类型,则报错;$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"]}})#如果有多个中文在数组中,删除所有$:修改指定数组时,如果数组有多个对象,而你只想修改其中的一部分,则需要一个定位器: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:{querier},  排序:{排序},  更新:{修饰符},  new:true是否返回修改后的数据});可以执行runCommand函数。mongdb中的特殊函数findAndModify是特殊函数之一,用于update或remove返回后返回文档。例如:ps=db.runCommand({  findAndModify:"persons",  query:{name:"zhangsan"},  update:{$set:{name:"lisi"}},  新:真})ps.value12。系统命令示例1.查询服务器版本号和主机操作系统db.runCommand({buildInfo:1})2.查询执行集合db.runCommand({collStats:"persons"})3.查看本集合的最后一条错误信息db.runCommand({getLastError:"persons"})13.固定集合1.特征固定集合默认没有索引,即使是_id如果没有索引,插入速度很快,因为不需要分配新的空间。固定集合的顺序是确定的,导致查询速度非常快。最适合的是日志管理。2.创建固定集合。创建一个新的固定集合需要的大小是100字节,可以存储10个文档({convertToCapped:"persons",size:1000})3.固定集合的反向排序,默认为插入顺序db.mycoll.find().sort({$natural:-1})14.MongoDB进阶querydb.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小于orequalto27Peopledb.t_member.find({country:{$ne:"Korea"}},{_id:0,name:1,country:1})#查询所有国籍不是的人的数学成绩韩语14.2,包括和不包含(仅适用于数组)$in或$nindb.t_member.find({country:{$in:["China","USA"]}},{_id:0,name:1:合作untry:1})#查询国籍为中国或美国的学生信息14.3,$orquerydb.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)#给中国国籍的学生增加一个新keysexdb.t_member.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})#查询性别为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.添加sizekeydb.t_member.update({},{$set:{size:4}},false,true)2.添加书籍并更新sizedb.t_member.update({name:"jim"},{$push:{books:"ORACL"},$inc:{size:1}})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且成绩A1的学生,绝对查询,顺序和key的个数必须完全符合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。正确的方式是查询$elemMatchdb.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、sort1为正序,-1为反序db.t_member.find({},{_id:0,name:1,age:1}).limit(5).skip(3).sort({age:1})注意:mongodb的key可以存储不同类型的数据排序,也有优先级minimumvalue->null->number->string->object/document->array->Binary->ObjectID->Boolean->Date->Timestamp->Regular->Maximumvalue14.12,Cursor使用游标遍历查询数据varpersons=db.persons.find();while(persons.hasNext()){  obj=persons.next();  print(obj.name)}游标的几种破坏条件1).客户端发消息让他销毁2)。游标迭代完成3).默认游标如果超过10分钟没用就不要清除查询persons中有多少个国家,是什么db.runCommand({distinct:"persons",key:"country"}).values#key表示去重key3,group分组db.runCommand({group:{  ns:"collectionname",  key:"groupingkeyobject",  initial:"initializeaccumulator",  $reduce:"decomposer",  condition:"Condition",  finalize:"groupcompleter"}})分组会先根据key进行分组,每组中的每个文档都要执行$reduce方法,接收2个参数,一个是组中的记录,一个是累加器数据。请在persons(必须90以上)中查出各国数学成绩最好的学生信息{"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+"来自"+prev.country+",数学成绩为"+prev.m;  } }})14.15函数格式化分组key如果键Country和country出现在集合中并且同时存在$keyf:function(doc){  if(doc.country){  return{country:doc.country}  }  return{country:doc.counTry}}15.MongoDB快照管理snapshots会在不变的集合上移动游标,看看如何使用吧。db.persons.find({$query:{name:”Jim”},$snapshot:true})#使用快照,需要使用高级查询选项说明$query$orderby$maxsaninteger最大扫描文档数$mindocquerystart$maxdocqueryend$hintdoc使用哪个索引$explainbooleanstatistics$snapshotbooleanconsistentSnapshot15.1,querypoint(70,180)最近的三点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用户使用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数据库下运行,必须先使用admin;如果是单一数据库下,只能操作当前数据库的权限16.3,删除用户db.system.users.remove({user:"tom"});16.4查看当前用户权限db.runCommand({usersInfo:"tom",showPrivileges:true})16.5修改密码使用testdb.changeUserPassword("tom","123456")1.6、启用用户db.auth("tom","123")16.7、安全检查--authnon-testdb不能操作数据库,启用你自己的Onlyuserscanaccessnon-admindatabases。用户不能使用数据库命令。admin数据库中的数据已通过管理员身份验证。用户可以关注微信公众号『TomBombArchitecture』,回复“MongoDB”获取配套资料。本文为《汤姆炸弹建筑》原创,转载请注明出处。科技在于分享,我分享我的快乐!如果大家有什么建议,也可以留言或者私信。您的支持是我坚持创作的动力。关注微信公众号“汤姆炸弹建筑”,获取更多技术干货!原创不易,坚持很酷,看到这里了,小伙伴们记得点赞、收藏、观看、加关注哦!如果觉得内容太干,可以分享转发给身边的朋友一起滋润哦!