关于java:MongoDB常用命令2

58次阅读

共计 7570 个字符,预计需要花费 19 分钟才能阅读完成。

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 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”可获取配套材料。

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

原创不易,保持很酷,都看到这里了,小伙伴记得点赞、珍藏、在看,一键三连加关注!如果你感觉内容太干,能够分享转发给敌人滋润滋润!

正文完
 0