MongoDB是一個文檔數據庫,提供好的性能,領先的非關係型數據庫。採用BSON存儲文檔數據。
BSON()是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON.
相對於json多了date類型和二進制數組。
數據庫能夠當作是一個電子化的文件櫃,用戶能夠對文件中的數據運行新增、檢索、更新、刪除等操做。數據庫是一個
全部集合的容器,在文件系統中每個數據庫都有一個相關的物理文件。
集合就是一組 MongoDB 文檔。它至關於關係型數據庫(RDBMS)中的表這種概念。集合位於單獨的一個數據庫中。
一個集合內的多個文檔能夠有多個不一樣的字段。通常來講,集合中的文檔都有着相同或相關的目的。
文檔由一組key value組成。文檔是動態模式,這意味着同一集合裏的文檔不須要有相同的字段和結構。在關係型
數據庫中table中的每一條記錄至關於MongoDB中的一個文
非關係型數據庫的顯著特色是不使用SQL做爲查詢語言,數據存儲不須要特定的表格模式。
mongodb存儲bson對象在叢集(collection)中.數據庫名字和叢集名字以句點連結起來叫作名字空間(namespace).
一個集合命名空間又有多個數據域(extent),集合命名空間裏存儲着集合的元數據,好比集合名稱,集合的
第一個數據域和最後一個數據域的位置等等。而一個數據域由若干條文檔(document)組成,每一個數據域都有一個
頭部,記錄着第一條文檔和最後一條文檔的爲知,以及該數據域的一些元數據。extent之間,document之間經過
雙向鏈表鏈接。
索引的存儲數據結構是B樹,索引命名空間存儲着對B樹的根節點的指針。
分片是將數據水平切分到不一樣的物理節點。當應用數據愈來愈大的時候,數據量也會愈來愈大。當數據量增加
時,單臺機器有可能沒法存儲數據或可接受的讀取寫入吞吐量。利用分片技術能夠添加更多的機器來應對數據量增長
以及讀寫操做的要求。
mongodb中包括了一個能夠顯示數據庫中每一個操做性能特色的數據庫分析器.經過這個分析器你能夠找到比預期慢
的查詢(或寫操做);利用這一信息,好比,能夠肯定是否須要添加索引.
默認MongoDB不支持主鍵和外鍵關係。 用Mongodb自己的API須要硬編碼才能實現外鍵關聯,不夠直觀且難度
較大
"Code"類型用於在文檔中存儲 JavaScript 代碼。
"Regular Expression"類型用於在文檔中存儲正則表達式
"ObjectID"數據類型用於存儲文檔id
一共有四部分組成:時間戳、客戶端ID、客戶進程ID、三個字節的增量計數器
索引用於高效的執行查詢,沒有索引的MongoDB將掃描整個集合中的全部文檔,這種掃描效率很低,須要處理大量
的數據.
索引是一種特殊的數據結構,將一小塊數據集合保存爲容易遍歷的形式.索引可以存儲某種特殊字段或字段集的
值,並按照索引指定的方式將字段值進行排序.
使用db.collection.createIndex()在集合中建立一個索引
db.collectionName.find({key:value})
db.collectionName.find().pretty()
db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
db.collectionName.update({key:value},{$set:{newkey:newValue}})
db.collectionName.remove({key:value})
並使用 1 和 -1 來指定排序方式,其中 1 表示升序,而 -1 表示降序。javascript
db.connectionName.find({key:value}).sort({columnName:1})
聚合操做可以處理數據記錄並返回計算結果。聚合操做能將多個文檔中的值組合起來,對成組數據執行各類操做,返回單一的結果。它至關於 SQL 中的 count(*) 組合 group by。對於 MongoDB 中的聚合操做,應該使用aggregate()
方法。java
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在MongoDB中副本集由一組MongoDB實例組成,包括一個主節點多個次節點,MongoDB客戶端的全部數據都
寫入主節點(Primary),副節點從主節點同步寫入數據,以保持全部複製集內存儲相同的數據,提升數據可用性。
NoSQL是非關係型數據庫,NoSQL = Not Only SQL。
關係型數據庫採用的結構化的數據,NoSQL採用的是鍵值對的方式存儲數據。
在處理非結構化/半結構化的大數據時;在水平方向上進行擴展時;隨時應對動態增長的數據項時能夠優先考慮
使用NoSQL數據庫。 在考慮數據庫的成熟度;支持;分析和商業智能;管理及專業性等問題時,應優先考慮關係型數據庫。
MongoDB支持存儲過程,它是javascript寫的,保存在db.system.js表中。
GridFS是一種將大型文件存儲在MongoDB中的文件規範。使用GridFS能夠將大文件分隔成多個小文檔存放,這樣咱們可以有效的保存大文檔,並且解決了BSON對象有限制的問題。mysql
MongoDB採用的預分配空間的方式來防止文件碎片。正則表達式
更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。sql
不會,只會在A:{B,C}上使用索引。mongodb
面向文件的 高性能 高可用性 易擴展性 豐富的查詢語言數據庫
是的,用戶移除屬性而後對象會從新保存(re-save()).json
對於對象成員而言,是的.然而用戶不可以添加空值(null)到數據庫叢集(collection)由於空值不是對象.然而用戶可以添加空對象{}.數組
不會,磁盤寫操做默認是延遲執行的.寫操做可能在兩三秒(默認在60秒內)後到達磁盤.例如,若是一秒內數據庫收到一千個對一個對象遞增的操做,僅刷新磁盤一次.服務器
mongodb沒有使用傳統的鎖或者複雜的帶回滾的事務,由於它設計的宗旨是輕量,快速以及可預計的高性能.能夠把它類比成mysql mylsam的自動提交模式.經過精簡對事務的支持,性能獲得了提高,特別是在一個可能會穿過多個服務器的系統裏.
從備份數據庫聲明主數據庫宕機到選出一個備份數據庫做爲新的主數據庫將花費10到30秒時間.這期間在主數據庫上的操做將會失敗–包括寫入和強一致性讀取(strong consistent read)操做.然而,你還能在第二數據庫上執行最終一致性查詢(eventually consistent query)(在slaveok模式下),即便在這段時間裏.
它是當前備份集羣(replica set)中負責處理全部寫入操做的主要節點/成員.在一個備份集羣中,當失效備援(failover)事件發生時,一個另外的成員會變成primary.
(數據量大用集羣分片,數據量小用非集羣)
爲開發便捷起見,咱們建議以非集羣分片(unsharded)方式開始一個 mongodb 環境,除非一臺服務器不足以存放你的初始數據集.從非集羣分片升級到集羣分片(sharding)是無縫的,因此在你的數據集還不是很大的時候不必考慮集羣分片(sharding).
每個分片(shard)是一個分區數據的邏輯集合.分片可能由單一服務器或者集羣組成,咱們推薦爲每個分片(shard)使用集羣.
mongodb 分片是基於區域(range)的.因此一個集合(collection)中的全部的對象都被存放到一個塊(chunk)中.只有當存在多餘一個塊的時候,纔會有多個分片獲取數據的選項.如今,每一個默認塊的大小是 64mb,因此你須要至少 64 mb 空間才能夠實施一個遷移.
更新操做會當即發生在舊的分片(shard)上,而後更改纔會在全部權轉移(ownership transfers)前複製到新的分片上.
若是一個分片(shard)中止了,除非查詢設置了「partial」選項,不然查詢會返回一個錯誤.若是一個分片(shard)響應很慢,mongodb則會等待它的響應.
沒問題,這些文件是在分片(shard)進行均衡操做(balancing)的時候產生的臨時文件.一旦這些操做已經完成,相關的臨時文件也應該被刪除掉.但目前清理工做是須要手動的,因此請當心地考慮再釋放這些文件的空間.
不須要,移動操做是一致(consistent)而且是肯定性的(deterministic);一次失敗後,移動操做會不斷重試;當完成後,數據只會出如今新的分片裏(shard).
MongoDB 4.0的新特性——事務(Transactions):MongoDB 是不支持事務的,所以開發者在須要用到事務的時候,不得不借用其餘工具,在業務代碼層面去彌補數據庫的不足。
事務和會話(Sessions)關聯,一個會話同一時刻只能開啓一個事務操做,當一個會話斷開,這個會話中的事務也會結束。