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