docker安裝mongodb快速使用


首先如果沒有docker就先下載安裝docker

docker search mongodb  # 搜索mongodb鏡像
docker pull mongo:latest  # 安裝mongodb最新版本, 也可以指定版本
docker images  # 查看本地已經拉取的鏡像
docker run -itd --name mongo -p 27017:27017 mongo --auth  # 運行mongo容器, -p指定端口映射, --auth需要密碼才能訪問容器服務 docker ps # 查看正在運行的容器信息


# ### 開啟用戶驗證, 開啟驗證之后游客就只能靠邊站了(游客只能玩test測試庫), 每次進mongodb都需要驗證

exit # 退出容器
docker exec -it mongo /bin/bash # 進入容器
apt-get update # 更新源
apt-get install vim # 安裝vim
# 修改 mongo 配置文件 
vim /etc/mongod.conf.orig
配置文件中,加入以下配置,注意authorization前面要加空格,參考其他配置項就能發現
security:
  authorization: enabled

重啟mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf

 

# 給mongodb創建用戶

$ docker exec -it mongo mongo admin  # 后面的mongo admin是進入容器並執行的命令, 相當於進入容器,並執行此命令

# 當然上述操作可以分兩步操作

$ docker exec -it mongo /bin/bash # 進入mongo容器
/# mongo admin  # 以授權模式進入mongo ,創建了用戶之后,都用授權模式進入

# 然后正式創建 userAdminAnyDatabase 用戶

# 創建一個名為 root,密碼為 123 的用戶。
> db.createUser({ user:'myroot',pwd:'123',roles:[{ role:'userAdminAnyDatabase', db: 'admin'},{其他權限字典,可添加多個,也可只要一個}]}); # 嘗試使用上面創建的用戶信息進行連接。返回1則代表認證成功 > db.auth('root', '123')

 

#  exit  # 退出mongo

#  docker exec -it  mongo /bin/bash   # 進入容器, mongo是容器名 , 或者也可以使用容器id

# mongo admin  # 以授權模式進入mongodb的admin庫中 (即需要身份認證才能操作數據庫的) , 若用非授權模式啟動, 則直接mongo就行了

    如果不加admin, 則默認進入一個test庫, 在這個庫中也不能進行權限驗證

# db.auth('myroot', '123')  # 認證身份, 返回1則代表認證成功

 

用戶權限:

一,掌握權限,理解下面4條基本上就差不多

1. mongodb是沒有默認管理員賬號,所以要先添加管理員賬號,在開啟權限認證。
2. 切換到admin數據庫,添加的賬號才是管理員賬號。 3. 用戶只能在用戶所在數據庫登錄(也就是進行身份驗證db.auth(...)),包括管理員賬號。 4. mongo的用戶是以數據庫為單位來建立的,每個數據庫有自己的管理員。 5. 管理員可以管理所有數據庫,但是不能直接管理其他數據庫,要先在admin數據庫認證后才可以(添加root超級權限)。 注:帳號是跟着庫走的,所以在指定庫里授權,必須也在指定庫里驗證

 

二  用戶權限說明

Read:允許用戶讀取指定數據庫
readWrite:允許用戶讀寫指定數據庫
dbAdmin:允許用戶在指定數據庫中執行管理函數,如索引創建、刪除,查看統計或訪問system.profile
userAdmin:允許用戶向system.users集合寫入,可以找指定數據庫里創建、刪除和管理用戶
clusterAdmin:只在admin數據庫中可用,賦予用戶所有分片和復制集相關函數的管理權限。
readAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀權限
readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的讀寫權限
userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的userAdmin權限
dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶所有數據庫的dbAdmin權限。不能在其他數據庫中建數據集合
root:只在admin數據庫中可用。超級賬號,超級權限,可以刪除其他用戶(刪除用戶的時候只能在admin數據庫下刪),而且root用戶還能在其他數據庫中建數據集合

 

# 簡單點吧, 你如果是dbAdminAnyDatabase用戶, 你就可以創建普通用戶, 並且給普通用戶對於某個或某些數據庫的讀/寫權限

首先需要 use admin
驗證身份 db.auth('myroot', '123') # 就相當於用myroot這個用戶登錄mongodb use db1 # 創建db1數據庫, 並且選擇這個數據庫 db.createCollection('article') # 創建article數據集合 會發現報錯 not authorized on db1 to execute command # 沒有權限執行創建數據集合的命令 回到admin權限庫 use admin db.grantRolesToUser("myroot", [{role: "root", db: "admin"}]) # 給myroot這個用戶添加對於admin權限管理庫的超級管理員(root)權限 添加了之后就可以橫行無阻了, 就可以去其他數據庫中肆意妄為了
# 撤銷角色權限, 比如說 dbAdminAnyDatabase 用戶去掉自己的root身份 db.revokeRolesFromUser("myroot", [{role: "root", db: "admin"}])
    # 撤銷自己的root身份
# 授予角色權限, 上面已經提到了 db.grantRolesToUser("myroot", [{role: "root", db: "admin"}])
# 創建普通用戶 db.createUser({ user:'chen',pwd:'111',roles:[{ role:'readWrite', db: 'db1'}]});     # 用戶chen對於db1數據庫有讀寫權限, 對於其他數據庫沒有任何權限     # ### 注意 : 創建普通用戶得去到對應的庫下面創建, 這樣創建的用戶才能管理這個庫
> db.system.users.find().pretty() 或者使用 > db.system.users.find() # 在admin庫下查看全局所有用戶 show users # 查看當前庫下的用戶
# 刪除用戶 : > db.system.users.remove({_id:"XXX.XXX"}) # 根據id刪除用戶 > db.system.users.remove({user:"XXXXXX"}) # 根據用戶名刪除用戶 # 更改密碼 : db.changeUserPassword("myroot", "666") # 將myroot用戶的密碼改為666, 當然事先你得用myroot用戶登錄 # 登錄mongodb : 一般用mongo admin直接進入admin庫下,然后進行身份驗證就行了, 或者 mongo -u myroot -p 123 "admin"     遠程登錄 mongo -host 192.168.3.17 --port 27017 -u myroot -p 123 "admin"

 

# ### MongoDB常用命令

> show dbs #顯示數據庫列表 
> show collections #顯示當前數據庫中的集合(類似關系數據庫中的表) > show users #顯示用戶 > use <db name> #切換當前數據庫,如果數據庫不存在則創建數據庫。 > db.help() #顯示數據庫操作命令,里面有很多的命令 > db.foo.help() #顯示集合操作命令,同樣有很多的命令,foo指的是當前數據庫下,一個叫foo的集合,並非真正意義上的命令 > db.foo.find() #對於當前數據庫中的foo集合進行數據查找(由於沒有條件,會列出所有數據) > db.foo.find( { a : 1 } ) #對於當前數據庫中的foo集合進行查找,條件是數據中有一個屬性叫a,且a的值為1 MongoDB沒有創建數據庫的命令,但有類似的命令。 如:如果你想創建一個“myTest”的數據庫,先運行use myTest命令,之后就做一些操作(如:db.createCollection(‘user’)),這樣就可以創建一個名叫“myTest”的數據庫。 其他命令 > db.dropDatabase() #刪除當前使用數據庫 > db.cloneDatabase("127.0.0.1") #將指定機器上的數據庫的數據克隆到當前數據庫 > db.copyDatabase("mydb", "temp", "127.0.0.1") #將本機的mydb的數據復制到temp數據庫中 > db.repairDatabase() #修復當前數據庫 > db.getName() #查看當前使用的數據庫,也可以直接用db > db.stats() #顯示當前db狀態 > db.version() #當前db版本 > db.getMongo() #查看當前db的鏈接機器地址 > db.serverStatus() #查看數據庫服務器的狀態 查看分片結果: db.printShardingStatus() 測試:向test數據庫的user表中添加10w條數據: use test for(var i=0;i<100000;i++){   db.user.insert({"name":"test"+i,"age":i}); }

 

# ### 登錄命令

# ### 登錄
mongo -uroot -p123  admin # 方法一
mongo admin 快捷進入mongo的admin權限庫 然后 db.auth('root', '123')  # 方法二
mongo  # 進去之后 use admin 然后 db.auth('root', '123')  # 方法三

 

# ### mongodb的三個結構: 數據庫db/數據集(集合)collection/文檔xxx, 分別對應着mysql中的數據庫/數據表/數據記錄

# ### 數據庫相關操作

show dbs  # 顯示所有數據庫
use db1  # 使用db1數據庫,如果數據庫中沒數據,則該數據庫也就不存在
db.stats()  # 顯示當前數據庫的各種信息
db.dropDatabase()  # 刪除當前數據庫, 包括數據庫中的數據集
db  # 顯示當前所在的數據庫

 

 # ### 數據集相關操作

show collections  # 顯示當前庫中所有數據集
db.createCollection("user")  # 創建user數據集
db.users.renameCollection("staff")  # 將user數據集改名為staff
db.staff.drop()  # 刪除staff數據集

 

# ### 文檔(數據)相關操作

db.article.insert( {'title': '博客1','content': '開始寫博客'} );  # 往article數據集中插入一條數據, 就相當於給insert函數傳參一個字典, 
        # 其中鍵可以不加引號,會自動識別, 單雙引號都可以用
db.article.find()  # 顯示article數據集中所有文檔
for(var i = 3; i <=10; i++ ) {  # for循環插入多個文檔, 每條數據的字段不相同也能插入,這就是mongodb的柔軟性
    db.article.insert({
        title: "我的第" + i + "篇博客" }); } db.article.count() # 查看article數據集有多少條數據 db.article.remove({}) # 刪除article數據集中所有文檔

 

# ### find語法

db.數據集名.find({"字段名":"條件"})
$gte, $gt, $lte, $lt  # 大於等於, 大於, 小於等於, 小於
$eq, $ne  # 等於, 不等於
正則表達式:/k/, /^k/  # 值中包含k, 值以k開頭  
        # ### 注意, 正則表達式兩邊不要用引號包起來,會識別不了
db.[collection_name].distinct("field_name");  # 取出這個字段並排序, 結果就是里面有多個字段的數組
use komablog; db.posts.remove({}); 測試 : use komablog; db.posts.remove({}); db.posts.insert({title:"怪物獵人世界評測","rank":2,"tag":"game"}); db.posts.insert({title:"紙片馬里奧試玩體驗","rank":1,"tag":"game"}); db.posts.insert({title:"Utunbu16LTS的安裝","rank":3,"tag":"it"}); db.posts.find({"tag": "game"}); # 取出tag是game的文檔 db.posts.find({"rank": {$gte: 2}}); # 取出rank 大於等於2的文檔 db.posts.find({"title": /馬/}); # 取出title中包含'馬'的 db.posts.find({"title": /^U/}); # 取出以'U'開頭的 db.posts.distinct("tag"); # 取出tag字段的所有值,(自動去重並排序) 結果 : ["game", "tag"]

 

db.[collection_name].find({篩選條件}, {field1: true, field2: 1})  # 第二個字典里可以填寫想/不要哪些字段

db.posts.find();
db.posts.find({"title": /u/, "rank":{$gte:5} });  # 相當於與, 找到兩個條件同時成立的文檔
db.posts.find({$or: [{"title": /u/}, {"rank":{$gte:4}}] });  # 或
db.posts.find({"rank": {$in: [3,4]} });  # rank字段值在[3, 4]中選
db.posts.insert({ "title":"驚!騎士發生重大交易", "istop": false });  # 添加一條新文檔, 有一個新的字段istop
db.posts.find({"istop": {$exists: true} });  # 找到包含istop這個字段的文檔, 結果就是剛剛我們插入的那條數據
 db.posts.find({"tag": "game"},{title:true,rank:1}); # 取出tag是game的title字段和rank字段, 其中true和1是等價的,都代表true 而false和0也是等價的,都代表不取這個字段, 其實每次取默認都取_id字段, 所以可以用_id : 0來不取_id

 

sort()  # 排序
limit()  # 取出多少
skip()  # 跳過多少再取

db.posts.find();
db.posts.find({}, {_id:0}).sort({rank:1});  # 按照rank字段進行升序排序
db.posts.find({}, {_id:0}).sort({rank:-1});  # 按照rank字段進行降序排序
db.posts.find({}, {_id:0}).limit(3); db.posts.find({}, {_id:0}).sort({rank:-1}).limit(3); db.posts.findOne({}, {_id:0}); # findOne只取一個,相當於后面加.limit(1) db.posts.find({}, {_id:0}).limit(3); # 取前三個 db.posts.find({}, {_id:0}).skip(3).limit(3); # 跳過前三個再取三個

 

update(<filter>, <update>, <options>)  # 第一個參數為篩選條件, 第二個為更新選項, 第三個為其他選項
$set   # 修改或新增, 有這個字段就更新, 沒有這個字段就添加 , 不加$set就是直接移除原有字段, 變成新字段了
update命令參考官網 https://docs.mongodb.com/manual/reference/method/db.collection.update

use komablog;
db.posts.findOne({"title":"怪物獵人世界評測"}); db.posts.update({"title":"怪物獵人世界評測"}, {$set: {"rank": 10} }); db.posts.find(); db.posts.update({"title":"怪物獵人世界評測"}, {"rank": 99}); # 將title是怪物獵人的文檔更新為只剩'rank' : 99這一個字段 db.posts.find(); db.posts.update({"tag":"it"}, {$set: {"rank": 50}}); # 將tag為it的文檔的rank更新為50,默認只更新一條 db.posts.find(); db.posts.update({"tag":"it"}, {$set: {"rank": 60}}, {multi: true}); # multi: true指定更新所有符合調價你的文檔 db.posts.find();

 

$inc  # 遞加, increase
$mul  # 相乘 multiply
$rename  # 改名
$set  # 新增or修改
$unset  # 字段刪除

$ mongo
use komablog;
db.posts.find({title:"紙片馬里奧試玩體驗"}, {_id:0}); db.posts.update({title:"紙片馬里奧試玩體驗"}, {$inc: {rank: 1}}); # 原來rank的基礎上加1 db.posts.update({title:"紙片馬里奧試玩體驗"}, {$mul: {rank: 2}}); # 原來rank的基礎上乘2 db.posts.update({title:"紙片馬里奧試玩體驗"}, {$rename: {"rank": "score"}}); # 將rank字段改名為score db.posts.update({title:"紙片馬里奧試玩體驗"}, {$set: {"istop": true}}); # 新增字段istop: true db.posts.update({title:"紙片馬里奧試玩體驗"}, {$unset: {"istop": true}}); # 刪掉字段istop: true db.posts.find({title:"紙片馬里奧試玩體驗"}, {_id:0});

 

upsert : true  # 相對於文檔(記錄)有則更新,無則新增 ; 注意,之前那個$set是相對於字段的修改或新增, 需要區分一下
        # 默認為false
.remove()  # 條件刪除數據(文檔)

$ mongo
use komablog;
db.posts.find({}, {_id:0});
db.posts.update({title:"其實創造比大志好玩"}, {title:"其實創造比大志好玩", "rank":5,"tag":"game"});  # 沒找到title為這個的數據,無法直接更新
db.posts.find({}, {_id:0}); db.posts.update({title:"其實創造比大志好玩"}, {title:"其實創造比大志好玩", "rank":5,"tag":"game"}, {upsert:true}); # 有則更新,無則新增,所以這里能夠更新 db.posts.remove({title:"其實創造比大志好玩"}); db.posts.find({}, {_id:0});

 

# ### 數據集的索引

db.posts.getIndexes()  # 查看當前數據集的索引
createIndex({...}, {...})  # 創建索引, 跟條件(創建什么樣的索引?主鍵/普通索引等等), 創建索引為了方便查找
dropIndex({...})  # 刪除索引

$ mongo
use komablog;
db.posts.getIndexes();
db.posts.createIndex({rank:-1});  # 以rank字段降序創建一個索引
db.posts.dropIndex({rank:-1});  # 刪除剛剛創建的索引
db.posts.createIndex({title:1}, {unique:true});  # 創建一個以title字段升序的 唯一 索引
db.posts.find({}, {_id:0}); db.posts.insert({title:"怪物獵人世界評測"}); # title是唯一索引,並且值已經有怪物獵人了,再插入同樣的會報錯,duplicate key error collection(重復鍵錯誤數據集) # 當然你如果插入一條沒有title字段的文檔, 也會報錯, 錯誤原因是主鍵title不能為null > db.posts.getIndexes(); [ { "v" : 2, "key" : { "_id" : 1 # 只有_id這一個索引字段  }, "name" : "_id_", # 這是mongodb的默認索引 "ns" : "komablog.posts" } ]

 

# ### 備份與恢復

mongodump  # 備份
mongorestore  # 恢復
# 參考博客 https://www.cnblogs.com/clsn/p/8244206.html

mongodump -uroot -p123 --authenticationDatabase admin -d komablog  # 備份, 在mongodb外邊執行的
        # 其中--authenticationDatabase admin指的是在admin權限庫中驗證-u和-p帶的用戶名和密碼, 作為游客的話就不認證
        # -d 指定備份的數據庫; -h 指明數據庫宿主機的IP ; -c 指明collection數據集的名字; -f 指明要導出那些列(字段)
        # -o 指明到要導出的文件名,默認為dump ; -q 指明導出數據的過濾條件 ; --type 指定文件類型
mongorestore -uroot -p123 --authenticationDatabase admin --drop  # 恢復, 在mongodb外邊執行的
        # 上面有的參數就不說了, 還有一個新參數 --drop 插入之前先刪除原有的(就相當於重寫)
        # --headerline 指明第一行是列名,不需要導入。
        # -j 同時運行的插入操作數(默認為1),並行
# 備份完了刪數據集, 然后出來ls看一下備份文件, 然后恢復, 進去mongodb看數據又回來了

 

# ### 與python的交互

pip install pymongo
from pymongo import * client = MongoClient('mongodb://127.0.0.1:27017') # 無安全認證的mongo連接 client = MongoClient('mongodb://用戶名:密碼@127.0.0.1:27017/驗證數據庫') # 有安全認證的mongo連接 # pymongo有兩個類比較重要 # 1 database類,用來獲取數據庫 db = client.db1 # 指定連接db1數據庫 # 2 collection類 主要方法: insert_one insert_many update_one update_many delete_one delete_many find_one find article_obj = db1.article # 獲取article集合對象,接下來就可以操作一波了 s1_id = article_obj.insert_one({'name': '張三豐', 'age': 61}).inserted_id # 后面加個.insert_id, 可以返回插入數據的id, 當然也可以不加.insert_id不看 print(s1_id) article_obj.update_one({'name': '張三豐', 'age': 61}, {$set: {name: '張四豐'}}) # .sort() 排序, 升序用ASCENDINT, 降序用DESCENDING # 錯了 好像現在不能用ASCENDINT和DESCENDING,得用1和-1 res = article.find().sort([ ('rank',1),('tag',-1) ]) # 注意, 這里不是一個字典了,中間是逗號 # ### 實例 from pymongo import MongoClient client = MongoClient('mongodb://root:123@106.53.21.61:27017/admin') # 1 database類,獲取數據庫 db1 = client.komablog posts_obj = db1.posts # s1_id = posts_obj.insert_one({'name': '張三豐', 'age': 61}).inserted_id # 后面加個.insert_id, 可以返回插入數據的id, # 當然也可以不加.insert_id不看 # print(s1_id) # posts_obj.update_one({'name': '張三豐'}, {'$set': {'name': '張四豐'}}) # 其他操作都是按照方法來了,posts_obj就相當於在mongo中的db.posts # res = posts_obj.find({'rank': {"$gte": 1}}).sort([('rank', 1), ('tag', -1)]) res = posts_obj.find().sort([('rank', 1), ('tag', -1)]) for i in res: print(i)

 

 

 

 

轉載自: https://www.cnblogs.com/pl-boke/p/10063351.html 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM