MongoDB用戶權限和增刪改查的操作方法以及常用關鍵字整理

前言

這篇文章整理了一下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"})

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章