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