NoSQL是Not Only SQL的縮寫,指的是非關係型數據庫,與傳統的關係型數據庫相對應,主要用於超大規模數據的存儲。前端
與RDBMS相比,具備以下特色:正則表達式
優勢:高可擴展性;分佈式計算;低成本;半結構化數據;關係簡單。sql
缺點:沒有標準化;查詢功能有限;最終一致性沒有ACID直觀。mongodb
MongoDB是一個基於分佈式文件存儲的開源數據庫系統,爲Web應用提供可擴展的高性能數據存儲解決方案。將數據存儲爲一個文檔,數據結構由鍵值對組成。存儲的數據與應用的數據,在格式上(JSON)高度一致。數據庫
主要特色:express
官網地址編程
與RDBMS的概念相同。MongoDB的默認數據庫爲「db」,存儲在data目錄中。不一樣的數據庫放置在不一樣的文件中。json
數據庫名稱的限制:數組
保留的數據庫名稱:服務器
至關於RDBMS中「表」的概念。集合沒有固定的結構,能夠插入不一樣格式和類型的數據。數據庫的信息存儲在dbname.system命名空間下的特殊集合中。
集合名稱的限制:
至關於RDBMS中「行」的概念。MongoDB的文檔不須要設置相同的字段,而且相同字段不須要相同的數據類型。文檔的數據結構採用BSON格式,和JSON基本相同,BSON是一種類json的二進制形式的存儲格式。
使用文檔時須要注意:
至關於RDBMS中「列」的概念。
字段的經常使用類型:
與RDBMS的概念相同。
自動將_id
字段設置爲主鍵。
不支持錶鏈接,但能夠經過嵌入文檔的方式實現。
從官網下載並直接安裝,設置path環境變量。
直接啓動:
mongod
指定配置文件啓動:
mongod --config /etc/mongodb.conf
建立數據庫:
use DATABASE_NAME
若是數據庫不存在,則建立數據庫,不然切換到指定的數據庫。
查看當前數據庫:
db
查看全部數據庫:
show dbs
刪除當前數據庫:
db.dropDatabase()
在刪除以前應該使用db命令查看當前數據庫名,或者使用use命令切換到要刪除的數據庫。
刪除集合:
db.collection.drop()
插入:
db.COLLECTION_NAME.insert(document)
若是集合不存在,MongoDB會自動建立該集合並插入文檔。若是不指定_id
字段,save方法與insert方法相似。若是指定_id
字段,save方法會更新該_id
的數據。
更新:
db.COLLECTION_NAME.update(query, update, {upsert:boolean, multi:boolean, writeConcern:document})
經過傳入的文檔替換已有的文檔:
db.COLLECTION_NAME.save(document, {writeConcern:document})
刪除:
db.COLLECTION_NAME.remove(query, {justOne:boolean, writeConcern:document})
若是不包含任何參數,則刪除集合中的全部文檔。建議在執行remove操做以前,先執行find命令來判斷執行條件是否正確。
查詢:
db.COLLECTION_NAME.find()
若是但願格式化查詢的結果,可使用pretty方法:
db.COLLECTION_NAME.find().pretty()
若是但願只返回一個文檔:
db.COLLECTION_NAME.findOne()
在find方法中,傳入多個鍵值對,每一個鍵值對之間以逗號分隔,等價於SQL中的and條件:
db.COLLECTION_NAME.find({key1:value1, key2:value2})
在find方法中,使用關鍵字$or,等價於SQL中的or條件:
db.COLLECTION_NAME.find({$or:[{key1:value1, key2:value2}]})
在MongoDB中,有四種條件操做符,分別是$gt、$lt、$gte、$lte,對應SQL中的大於、小於、大於等於和小於等於。
db.COLLECTION_NAME.find({key: {$gt : value}})
還有一個條件操做符$type,用來判斷字段的類型:
db.COLLECTION_NAME.find({key: {$type : typeid}})
使用limit方法,指定要讀取的記錄數量:
db.COLLECTION_NAME.find().limit(NUMBER)
使用skip方法,跳過指定數量的記錄,參數默認爲0:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
使用sort方法,指定排序的字段,參數爲1表示升序,-1表示降序,默認按照升序排列:
db.COLLECTION_NAME.find().sort({KEY:1})
使用aggregate方法,處理數據並返回計算後的數據結果:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
聚合操做包括:
在MongoDB中,可使用聚合管道,將文檔在一個管道處理完畢以後把結果傳遞給下一個管道處理。
經常使用的管道操做:
索引是特殊的數據結構,存儲在一個易於遍歷讀取的數據集合中,是對數據庫表中的若干字段的值進行排序的一種結構。MongoDB還提供多個可選參數,用來限定索引的規則。
建立索引:
db.COLLECTION_NAME.ensureIndex({KEY:1})
複製:將數據同步在多個服務器的過程。提供了數據的冗餘備份,並在多個服務器上存儲數據副本。容許從硬件故障和服務中斷中恢復數據。複製至少須要兩個節點,其中一個是主節點,負責處理客戶端請求,其他都是從節點,負責複製主節點的數據。
分片:當存儲海量數據時,一臺機器不足以存儲數據,也不足以提供可接受的讀寫量。能夠經過在多臺機器上分割數據,使得數據庫系統可以存儲和處理更多的數據。Shard用於存儲實際的數據塊,實際使用中一個shard server能夠由幾臺機器組成。Config server存儲整個ClusterMetadata,其中包括chunk信息。Query routers前端路由,客戶端由此接入。
備份:在MongoDB中,可使用mongodump命令來備份數據,該命令能夠導出全部數據到指定目錄。
mongodump -h dbhost -d dbname -o dbdirectory
恢復:在MongoDB中,可使用mongorestore命令來恢復備份的數據。
mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
在安裝部署並啓動MongoDB服務後,必須瞭解運行狀況,並查看其性能。
mongostat是MongoDB自帶的狀態檢測工具。mongotop用來跟蹤一個MongoDB實例,查看讀寫所花費的時間。這兩個工具都位於MongoDB的安裝目錄的bin目錄下。