摘要:不過對于大多數(shù)應用,這種不安全已經(jīng)足夠安全了。當故障的節(jié)點恢復后,會向其他節(jié)點同步到最新的數(shù)據(jù),然后成為一個從節(jié)點。分片可以與副本集同時使用,此時,每個分片都是一個副本級,這樣可以提供非常高的可用率和擴展性。
最初聽說 MongoDB 的時候,我總是覺得它的穩(wěn)定性堪憂,后來用了差不多一年的時間,其實也沒有遇到過什么問題,反而是 MySQL 出現(xiàn)過幾次丟失數(shù)據(jù)的情況。配合 Node.js 使用 MongoDB 是一件非常舒暢的事情,從前端,到后端,再到數(shù)據(jù)庫,統(tǒng)統(tǒng)全是 JSON.
本文的定位是一篇對 MongoDB 的一個概覽性的介紹,告訴你 MongoDB 的特點和功能,以及如果需要了解某個功能,應當搜索什么關鍵詞,并不直接涉及技術細節(jié)。
特點
無模式
MongoDB 中的每一條文檔,都是一個 JSON 對象,因此你無需預定義一個集合的結構,集合中的每個文檔也可以有不同的結構。
異步寫入
MongoDB 默認所有的寫操作都是『不安全』的,即當請求被 MongoDB 收到時,不等寫入操作完成,就返回一個『成功』的響應。
這是默認的行為,當然你設置一些選項,讓操作等待等待寫入完成后再返回響應。不過對于大多數(shù)應用,這種『不安全』已經(jīng)足夠安全了。
簡單查詢
MongoDB 只支持簡單的查詢,MongoDB 只儲存數(shù)據(jù),更多的邏輯應該在應用中解決。因此 MongoDB 有著簡單的且在各編程語言下高度一致的 API 接口。
無需運維
MongoDB 幾乎沒有什么選項可以設置,集群也是設置一次之后就可以自動地解決故障,極少需要維護。
安裝和備份MongoDB 的安裝很簡單,直接在官網(wǎng)下載二進制版本,運行其中的 mongod 即可啟動數(shù)據(jù)庫,運行 mongo 即可啟動客戶端 Shell, 或者你也可以從軟件源中安裝。
MongoDB 被設計運行于 64bit 的操作系統(tǒng),在 32bit 的情況下,數(shù)據(jù)文件最大限制為 2GiB.
MongoDB 在運行時并不會實時地將修改寫入磁盤,因此在關閉服務器時需要給 MongoDB 時間將所有數(shù)據(jù)寫入磁盤。當出現(xiàn)服務器突然掉電的情況時,MongoDB 的數(shù)據(jù)庫文件會損壞,需要進行修復才能重新運行,這個過程中會丟失掉電時正在進行的寫入操作。在對運行中的 MongoDB 進行備份時,需要使用自帶的 mongodump 工具,不能直接復制其數(shù)據(jù)庫文件。
設計文檔結構
ObjectID
MongoDB 會為每一個文檔默認添加一個名為 _id, 類型為 Object 的字段,這個字段用來唯一地標識每一個文檔。這個 ID 通過時間,服務器,進程號被生成,甚至可以認為是全世界唯一的。
除了 MongoDB 默認為 _id 添加 ObjectID, 你也可以自己在文檔中創(chuàng)建 ObjectID, 來起到唯一地標識某個對象的功能。
例如我們有一個 topic 集合,topic 都是 account 創(chuàng)建的,所以 topics 中要引用來自 accounts 中的 account.
// accounts { _id:嵌入關系, name: "jysperm" } // topics { _id: , account_id: }
每個 topic 會有一些 reply, 所以在 topic 中可以嵌入 reply.
// topics { _id:引用 Vs 嵌入, account_id: replies: [ { _id: , content: "xxoo" } ] }
在上面第一個例子中,topic 其實也可以嵌入 account 中;而第二個例子中,reply 也可以使用一個新的集合,然后來引用 topic, 那么應該如何選擇這兩種關系呢。
我們主要從幾個出發(fā)點來考慮:
查詢
我們可以考慮查詢 account 時,是否需要他所有的 topic, 或者查詢 topic 時,是否需要它所有的 reply.
從查詢的角度來考慮,如果需要一同獲得這兩種數(shù)據(jù),那么就應該嵌入,如果不需要,就應該引用。
數(shù)據(jù)的增長性
我們還可以考慮 account 的 topic 數(shù)量在今后會有怎樣的增長,topic 的 reply 數(shù)量會有怎樣的增長。
如果增長是沒有限度的,那么就應該引用,如果增長是有限的,那么就可以嵌入。
對應關系
如果是一對一關系,或者一對多關系,那么可以考慮嵌入,如果是多對多關系,那么應該引用。
原子性
MongoDB 僅在文檔層面提供原子性,如果有兩個非常敏感的數(shù)據(jù)需要同時被更新,那么他們有必要存在于同一個文檔中。
查詢和更新所謂『增刪查改』在 MongoDB 里對應:
find/findOne: 查詢
update/save: 修改
insert/save: 新增
remove: 刪除
在 MongoDB 中,操作符以 $ 開頭,主要分為三類:查詢操作符,更新操作符,聚合查詢操作符。
查詢操作符
用于 find 和 update 中的查詢器,如 $gt(大于), $ne(不等于), $in(匹配幾個值之一), 邏輯運算:$and, $not.
更新操作符
用于 update 中的更新器,如 $inc(對數(shù)字進行增量), $set(修改文檔的一部分), $unset(刪除一個字段).
MongoDB 對嵌入式的文檔和數(shù)組有非常好的支持:$addToSet(向集合中添加元素), $push(向數(shù)組添加元素), $pull(從數(shù)組移除元素).
聚合查詢(Aggregation)
類似于 SQL 數(shù)據(jù)庫中的 GROUP, 提供統(tǒng)計和計算的功能,要多強大有多強大,畢竟可以直接在數(shù)據(jù)庫中運行 JavaScript 代碼,不過因為性能的關系,不適合在應用中頻繁調(diào)用。
查詢命令還有幾個選項:
limit: 限制返回的結果數(shù)
skip: 跳過一些結果
sort: 對結果進行排序
fields: 只返回指定的字段
副本集(Replica Set)和分片(Sharding)MongoDB 的副本集采用一主多從的的集群方式。副本集中只有主節(jié)點可以寫入,其他節(jié)點從主節(jié)點同步。當主節(jié)點故障時,從節(jié)點中會自動推選出一個新的主節(jié)點。當故障的節(jié)點恢復后,會向其他節(jié)點同步到最新的數(shù)據(jù),然后成為一個從節(jié)點。
MongoDB 的分片是指,按照某個字段的值,將數(shù)據(jù)分為多份,儲存在不同的服務器上??蛻舳藭\行一個 mongos 代替 mongod, mongos 相當于一個路由,會根據(jù)請求和分片的設置,將請求拆分后發(fā)給不同的服務器,得到結果后再將結果組合起來發(fā)給客戶端。
分片可以與副本集同時使用,此時,每個分片都是一個副本級,這樣可以提供非常高的可用率和擴展性。
http://jysperm.me/technology/1575
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/18711.html
摘要:可以用來在圖形界面中觀察我們對的修改是否生效。如果文件夾沒有上述權限,則需要按照下面命令執(zhí)行或者問題已經(jīng)在運行,并監(jiān)聽端口。打開另外一個,輸入,出現(xiàn)交互式命令,并連接到默認服務器。 學習爬蟲的時候需要把爬取的數(shù)據(jù)放入mongoDB數(shù)據(jù)庫進行管理,Robo 3T是一個mongoDB數(shù)據(jù)庫可視化工具,它是一個跨平臺的MongoDB管理工具??梢杂脕碓趫D形界面中觀察我們對MongoDB的修改...
摘要:旨在為應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。,是一個介于關系數(shù)據(jù)庫和非關系數(shù)據(jù)庫之間的產(chǎn)品,是非關系數(shù)據(jù)庫當中功能最豐富,最像關系數(shù)據(jù)庫的。目前的最新版本為,最新版本的在我看來更像的數(shù)據(jù)庫,功能更是越發(fā)強大。一些主流的介紹。 簡述 工作中經(jīng)常接觸MongoDB,學習上也有對它進行一些研究,感覺MongoDB這種Nosql類型的數(shù)據(jù)庫給我在開發(fā)上帶來很多便捷,同時也解決了很多程序開發(fā)過...
閱讀 1889·2019-08-30 15:55
閱讀 1080·2019-08-26 11:57
閱讀 596·2019-08-26 11:29
閱讀 3424·2019-08-26 10:49
閱讀 2002·2019-08-23 18:40
閱讀 1882·2019-08-23 16:04
閱讀 3173·2019-08-23 11:01
閱讀 2356·2019-08-23 10:56