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