day106:MoFang:BUG:獲取資料驗證token是否過期&相簿/相機取消頭像無法顯示&MongoDB

Poke發表於2020-12-10

目錄

BUG1:前端在獲取資料時,要檢驗token是否過期

BUG2:相簿/相機取消後設定頁面頭像無法顯示

MongoDB

  1.MongoDB基本介紹

  2.MongoDB安裝

  3.MongoDB:通用操作

  4.MongoDB:使用者管理

  5.MongoDB:庫管理

  6.MongoDB:集合管理

  7.MongoDB:資料型別

  8.MongoDB:文件管理

BUG1:前端在獲取資料時,要檢驗token是否過期

1.後端修改User.refresh介面並增加User.check介面

增加了兩部分:

1.生成token前判斷使用者是否存在

2.生成token成功後,將errno/errmsg/token返回給前端

application/apps/users/views.py,程式碼:

@jsonrpc.method("User.check")
@jwt_required # 驗證jwt
def check():
    return {
        "errno": status.CODE_OK,
        "errmsg": message.ok,
    }

'''
增加了兩部分:
1.生成token前判斷使用者是否存在
2.生成token成功後,將errno/errmsg/token返回給前端
'''
@jsonrpc.method("User.refresh")
@jwt_refresh_token_required # 驗證refresh_token
def refresh():
    """重新獲取新的認證令牌token"""
    current_user_id = get_jwt_identity()
    user = User.query.get(current_user_id)
    if user is None:
        return {
            "errno": status.CODE_NO_USER,
            "errmsg": message.user_not_exists,
        }

    # 重新生成token
    access_token = create_access_token(identity=current_user_id)
    return {
        "errno": status.CODE_OK,
        "errmsg": message.ok,
        "access_token": access_token
    }

2.前端在獲取資料前,檢驗token是否過期

1.avatar.html增加checkout方法

客戶端在獲取資料的時候, 進行token是否過期的判斷.

avatar.html,程式碼:

upload_avatar(ret){
    var token = this.game.get("access_token") || this.game.fget("access_token");
    if(!token){
        this.game.goFrame("login","login.html", this.current);
        return ;
    }
    // ***判斷token是否過期***
    this.game.checkout(this, token, (new_access_token)=>{
        if(new_access_token === false){
            this.game.print(new_access_token);
            return ;
        }
        this.axios.post("",{
            "jsonrpc": "2.0",
            "id": this.uuid(),
            "method": "User.avatar.update",
            "params": {
                "avatar": ret.base64Data,
            }
        },{
            headers:{
                Authorization: "jwt " + new_access_token,
            }
        }).then(response=>{
            if(parseInt(response.data.result.errno)==1000){
                this.game.fsave({"avatar": response.data.result.avatar});
                // 傳送自定義事件
                api.sendEvent({
                    name: 'change_avatar',
                    extra: {
                        "avatar": response.data.result.avatar
                    }
                });
                this.game.outFrame("avatar");
            }else{
                this.game.print(">>>> fail");
                this.game.print(response.data);
            }
        }).catch(error=>{
            // 網路等異常
            this.game.print(error);
        });

    });

}
}
});
}

2.main.js提供checkout方法和get_access_by_refresh方法

class Game{
    // 驗證使用者token是否存在或者是否失效的功能
    checkout(vm, token, callback){
        vm.axios.post("",{
            "jsonrpc": "2.0",
            "id": vm.uuid(),
            "method": "User.check",
            "params": {}
        },{
            headers:{
                Authorization: "jwt " + token,
            }
        }).then(response=>{
            if(parseInt(response.data.result.errno) === 1005){
                api.actionSheet({
                    title: '本次登陸超時,是否更新登陸狀態?',
                    cancelTitle: '取消登陸',
                    destructiveTitle: '更新登陸狀態',
                }, (ret, err)=>{
                    if( ret.buttonIndex == 1 ){ // 如果選擇了更新登入狀態
                                this.get_acccess_by_refresh(vm, callback);
                    }
                });

            }else if (parseInt(response.data.result.errno) === 1000){
                callback(token);
            }
            return false;
        }).catch(error=>{
            this.print(error);
        });

    }
    // 重新整理token的方法
    get_acccess_by_refresh(vm, callback){
        var token = this.get("refresh_token") || this.fget("refresh_token");
        if( !token ){
            return false;
        }
        vm.axios.post("",{
            "jsonrpc": "2.0",
            "id": vm.uuid(),
            "method": "User.refresh",
            "params": {}
        },{
            headers:{
                Authorization: "jwt " + token,
            }
        }).then(response=>{
            if(response.data.result.errno===1000){
                this.save({"access_token": response.data.result.access_token});
                callback(response.data.result.access_token);
            }
        })
    }

BUG2:相簿/相機取消後設定頁面頭像無法顯示

在使用者修改頭像,如果開啟相簿或者相機時,取消操作,會導致設定頁面的頭像不顯示,avatar.html,程式碼;

 update_avatar_confirm(){
          // 確認上傳頭像的方式
          api.actionSheet({
              title: '請選擇上傳頭像的來源',
              cancelTitle: '取消',
              buttons: ['相簿','相機'],
          }, (ret, err)=>{
              if( ret ){
                   // 本地獲取相簿/相機的圖片
                   var sourceType = ["album","camera"];
                   if(ret.buttonIndex > sourceType.length){
                     // 如果使用者選擇了取消,則關閉當前修改頭像的頁面
                     this.game.outFrame("avatar");
                     return;
                   }
                   api.getPicture({
                       sourceType: sourceType[ret.buttonIndex-1],
                       mediaValue: 'pic',
                       destinationType: 'base64',
                       allowEdit: true,
                       preview:true,
                       quality: 100,
                       targetWidth: 100,
                       targetHeight: 100,
                       saveToPhotoAlbum: true,
                   }, (ret, err)=>{
                       if(ret.base64Data){
                            this.upload_avatar(ret);
                       }else{
                            // ***如果選擇取消:回到設定頭像介面***
                            this.game.outFrame("avatar");
                       }
                   });

              }else{
                   this.game.print( err );
              }
          });

MongoDB

官方文件:https://docs.mongodb.com/

操作文件:https://www.qikegu.com/docs/3283

1.MongoDB基本介紹

MongoDB 是由C++語言編寫並基於分散式檔案儲存的開源資料庫。

MongoDB 是一款介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的NOSQL資料庫。它面向文件儲存,而且安裝和操作起來都比較簡單和容易,而且它支援各種流行程式語言進行操作,如Python,Node.js,Java,C++,PHP,C#,Ruby等。

目前在大資料、內容管理、持續交付、移動應用、社交應用、使用者資料管理、資料中心等領域皆有廣泛被使用。

1.MongoDB相對於RDBMS的優勢

  • 無固定結構 。

  • 資料結構由鍵值(key=>value)對組成。MongoDB 的文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列,單個物件的結構是清晰的。

  • 沒有複雜的表連線。不需要維護表與表之間的內在關聯關係。

  • 查詢功能強大。MongoDB的查詢功能幾乎與SQL一樣強大,使用基於文件的查詢語言,可以對文件進行動態查詢。

  • 易於調優和擴充套件。具備高效能、高可用性及可伸縮性等特性

  • 應用程式物件與資料庫物件天然對應。

  • 可以基於記憶體儲存或者硬碟檔案儲存,提供豐富的查詢操作和索引支援,也有事務操作,可以更快地更穩定的訪問資料。

2.mongodb和mysql術語對比

SQLMongodb描述
庫(database) 庫(database)  
表(Talbe) 集合(Collection)  
行/記錄(Row) 文件(Document) Document就是json結構的一條資料記錄
列/欄位(Col) 欄位/鍵/域(Field)  
主鍵(Primary Key) 物件ID(ObjectId) _id: ObjectId("10c191e8608f19729507deea")
索引(Index) 索引(Index) 也有普通索引, 唯一索引這麼區分的

 

 

 

 

 

 

 

 

 

2.MongoDB安裝

目前最新版本為4.4版本,ubuntu18.04中預設安裝的是3.6版本【可以繼續基於這個版本進行學習,這塊內容跳過即可】。

安裝之前建議更新下Linux源.

1.更新Linux源

# 1、備份原始檔
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  
# 2、新增源到sources.list中
sudo gedit /etc/apt/sources.list

# 在開啟的文字中,新增阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

# 3、更新源
sudo apt-get update

2.安裝MongoDB 4.4

如果要在ubuntu18.04中安裝最新4.4版本mongodb,則需要完成以下命令步驟:

# 安裝依賴包
sudo apt-get install libcurl4 openssl
# 關閉和解除安裝原有的mongodb
service mongodb stop
sudo apt-get remove mongodb

# 匯入包管理系統使用的公鑰
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
# 如果命令執行結果沒有顯示OK,則執行此命令在把上一句重新執行:sudo apt-get install gnupg

# 註冊mongodb源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

# 更新源
sudo apt-get update

# 安裝mongodb
sudo apt-get install -y mongodb-org=4.4.2 mongodb-org-server=4.4.2 mongodb-org-shell=4.4.2 mongodb-org-mongos=4.4.2 mongodb-org-tools=4.4.2
# 安裝過程中如果提示: mongodb-org-tools : 依賴: mongodb-database-tools 但是它將不會被安裝
# 終端下執行以下命令,解決:
# sudo apt-get autoremove mongodb-org-mongos mongodb-org-tools mongodb-org
# sudo apt-get install -y mongodb-org=4.4.2

# 建立資料儲存目錄
sudo mkdir -p /data/db

# 修改配置,開放27017埠
sudo vim /etc/mongodb.conf
# 把12行附近的port=27017左邊的#號去掉

3.啟動和關閉MongoDB

# 重新載入配置,並啟動mongodb
sudo systemctl daemon-reload
sudo systemctl start mongod

# 檢視執行狀態
sudo systemctl status mongod
# 如果mongodb狀態為stop,則執行 sudo systemctl enable mongod

# 停止mongodb
sudo systemctl stop mongod

# 重啟mongodb
sudo systemctl restart mongod

4.進入互動終端

MongoDB安裝完成後,預設是沒有許可權驗證的,預設是不需要輸入使用者名稱密碼即可登入的

也可以啟動許可權認證,但是必須注意:

mongodb預設是沒有管理員賬號的,所以要先切換到admin資料庫新增管理員賬號,再開啟許可權認證,否則就玩大了。

# 進入互動終端
mongo

5.啟動終端後的效果

MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2c920d56-ddbb-4649-9191-a3bd4506a2d2") }
MongoDB server version: 4.4.2
---
The server generated these startup warnings when booting: 
        # 警告:強烈建議使用XFS檔案系統,並使用WiredIger儲存引擎。
        # 解釋:因為當前ubuntu使用的是ext4檔案系統,mongodb官方建議使用XFS檔案系統功能更能發揮mongodb的效能,忽略不管
        2020-11-23T16:23:34.416+08:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
        # 警告:當前mongodb沒有為資料庫啟用訪問控制。對資料和配置的讀寫訪問是不受限制的。
        # 解釋:後面會建立資料庫使用者採用密碼登陸的。暫時不用管
        2020-11-23T16:23:35.046+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

1.mongod是處理MongoDB系統的主要程式。主要負責處理資料請求,管理資料儲存,和執行後臺管理操作。

當我們執行mongod命令意味著正在啟動MongoDB程式,並且在後臺執行。

2.mongo是一個命令列工具,用於連線一個特定的mongod例項。

當我們沒有帶引數執行mongo命令它將使用預設的埠號27017和localhost進行連線

6.退出終端和檢視MongoDB版本

exit # 退出互動終端
mongo --version # 檢視MongoDB版本
# 或者終端內部使用 version()

3.MongoDB:通用操作

1.檢視幫助文件:db.help()

day106:MoFang:BUG:獲取資料驗證token是否過期&相簿/相機取消頭像無法顯示&MongoDB
    db.help()                    help on db methods
    db.mycoll.help()             help on collection methods
    sh.help()                    sharding helpers
    rs.help()                    replica set helpers
    help admin                   administrative help
    help connect                 connecting to a db help
    help keys                    key shortcuts
    help misc                    misc things to know
    help mr                      mapreduce

    show dbs                     show database names
    show collections             show collections in current database
    show users                   show users in current database
    show profile                 show most recent system.profile entries with time >= 1ms
    show logs                    show the accessible logger names
    show log [name]              prints out the last segment of log in memory, 'global' is default
    use <db_name>                set current database
    db.mycoll.find()             list objects in collection mycoll
    db.mycoll.find( { a : 1 } )  list objects in mycoll where a == 1
    it                           result of the last line evaluated; use to further iterate
    DBQuery.shellBatchSize = x   set default number of items to display on shell
    exit                         quit the mongo shell
db.help()檢視幫助文件

2.檢視當前伺服器狀態:db.serverStatus()

day106:MoFang:BUG:獲取資料驗證token是否過期&相簿/相機取消頭像無法顯示&MongoDB
{
    "host" : "ubuntu",    # 主機名
    "version" : "4.4.2",  # mongodb版本
    "process" : "mongod", # mongodb程式,主要有mongod和mongos(分片叢集中)兩種
    "pid" : NumberLong(1034),  # mongod的pid程式號,可以在linux終端下使用命令 pidof mongod 驗證
    "uptime" : 105063,    # mongod服務啟動的秒數
    "uptimeMillis" : NumberLong(105063193), # mongod服務啟動的毫秒數
    "uptimeEstimate" : NumberLong(105063),  # mongod內部自己計算的啟動秒數
    "localTime" : ISODate("2020-12-08T16:01:08.230Z"), # 本地時間
    # 連線數相關 
    "connections" : {
        "current" : 1,  # 當前連線數
        "available" : 51199, # 可用連線數
        "totalCreated" : 1,  # 截止目前為止總共建立的連線數
        "active" : 1,   # 還在活躍的連線數

    },

    "globalLock" : {  # 全域性鎖相關資訊
        "totalTime" : NumberLong("105063115000"), # mongod啟動後到現在的總時間,單位微秒
        "currentQueue" : { # 當前等待鎖佇列
            "total" : 0,   # 當前全域性鎖的等待個數
            "readers" : 0, # 當前全域性讀鎖等待個數
            "writers" : 0  # 當前全域性寫鎖等待個數
        },
        "activeClients" : {
            "total" : 0,   # 當前活躍客戶端的個數
            "readers" : 0, # 當前活躍客戶端中進行讀操作的個數
            "writers" : 0  # 當前活躍客戶端中進行寫操作的個數
        }
    },

    "network" : { # 網路相關
        "bytesIn" : NumberLong(1611),    # 資料庫接收到的網路傳輸位元組數
        "bytesOut" : NumberLong(51269),  # 從資料庫傳送出去的網路傳輸位元組數
        "numRequests" : NumberLong(16),  # mongod接收到的總請求次數
        
    },
    
    # 操作計數器
    "opcounters" : {
        "insert" : NumberLong(0),  # 本次mongod例項啟動至今收到的插入操作總數 
        "query" : NumberLong(287), # 本次mongod例項啟動至今收到的查詢總數。
        "update" : NumberLong(0),  # 本次mongod例項啟動至今收到的更新操作總數 。
        "delete" : NumberLong(0),  # 本次mongod例項啟動至今的刪除操作總數。
        "getmore" : NumberLong(0), # 本次mongod例項啟動至今“getmore”操作的總數。
        "command" : NumberLong(588)# 本次mongod例項啟動至今向資料庫發出的命令總數 。
    },

    # 儲存引擎,是MongoDB的核心元件,負責管理資料如何儲存在硬碟(Disk)和記憶體(Memory)上
    # MongoDB 支援多種不用的儲存引擎(Storage Engine),MongoDB支援的儲存引擎有:WiredTiger,MMAPv1和In-Memory。
    # 1. WiredTiger,將資料持久化儲存在硬碟檔案中;從MongoDB 3.2 版本開始,成為MongDB預設儲存引擎
    # 2. In-Memory,將資料儲存在記憶體中
    # 3. MMAPv1,將資料持久化儲存在硬碟檔案中;
    # WiredTiger是比MMAPv1更好用,更強大的儲存引擎,WiredTiger的寫操作會先寫入快取(Cache)中,並持久化到WAL(Write ahead log,寫日誌),每60s或日誌檔案達到2GB時會做一次Checkpoint(檢查點),將當前資料進行持久化,產生一個新的快照。Wiredtiger連線初始化時,首先將資料恢復至最新的快照狀態,然後根據WAL恢復資料,以保證儲存可靠性。
    # Checkpoint,檢測點。將記憶體中的資料變更沖刷到磁碟中的資料檔案中,並做一個標記點。
    #             表示此前的資料表示已經持久儲存在了資料檔案中,此後的資料變更存在於記憶體和日誌中.
    #             是一種讓資料庫redo(重做)和data(資料)檔案保持一致的機制。
    #             並非Mongodb獨有的,mysql中的InnoDB也有。

    "storageEngine" : {
        "name" : "wiredTiger", 
        "supportsCommittedReads" : true,
        "oldestRequiredTimestampForCrashRecovery" : Timestamp(0, 0),
        "supportsPendingDrops" : true,
        "dropPendingIdents" : NumberLong(0),
        "supportsTwoPhaseIndexBuild" : true,
        "supportsSnapshotReadConcern" : true,
        "readOnly" : false,
        "persistent" : true,
        "backupCursorOpen" : false
    },
    

    "transactions" : { # 事務,mongodb4.0以後新增特性,單個mongodb不支援事務,必須搭建MongoDB複製集才支援
        "retriedCommandsCount" : NumberLong(0),
        "retriedStatementsCount" : NumberLong(0),
        "transactionsCollectionWriteCount" : NumberLong(0),
        "currentActive" : NumberLong(0),
        "currentInactive" : NumberLong(0),
        "currentOpen" : NumberLong(0),
        "totalAborted" : NumberLong(0),
        "totalCommitted" : NumberLong(0),
        "totalStarted" : NumberLong(0),
        "totalPrepared" : NumberLong(0),
        "totalPreparedThenCommitted" : NumberLong(0),
        "totalPreparedThenAborted" : NumberLong(0),
        "currentPrepared" : NumberLong(0)
    },
    "locks":{ # 鎖相關
    
    },
    "mem" : { # 記憶體相關
        "bits" : 64, # 作業系統位數
        "resident" : 18,  # 實體記憶體消耗,單位:M
        "virtual" : 1566, # 虛擬記憶體消耗
        "supported" : true # 是否顯示額外的記憶體資訊
    },
}
db.serverStatus()檢視當前伺服器狀態

3.檢視當前db連線的伺服器地址:db.getMongo()

4.檢視日誌:show logs

# 如果要檢視具體檔案的日誌。
show log global

4.MongoDB:使用者管理

1.建立使用者

db.createUser(user, writeConcern)

建立一個資料庫新使用者用db.createUser()方法,如果使用者存在則返回一個使用者重複錯誤。

錯誤資訊:uncaught exception: Error: couldn't add user: User "使用者名稱@資料庫" already exists

1.建立使用者語法

ppp

mongo的使用者是以資料庫為單位來建立的,每個資料庫有自己的管理員。

管理員可以管理所有資料庫,但是不能直接管理其他資料庫,要先在admin資料庫認證後才可以。

管理員的許可權設定包含了2塊,分別是角色和許可權,由roles屬性進行設定。

2.MongoDB的內建角色

資料庫使用者角色:read、readWrite; 
資料庫管理角色:dbAdmin、dbOwner、userAdmin;
叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 
備份恢復角色:backup、restore; 
所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 
超級使用者角色:root
# 有幾個角色間接或直接提供了系統超級使用者的訪問許可權(dbOwner 、userAdmin、userAdminAnyDatabase)

3.MongoDB的內建許可權

Read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile
userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者
clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。
readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。
root:只在admin資料庫中可用。超級賬號,超級許可權

4.給Admin資料庫建立賬戶管理員

當前賬號只能用於管理資料庫賬號,不能進行資料庫操作。

# 進入/切換資料庫到admin中
use admin
# 建立賬戶管理員
db.createUser({
    user: "admin",
    pwd: "123",
    roles: [
        {role: "userAdminAnyDatabase",db:"admin"}
    ]
})

5.建立超級管理員

當前賬號可以進行資料庫相關操作。

# 進入/切換資料庫到admin中
use admin
# 建立超級管理員賬號
db.createUser({
    user: "root",
    pwd: "123",
    roles: [
        { role: "root", db: "admin" }
    ]
})

6.建立使用者自己的資料庫的角色

帳號是跟著資料庫繫結的,所以是什麼資料庫的使用者,就必須在指定庫裡授權和驗證!!!

# 切換資料庫,如果當前庫不存在則自動建立
use mofang
# 建立管理員使用者
db.createUser({
    user: "mofang",
    pwd: "123",
    roles: [
        { role: "dbOwner", db: "mofang"}
    ]
})

2.使用者資訊

1.檢視當前庫下的使用者

只需要切換到對應的庫中即可檢視

use mofang
show users

2.檢視系統中所有的使用者

需要切換到admin中使用賬號管理員的許可權進行操作

use admin
db.auth("root","123")
db.system.users.find()

3.刪除使用者

db.system.users.remove(json條件)

# 有多種刪除方式,下面是根據user使用者名稱刪除使用者
db.system.users.remove({user:"mofang"})

4.修改密碼

必須切換到對應的庫下

db.changeUserPassword("賬戶名", "新密碼")

use mofang
db.changeUserPassword("mofang", "123456")

5.開啟mongodb賬戶認證機制

在啟動mongod的時候增加--auth引數

sudo pkill mongod                              # 殺死mongod服務
sudo mongod -f /etc/mongod.conf --fork --auth  # --auth 表示以認證模式啟動服務,不加則關閉

5.MongoDB:庫管理

1.顯示所有資料庫列表【空資料庫不會顯示,或者說空資料庫已經被刪除了。】

show dbs

2.切換資料庫,如果資料庫不存在則建立資料庫

use  <database>

3.檢視當前工作的資料庫

db.getName()

4.刪除當前資料庫,如果資料庫不存在,也會返回{"ok":1}

db.dropDatabase()

5.檢視當前資料庫狀態

db.stats()

  {
        "db" : "mofang",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "totalSize" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "scaleFactor" : 1,
        "fileSize" : 0,
        "fsUsedSize" : 0,
        "fsTotalSize" : 0,
        "ok" : 1
    }

6.MongoDB:集合管理

1.建立集合

在mongodb中其實不建立集合,直接新增文件,mongodb也會自動生成集合的。

建立集合的兩種方式:

  1.db.createCollection()

  2.新增文件到不存在的集合中,MongoDB會自動建立集合

# 1.在mongodb中其實不建立集合,直接新增文件,mongodb也會自動生成集合的。


# name為必填引數,options為可選引數。capped若設定值為true,則size必須也一併設定
db.createCollection(name=<集合名稱>, options  = { 
    capped : <boolean>, # 建立固定集合,固定集合指限制固定資料大小的集合,當資料達到最大值會自動覆蓋最早的文件內容 
    size : <bytes_size>,      # 指定固定集合儲存的最大位元組數,單位:位元組數.
    max : <collection_size>   # 指定固定集合中包含文件的最大數量,單位:位元組數
})


# 2.新增文件到不存在的集合中,mongodb會自動建立集合,
db.集合.insert({"name":"python入門","price" : 31.4})

2.集合列表

show collections # 或 show tables   或 db.getCollectionNames()

3.刪除集合

db.集合.drop()

4.檢視集合

db.getCollection("集合")

5.檢視集合建立資訊

db.printCollectionStats()

7.MongoDB:資料型別

Type描述
ObjectID 用於儲存文件的ID,相當於主鍵
String 字串是最常用的資料型別,MongoDB中的字串必須是UTF-8編碼。
Integer 整數型別用於儲存數值。整數可以是32位,也可以是64位,這取決於你的伺服器。
Double 雙精度型別用於儲存浮點值,mongodb中沒有float浮點數這個說法
Boolean 布林型別用於儲存布林值(true/ false)
Arrays 將陣列、列表或多個值儲存到一個鍵
Timestamp 時間戳,用於記錄文件何時被修改或建立。
Object 用於嵌入文件,相當於子屬性是另一個json而已
Null 空值,相當於 python的None
Symbol 與字串用法相同,常用於某些使用特殊符號的語言
Date 用於以UNIX時間格式儲存當前日期或時間。
Binary data 二進位制資料
Code 用於將JavaScript程式碼儲存到文件中
Regular expression 正規表示式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8.MongoDB:文件管理

文件的資料結構和 JSON 基本一樣。所有儲存在集合中的資料都是 BSON 格式。

BSON 是一種類似 JSON 的二進位制形式的儲存格式,是 Binary JSON 的簡稱。

1.新增文件

# 新增文件
# 方式1:
db.集合.insert(<document>)  # document就是一個json

# 方式2:       
db.集合.insertOne(          # 如果文件存在_id主鍵為更新資料,否則就新增資料。
   <document>
)

# 方式3
# 一次性新增多個文件, 多次給同一個集合建議使用insertMany比insertOne效率更好
db.集合.insertMany(
   [ <document> , <document>, ... ]
)

2.查詢文件

# 直接顯示查詢的所有
# 獲取一條
db.集合.findOne(
    <query>,     # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)
# 獲取多條
db.集合.find(
    <query>,      # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)

# 以易讀的方式來格式化顯示讀取到的資料
db.col.find().pretty() 

1.比較運算

操作格式範例SQL中的類似語句
等於 {<key>:<val>}<br>{<key>:{$eq:<val>}} db.集合.find({"name":"xiaoming"}) where name = 'xiaoming'
小於 {<key>:{$lt:<val>}} db.集合.find({"age":{$lt:17}}) where age < 17
小於或等於 {<key>:{$lte:<val>}} db.集合.find({"age":{$lte:17}}) where age <= 17
大於 {<key>:{$gt:<val>}} db.集合.find({"age":{$gt:17}}) where age > 17
大於或等於 {<key>:{$gte:<val>}} db.集合.find({"age":{$gte:17}}) where age >= 17
不等於 {<key>:{$ne:<val>}} db.集合.find({"age":{$ne:17}}) where age != 17
包含 {<key>:{$in:<val>}} db.集合.find({"age":{$in:[1,2,3]}}) where age in (1,2,3)

 

 

 

 

 

 

 

 

 

 

db.my_friend.find({"name":{$eq:"xiaohong"}}).pretty()
db.my_friend.find({"age":{$gt:15}}).pretty()

2.邏輯運算

操作格式語法
$and {<key>:<val>,<key>:<val>,...} db.集合.find({key1:value1, key2:value2})
$or {$or: [{<key>: <val>}, {<key>:<val>}]} db.集合.find({$or: [{key1: value1}, {key2:value2}]})
$and$or {<key>:<val>, $or: [{<key>: <val>}, {<key>:<val>}]}<br>{$and:[{$or:[{<key>:<val>},..]},$or:[{<key>:<val>},..]}]} db.集合.find({key1:value1, $or: [{key1: value1}, {key2:value2}]})
$not {<key>:{$not:{<$運算子>:<val>}}} $not操作符不支援`$regex正規表示式操作

 

3.其他運算子

操作格式語法說明
$type {<key>:{$type: <datetype>}} db.集合.find({"name":{$type:'string'}}) 匹配指定鍵是指定資料型別的文件
$exists {<key>:{$exists:<bool>} db.集合.find({"title":{$exists:true}}) 匹配具有指定鍵的文件
$regex { <key>:/模式/<修正符>}<br>{<key>:{$regex:/模式/<修正符>}} db.集合.find({"name":{$regex:/張$/}}) 按正則匹配

 

4.排序顯示

db.集合.find().sort({<key>:1})  # 升序,預設為升序
db.集合.find().sort({<key>:-1}) # 倒序, 

5.欄位投影

find()方法預設將返回文件的所有資料,但是可以通過設定find()的第二個引數projection,設定值查詢部分資料。

# 獲取一條
db.集合.findOne(
    <query>,     # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)
# 獲取多條
db.集合.find(
    <query>,      # 查詢條件
    {
        <key>: 0, # 隱藏指定欄位,例如:"_id":0,
        <key>: 1, # 顯示指定欄位,例如:"title":1,
        ....
    }
)

3.更新文件

# 更新一條
db.集合.update(
   <query>,   # update的查詢條件,一般寫法:{"屬性":{條件:值}}
   <update>,  # update的更新資料,一般寫法 { $set:{"屬性":"值"} } 或者 { $inc:{"屬性":"值"} }
   {
     upsert: <boolean>, # 可選引數,如果文件不存在,是否插入objNew, true為插入,預設是false,不插入
     multi: <boolean>,  # 可選引數,是否把滿足條件的所有資料全部更新
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)

# 更新多條
db.集合.updateMany(
   <query>,   # update的查詢條件,一般寫法:{"屬性":{條件:值}}
   <update>,  # update的物件,一般寫法 { $set:{"屬性":"值"} } 或者 { $inc:{"屬性":"值"} }
   {
     upsert: <boolean>, # 可選引數,如果文件不存在,是否插入objNew, true為插入,預設是false,不插入
     multi: <boolean>,  # 可選引數,是否把滿足條件的所有資料全部更新
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)

update修改器

操作語法 
$inc db.集合.update({<key1>:<val1>},{$inc:{<key2>:<val2>}}) 更新key1=val1的文件中key2的值為val2,類似python的遞增遞減
$set db.集合.update({<key1>:<val>}, {$set:{<key2>:<val2>}}) 更新key1=val1的文件中key2的值為val2,如果key2不存在則新增對應鍵值對
$unset db.集合.update({<key1>:<val>}, {$unset:{<key2>:<val2>}}) 移除key1=val1的文件中key2=val2這個鍵值對
$push db.集合.update({<key1>:<val>}, {$push:{<key2>:<val2>}}) 給key1=val1的文件中key2列表增加一個陣列成員val2。<br>key2必須是陣列
$pull db.集合.update({<key1>:<val>}, {$pull:{<key2>:<val2>}}) 與push相反,給key1=val1的文件中key2列表刪除指定成員val2
$pop db.集合.update({<key1>:<val>}, {$pop:{<key2>:<val2>}}) 給key1=val1的文件中key2列表移除第一個或最後一個成員。<br>val2只能是1(最後面)或-1(最前面),與python相反

 

4.刪除文件

db.集合.remove(
   <query>,  # remove的查詢條件,一般寫法:{"屬性":{條件:值}},如果不填寫條件,刪除所有文件
   {
     justOne: <boolean>,      # 可選刪除,是否只刪除查詢到的第一個文件,預設為false,刪除所有
     writeConcern: <document> # 可選引數,丟擲異常的級別。
   }
)

 

相關文章