用户权限
基本指令
mongo的操作指令一般是要在指定的一个库下面进行的。命令 参数 数据库等大小写敏感。 mongodb安装
进入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:具体的一个库
比如说有一个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 >
最后报错,因为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.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})

只更新第一条记录: 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 );
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" } )
集合 查询

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()

>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
关键字 | 说明 |
---|---|
$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"})
推荐文档
https://www.jianshu.com/p/d03931badaa8