摘要:MongoDB是NoSQL中面向文檔的數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)系統(tǒng)。適用于后臺(tái)具有大量讀寫(xiě)操作的網(wǎng)站、使用嵌套結(jié)構(gòu)等非規(guī)范化數(shù)據(jù)的應(yīng)用程序。MongoDB支持GIS功能,數(shù)據(jù)結(jié)構(gòu)靈活,非常適用于支撐物流業(yè)務(wù)。
關(guān)鍵詞:NoSQL;MongoDB;物流
MongoDB是以高性能和可擴(kuò)展性為特征的開(kāi)源軟件,它將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(keyValue)對(duì)組成。MongoDB的文檔相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)中的一行記錄,多個(gè)文檔組成一個(gè)集合相當(dāng)于關(guān)系數(shù)據(jù)庫(kù)的表,多個(gè)集合邏輯上組合在一起就是數(shù)據(jù)庫(kù)。
一、 MongoDB的優(yōu)勢(shì)與不足
MongoDB最大的特征是無(wú)表結(jié)構(gòu),進(jìn)行表結(jié)構(gòu)變更時(shí),只需要在程序進(jìn)行相應(yīng)的修改就可以了,不必關(guān)心表結(jié)構(gòu)和程序之間的一致性。它采用的面向文檔的數(shù)據(jù)模型使其可以自動(dòng)在多臺(tái)服務(wù)器之間分散數(shù)據(jù),還可以平衡集群的數(shù)據(jù)和負(fù)載,自動(dòng)重排文檔,這樣開(kāi)發(fā)者就不用考慮如何擴(kuò)展;當(dāng)需要更大的容量時(shí),只需在集群中添加新機(jī)器,然后讓數(shù)據(jù)庫(kù)來(lái)處理。
MongoDB不支持JOIN查詢與事務(wù)處理。使用MongoDB創(chuàng)建和更新數(shù)據(jù)的時(shí)候,數(shù)據(jù)不會(huì)實(shí)時(shí)寫(xiě)入到硬盤(pán)中,由于不能實(shí)時(shí)向硬盤(pán)中寫(xiě)入數(shù)據(jù),所以就有可能出現(xiàn)數(shù)據(jù)丟失的情況。
二、 MongoDB的原理
(一) 索引原理
簡(jiǎn)單地說(shuō),索引就是將文檔按照某個(gè)(或某些)字段順序組織起來(lái),以便能根據(jù)字段高效的查詢。MongoDB默認(rèn)會(huì)為插入的文檔生成_id字段作為文檔唯一的標(biāo)識(shí),為了保證能根據(jù)文檔id快速查詢文檔,MongoDB默認(rèn)會(huì)為集合創(chuàng)建_id 字段的索引。MongoDB支持多種類(lèi)型的索引,包括單字段索引、復(fù)合索引、多key索引、文本索引等。
(二) 復(fù)制集
MongoDB復(fù)制集具有故障自動(dòng)切換和自動(dòng)修復(fù)成員節(jié)點(diǎn)的功能,各個(gè)DB之間數(shù)據(jù)完全一致,大大降低了維護(hù)成本。復(fù)制集的結(jié)構(gòu)非常類(lèi)似一個(gè)集群,其中一個(gè)節(jié)點(diǎn)出現(xiàn)故障,其他節(jié)點(diǎn)馬上會(huì)將業(yè)務(wù)接過(guò)來(lái)而無(wú)需停機(jī)操作。
(三) MongoDB GIS
MongoDB遵循是GEOJSON規(guī)范,{type:”
三、 MongoDB在快遞物流系統(tǒng)的應(yīng)用
快遞物流系統(tǒng)最常見(jiàn)的業(yè)務(wù)類(lèi)型就是訂單的查詢和記錄,訂單的特點(diǎn)是隨著遞送過(guò)程,訂單數(shù)據(jù)需要隨時(shí)更新路徑。物流系統(tǒng)用到的特性有:MongoDB的數(shù)組結(jié)構(gòu),索引,GIS功能。以下通過(guò)講解一個(gè)Demo以供參考。
(一) 數(shù)據(jù)操作
物流快遞的訂單修改主要是查詢和信息追加兩種,主要介紹這兩種:
>db.order.find({_id:”1000”});∥根據(jù)訂單號(hào)查詢
∥更新物流狀態(tài)
>db.order.update({_id:”1000”},
{$push:{details:
{“action”:”delivering”,”operator”:”快遞員王五”,”date”:ISODate(”2017-11-01-21T20:00:00+08:00”)}
}}
(二) 索引創(chuàng)建
索引可以使任何類(lèi)型的字段,_id索引默認(rèn)存在,不需要再創(chuàng)建;當(dāng)數(shù)據(jù)量較大時(shí),可以使用sharding結(jié)構(gòu),shardkey的選擇上可以使用Hash(_id)。
∥TTL索引,字段creat_date,180后自動(dòng)清理數(shù)據(jù)
>db.order.createIndex({”create_date”:1},”expireAfterSeconds”:15552000)
位置和狀態(tài)索引,為了能快速處理“某地未處理訂單”查詢,這是一個(gè)多條件的查詢,所以是一個(gè)復(fù)合索引,status字段放在前面,因?yàn)槎鄶?shù)的查詢都會(huì)依賴狀態(tài)字段。
∥位置和狀態(tài)的復(fù)合索引,多條件的查詢
>db.order.createIndex({”status”:1,”delivery.city”:1,”delivery.address”:1})
總的來(lái)說(shuō),MongoDB有很高的可擴(kuò)展性,有一個(gè)很好的 replication 模式,有很完善的Java API,存儲(chǔ)格式是Json的,這對(duì)Java來(lái)說(shuō)非常好處理,運(yùn)維起來(lái)非常方便,不用專門(mén)為它安排一個(gè)管理員。但是應(yīng)用經(jīng)驗(yàn)缺乏,我們都沒(méi)有相關(guān)NoSQL 產(chǎn)品的使用經(jīng)驗(yàn),項(xiàng)目相對(duì)來(lái)說(shuō)還比較新,和以往的存儲(chǔ)相比,數(shù)據(jù)的關(guān)系性操作不再存在。
作者簡(jiǎn)介:
張潔鑫,四川省成都市,武警警官學(xué)院。