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