前言
这篇文章整理了一下mongodb的基本指令和一些经常用到的用户操作,同时我还整理了关于linux、redis、Nginx、MySQL以及zookeeper等绝大多数后端开发所要用到的一些常用命令
如果需要的话可以进群973961276免费领取,除了操作命令整理合集之外还有1000多道一线大厂面试题和超多的学习书籍以及视频资料,都可以免费给到有需要的朋友。
用户权限
基本指令
mongo的操作指令一般是要在指定的一个库下面进行的。命令 参数 数据库等大小写敏感。
进入mongo命令:mongo 刚安装完mongodb是没有开启权限,没有用户的。
切换数据库:user admin 切换到amin数据库
显示当前数据库用户:show users
显示数据库:show dbs
推出momgodb:exit
刚安装完mongodb后,需要创建一个root权限的用户,然后修改配置文件开启权限验证,然后重启mongodb服务。
[root@wdq ~]# mongo
MongoDB shell version v4.2.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("4fea1f3b-05f9-4634-870a-ced1e95eaceb") }
MongoDB server version: 4.2.2
> use admin
switched to db admin
> db.createUser({user:"root",pwd:"root",roles:[ {role:"root", db:"admin" } ]})
创建用户
> db.auth("root","wdq123")
1
1表示成功
验证用户 相当于登录
用户操作
创建用户
db.createUser({user:"root",pwd:"root",roles:[ {role:"root", db:"admin" } ]})
user:用户名
pwd:用户密码
roles:用户权限,是一个数据(权限都要指定到库)
role:具体的一个权限
db:具体的一个库
Vi创建用户
比如说有一个CRM的库,我要给他创建用户。先切到CRM库上,在创建用户。
修改密码
> use ERP
switched to db ERP
> db.createUser({user:"crm",pwd:"crm",roles:[ {role:"dbOwner", db:"ERP" } ]})
Successfully added user: {
"user" : "crm",
"roles" : [
{
"role" : "dbOwner",
"db" : "ERP"
}
]
}
> db.changeUserPassword("crm","crm1")
> db.auth("crm","crm1")
1
> db.updateUser("crm",{pwd:"crm2"})
2019-12-25T23:16:50.575+0800 E QUERY [js] uncaught exception: Error: Updating user failed: too many users are authenticated :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.updateUser@src/mongo/shell/db.js:1420:11
@(shell):1:1
>
修改用户密码changeUserPassword
最后报错,因为db.auth多次。需要推出 exit。
> exit
bye
[root@wdq ~]# mongo
MongoDB shell version v4.2.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3030ac06-bae6-41d6-b39a-d652af4d7c33") }
MongoDB server version: 4.2.2
> use admin
switched to db admin
> db.auth("root","wdq123")
1
> use ERP
switched to db ERP
> db.updateUser("crm",{pwd:"crm2"})
>
修改用户密码db.updateUser
删除用户
> db.dropUser("erp")
true
删除用户
修改用户权限
方法一
> db.grantRolesToUser("crm", [{role:"readWrite", db:"ERP"},{role:"read", db:"CacheERP"}])
> use CacheERP
switched to db CacheERP
> show users
>
新增权限
> show users
{
"_id" : "ERP.crm",
"userId" : UUID("f970ce79-8725-4f0e-904c-a162b847a041"),
"user" : "crm",
"db" : "ERP",
"roles" : [
{
"role" : "readWrite",
"db" : "ERP"
},
{
"role" : "read",
"db" : "CacheERP"
},
{
"role" : "dbOwner",
"db" : "ERP"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
查看当前权限
看到加入了两个权限
> use ERP
switched to db ERP
> show users
{
"_id" : "ERP.crm",
"userId" : UUID("f970ce79-8725-4f0e-904c-a162b847a041"),
"user" : "crm",
"db" : "ERP",
"roles" : [
{
"role" : "readWrite",
"db" : "ERP"
},
{
"role" : "read",
"db" : "CacheERP"
},
{
"role" : "dbOwner",
"db" : "ERP"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.revokeRolesFromUser("crm",[{role:"readWrite", db:"ERP"}])
> show users
{
"_id" : "ERP.crm",
"userId" : UUID("f970ce79-8725-4f0e-904c-a162b847a041"),
"user" : "crm",
"db" : "ERP",
"roles" : [
{
"role" : "read",
"db" : "CacheERP"
},
{
"role" : "dbOwner",
"db" : "ERP"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
>
删除权限
方法二
db.updateUser 完全把用户权限清洗为当前设定的值。 慎用
> show users
{
"_id" : "ERP.crm",
"userId" : UUID("f970ce79-8725-4f0e-904c-a162b847a041"),
"user" : "crm",
"db" : "ERP",
"roles" : [
{
"role" : "read",
"db" : "CacheERP"
},
{
"role" : "dbOwner",
"db" : "ERP"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
> db.updateUser("crm",{roles:[ {role:"readWrite",db:"ERP"} ]})
> show users
{
"_id" : "ERP.crm",
"userId" : UUID("f970ce79-8725-4f0e-904c-a162b847a041"),
"user" : "crm",
"db" : "ERP",
"roles" : [
{
"role" : "readWrite",
"db" : "ERP"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
>
修改权限
基本增删查改
客户端
Studio 3T,破解方法可以百度。
上面可以写基础sql,可以查看官方文档。
数据库
1、添加
> use mytestdb
switched to db mytestdb
添加数据库
2、删除
> use mytestdb switched to db mytestdb
> db.dropDatabase() { "ok" : 1 } >
删除数据库
集合(表)
1、创建集合
> use mytestdb
switched to db mytestdb
> db.createCollection("col1")
{ "ok" : 1 }
> db.createCollection("col2")
{ "ok" : 1 }
>
> db.col3.insert({"name":"wdq"})
WriteResult({ "nInserted" : 1 })
>
通过插入一条数据创建集合
2、删除集合
> show collections
col1
col2
col3
> db.col3.drop()
true
> show collections
col1
col2
>
删除集合
文档(一行数据)
1、插入文档
> db.col1.insert({name:'wdq',age:16})
WriteResult({ "nInserted" : 1 })
>
插入文档到集合
如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档
> db.col1.insertOne({name:'zdd',age:16})
{
"acknowledged" : true,
"insertedId" : ObjectId("5e04d6551e1033670e11ccdd")
}
>
> db.col1.insertMany([{name:'www',age:10},{name:'zzz',age:11}])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5e04d6b11e1033670e11ccde"),
ObjectId("5e04d6b11e1033670e11ccdf")
]
}
>
插入文档到集合(单个 多个)
2、更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
更新格式
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。
参数说明
db.col1.update({name:"wdq"},{$set:{age:100}},{upsert:true,multi:true})
简单更新
db.col1.save({_id:ObjectId("5e04d5af1e1033670e11ccdc"),name:"wdqwdq",age:110})
根据ID替换现有文档
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
View Code
3、删除文档
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
删除格式
query :(可选)删除的文档的条件。 justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 writeConcern :(可选)抛出异常的级别
参数说明
remove() 方法 并不会真正释放空间。
需要继续执行 db.repairDatabase() 来回收磁盘空间。
> db.repairDatabase()
或者
> db.runCommand({ repairDatabase: 1 })
remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
delete
集合 查询
db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
查询格式
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于(equal) |
{<key>:<value> } |
db.col.find({"by":"菜鸟教程"}).pretty() |
where by = '菜鸟教程' |
小于(less than) | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于(lt equal) | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于(greater than) | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于(gt equal) | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于(not equal) | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
db.col.find({key1:value1, key2:value2}).pretty()
AND
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
OR
关键字 | 说明 |
---|---|
$or | 或关系 |
$nor | 或关系取反 |
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | 在多个值范围内 |
$nin | 不在多个值范围内 |
$all | 匹配数组中多个值 |
$regex | 正则,用于模糊查询 |
$size | 匹配数组大小 |
$maxDistance | 范围查询,距离(基于LBS) |
$mod | 取模运算 |
$near | 邻域查询,查询附近的位置(基于LBS) |
$exists | 字段是否存在 |
$elemMatch | 匹配内数组内的元素 |
$within | 范围查询(基于LBS) |
$box | 范围查询,矩形范围 |
$center | 范围查询,圆形范围 |
$centerSphere | 范围查询,球形范围 |
$slice | 查询字段集合中的元素(比如从第几个之后,第N到第M个元素) |
正则:
--{"name":{"$regex":"正大"}}
db.getCollection("subscribe_test").find({$or:[{"name":{"$regex":"正大"}},{"content":{"$regex":"正大"}}],"update_time":{$gte:1,$lte:2000000000},info_type:"00"})