用戶權限
基本指令
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
