楊潔+趙啟飛
摘 要: 物聯網具有涉及領域廣、數據結構復雜、信息覆蓋面大、使用用戶多等一系列特點。傳統的關系型數據庫在存儲用戶信息數據時,往往要預先定義數據表結構,這將難以實現動態增加多樣化用戶屬性信息的功能。此外,復雜的用戶信息查詢需求也難以得到滿足。提出一種基于非關系型數據庫MongoDB的物聯網開放平臺用戶數據存儲管理方式,可滿足用戶存儲的各種需求。同時,屬性查詢、特殊字段查詢、限制返回信息等需求都可得到有效支持。
關鍵詞: 物聯網; 數據庫; 用戶信息; 開放平臺; 用戶存儲; 用戶信息查詢
中圖分類號: TN915?34 文獻標識碼: A 文章編號: 1004?373X(2018)02?0075?04
Abstract: Internet of things (IoT) has the characteristics of extensive involving domains, complex data structure, large information coverage, and a big amount of users. In the traditional relational database, the structure of data table often needs to be predefined to store user information data, which makes it difficult to realize the function of dynamically increasing various user attribute information. The complex user information query requirement is also difficult to be met. Therefore, a user data storage management method based on non?relational database MongoDB is proposed for IoT open platform, which can meet various needs of user storage. Meanwhile, attribute query, special field query, information return limit and other needs can be effectively supported.
Keywords: IoT; database; user information; open platform; user storage; user information query
0 引 言
當今,物聯網的運用已牽扯到多個范疇,如醫療行業、智能家居、生態監視、智能交通等[1?2]。盡管如此,但仍沒有形成大規模的、開放式的行業應用。運用內容從周密的業務流程發展到現在的通信、購物、娛樂、社交等各范疇。數據量也從前期的TB級升至PB級,并仍在連續爆炸式生長,互聯網運用進入大數據時期。另外,隨著全球定位系統(GPS)、傳感器、自動追蹤器和監控系統的廣泛運用,新的數據源也生成了大量數據,這些數據給存儲、分析和歸檔帶來了新的機遇和挑戰[3]。隨著互聯網用戶的不斷增加,用戶角色的不同管理,面對日新月異的互聯網應用,需要良好的數據組織模型與數據庫解決方案來支持用戶信息的快速查詢。
MongoDB是一個基于分布式文件存儲的數據庫,能夠為Web運用供應可擴展的高性能數據存儲處理方法,它供應了一種強大、矯捷、可擴展的數據存儲方法,支撐疏松的數據結構,運用JSON語句[4]。其具有模式自由、可存儲二進制數據對象、支持查詢和網絡訪問等優點。MongoDB將關系型數據庫中“行”的概念轉換為“文檔”,支撐文檔數據的內嵌[5]。
由于無模式限制,MongoDB可以為不同的用戶提供多樣化的字段定義,而無須大量遷移數據,從而使得數據模型具備靈活變更的能力。本文設計的用戶信息管理系統以MongoDB的對象模型工具Mongoose為接口,設計與實現一系列用戶文檔信息操作,用于支持用戶信息入庫、用戶信息修改、查詢等。
1 物聯網開放平臺總體架構
在通用B/S架構的互聯網理論上,添加機器客戶端,構建人和機器為客戶端的實時B/S/M架構[1],如圖1所示。
本文系統由IoT云平臺、用戶瀏覽器和IoT網關端三個部分組成[1]。
2 MongoDB介紹及特點
MongoDB是10gen公司研發的面向文檔的基于云計算的數據庫,用C++代碼編寫,介于關系型與非關系型數據庫中,它供應了一種強大、矯捷、可擴展的數據存儲方法,支持松散的數據結構,運用JSON的語法[6]。MongoDB的功能十分強大,如內置MapReduce映射聚合的計算方式,以及對復合索引的支撐,還支撐巨大的查詢語言,其語法格式與面向對象的查詢類似,支持網絡形式的訪問。MongoDB可在Linux,Windows或OS平臺上操作,并且支撐32位和64位的字長,默認端口為27017。同時該軟件還提供了對多種語言的支撐,如Java,Ruby,PhP,C++等。MongoDB的邏輯結構實質上是一種層次構造,包含文檔、集合和數據庫三部分[7]。在MongoDB內部,每個數據庫都有一個.ns文件和一些數據文件,采取預分配空間的機制,永遠維持附加的空間和空余的數據文件,進而有效防止了因為數據暴增產生的磁盤壓力過大的問題。每個預分配的文件都用0進行添補,數據文件每更新分配一次,此數據文件的大小將會是上一個文件的2倍,每個數據文件最大為2 GB。
3 用戶數據結構模型及需求分析endprint
所謂用戶,就是在物聯網開放平臺上注冊的客戶,他們是網絡服務的應用者。當用戶在平臺上注冊個人信息之后,他們的信息會自動存儲到MongoDB數據庫中,存儲所有用戶信息的一個集合就叫用戶集合。
在數據庫中對用戶進行存儲建模時用到Mongoose這個類庫。Mongoose是MongoDB的一個對象模型工具,是基于node?mongodb?native開發的MongoDB NodeJS驅動,在異步的環境下可執行。同時它也為關于MongoDB操作的一個對象模型庫,包含了MongoDB對文檔的一些增刪改查等一般方式,讓NodeJS操作MongoDB數據庫變得越發靈活簡略[8]。即Mongoose提供了一個模型層讓接口能通過Node操作MongoDB的集合。這個模型層提供了一個共同的定位操作文檔驗證,持久化迂回,還有應該從業務層中抽象出來其他的邏輯操作。Mongoose還可以執行一個中間件功能。中間件就等同于Java中的過濾器、攔截器,在執行某一方式前,將其阻擋,好像AOP中的前置注入。舉個簡單的例子,當執行save方法時,往往需要對存入的數據進行驗證,雖然Mongoose提供了safe,strict,schematype,default,validaition驗證,但是這些驗證都沒有提供完善的錯誤處理或者攔截機制,而運用中間件,可以對錯誤的數據進行阻擋、錯誤處理、修訂等。由此看來,safe,strict,schematype,default,validaition本身就是內部提供的中間件。中間件是一種控制函數,近似插件,能控制流程中的init,validate,save,remove方式。
借助node.js+mongodb+mongoose的開發環境,在MongoDB數據庫中,采用JSON格式[4]表述用戶信息,文本表達方式如下:
{ "_id": //用戶文檔ID,Mongodb自動生成
"username": //用戶名
"password": //用戶登錄密碼
"email": //用戶E?mail地址
"regtime": //注冊時間
"time": //最后登錄時間
"status": //用戶狀態
"description": //用戶簡介
"Gateways": //["GID1","GID2",…]
}
在數據庫用戶集合中每個用戶一個文檔,其中的信息以鍵值對的方式存在[9]。
在Mongoose中先定義Schema如下:
var UserSchema=new Schema({
username:{
unique:true,
type:String
}
password:String,
email:String,
regtime:{type:Date,default:Date.now},
time:{type:Date,default:Date.now},
status:String,
description:String
})
再根據建立的文本屬性Schema,設置相應的數據庫模型Model如下:
var User=mongoose.model(′user′,UserSchema);
最后就是創建Model模型的實體Entity。
3.1 在MongoDB數據庫中存取數據
數據庫中對用戶的管理包含添加用戶、刪除用戶、修改用戶密碼和查詢用戶。具體實施方法如下:
3.1.1 用戶集合的查詢操作
首先,查詢使用最簡單的find函數。查詢條件可以包括以下幾個:用戶名(usename)、密碼(password)、郵箱(E?mail)等。
舉例函數為:
User.find({"usename":syh},function(err,docs)
{
console.log(docs);
})
用以上任意一個作為條件皆可進行查詢操作,并且已經驗證成功,是可以查詢到的。
其次,若用findOne函數,把以上屬性的任意一個作為查詢條件,也可進行查詢,但是返回的是查詢到的第一個符合條件的文檔。
舉例函數為:
User.findOne({"usename":"ycc"},function(err,docs)
{
console.log(docs);
})
已驗證成功。
再次,若用count函數,把以上屬性的任意一個作為查詢條件,則可統計出來符合條件的文檔個數。
舉例函數為:
User.count({"usename":true},function(err,docs)
{
console.log(docs);
})
已驗證成功。
最后,用映射(projection)申明來限定全部查詢匹配文檔的返回字段。projection以文檔的形式列舉結果集中要包含或者排除的字段??梢灾付ㄒ淖侄危ɡ纾簕field:1})或者指定要排除的字段(例如:{field:0})。默認_id被包括在結果集中的,需從結果集合中除去_id字段,且在projection中指定除去的_id字段({_id:0})。例如用戶集合中不返回_id和gateway。endprint
User.find({"usename":"syh"}{"_id":0,"gateway":0},function(err,docs)
{
console.log(docs);
})
3.1.2 用戶集合的插入(增加)操作
要插入數據到MongoDB集合,需要使用Mongoose的save()函數。
語法為:
Entity.save();
3.1.3 用戶集合的更新(修改)操作
Mongoose的update()和save()方法用于更新文檔的集合。Update()方法不斷更新現有的文檔值,而替換現有的文檔需要通過文件中的save()方法。
語法:
Entity.update({name:′111′},function(err,docs)
{
console.log(docs);
})
3.1.4 用戶集合的刪除操作
Mongoose的remove()方法用于從集合中刪除文檔。remove()方法接受兩個參數。第一個是刪除criteria,第二是justOne標志:
1) deletion criteria:(可選)刪除標準,根據文件將被刪除。
2) justOne:(可選)如果設置為true或1,然后只刪除一個文件。
語法:
Entity.remove({name:′111′},function(err,docs)
{
console.log(docs);
})
3.2 用戶密碼加密設計與登錄驗證
用戶集合中加密算法使用的是哈希運算,哈希運算是一個單向的過程,它能把任意數目的數據變成固定長度的指紋,即在數學性質上不可能從哈希值反推出哈希前的明文密碼。并且當輸入發生變化時,盡管只變化一個字節,那輸出的哈希值也會有極大的差異。這種特性恰好很合適保存密碼,因此一般來說希望有一種不可逆的算法來保存加密后的密碼,同時又需要在用戶登錄時來驗證密碼是否是正確的。假如設置的登錄密碼明文是“123456”,用普通的MD5哈希運算MD5(“123456”) 得到e10adc3949ba59abbe56e057f20f883e這個哈希值。最后網站把這個哈希值存入數據庫中。如果下次登錄時仍然輸入“123456”這個密碼明文,則網站得到密碼明文后先進行MD5哈希運算,把獲得的哈希值和數據庫中儲存的哈希值進行比對,若兩個哈希值相同時,說明輸入了正確的密碼明文。
加密的具體函數使用如下:
var secretKey=user.password;
var hasher=crypto.createHash("md5");
//構建并返回一個hash對象,其是一個指定算法的加密hash,用于產生hash摘要
hasher.update(secretKey);
//更新hash的內容為指定的數據,即secretKey
var hashmsg=hasher.digest(′hex′);
//計算所有傳入數據的hash摘要,hex為編碼方式,hashmsg為加密之后的數據
console.log(hashmsg);
user.password=hashmsg;
加密后在數據庫中查詢用戶信息時,看到的用戶密碼已是密文形式,這樣確保了用戶數據的安全性。
針對用戶登錄物聯網平臺時數據庫中進行的驗證用戶名和密碼是否為正確事件,在此是利用中間件函數做的。筆者進行的驗證函數如下:
UserSchema.pre(′save′,function(next){
var user=this;
if(user.username==′Will′&&user.password==′7aec8f6a18f18156
da8b48bd9f0e567f′)
{
console.log(′登錄成功′);
}
else
{
console.log(′用戶名或密碼錯誤′);}
});
要是用戶輸入的用戶名和密碼都正確,就可看到登錄成功的提示,直接跳到物聯網平臺首頁;要是系統顯示用戶名或密碼錯誤,這種情況就需用戶重新輸入準確的信息進行驗證。
4 結 語
基于MongoDB的用戶信息管理可支持大量信息存儲,查詢方式以及自定義方式更新等需求,傳統關系型數據的模式化限制得到有效解決,從而支持多樣化地用戶數據讀取。其中使用到的一些索引方法對用戶直接快速地得到自己想要的信息提供了很大的方便,對后臺管理人員的工作也提升了效率,基于MongoDB的用戶信息存儲方式是可行的技術方案。
參考文獻
[1] 蘇祥林,陳文藝,閆灑灑.基于樹莓派的物聯網開放平臺[J].電子科技,2015,28(9):35?37.
SU Xianglin, CHEN Wenyi, YAN Sasa. Open platform for Internet of Things based on raspberry pi [J]. Electronic science and technology, 2015, 28(9): 35?37.
[2] 劉丹丹.物聯網產業化遇挑戰智能家居或成突破口[J].通信世界,2014(34):33.endprint
LIU Dandan. Smart home may become a breakthrough when IoT industrialization meets challenge [J]. Communications World, 2014(34): 33.
[3] 杜衛華.淺析基于MongoDB的云數據管理技術的研究與應用[J].網絡安全技術與應用,2014(8):89.
DU Weihua. Analysis on research and application of cloud data management technology based on MongoDB [J]. Network security technology and application, 2014(8): 89.
[4] 謝華成,陳向東.面向云存儲的非結構化數據存取[J].計算機應用,2012,32(7):1924?1928.
XIE Huacheng, CHEN Xiangdong. Cloud storage?oriented unstructured data storage [J]. Journal of computer applications, 2012, 32(7): 1924?1928.
[5] 張恩,張廣弟,蘭磊.基于MongoDB的海量空間數據存儲和并行[J].地理空間信息,2014(1):46?48.
ZHANG En, ZHANG Guangdi, LAN Lei. Storage and parallelism of massive spatial data based on MongoDB [J]. Geospatial Information, 2014(1): 46?48.
[6] 張堯,甘泉,劉建川.基于MongoDB的地理信息共享數據存儲模型研究[J].測繪,2014,37(4):147?150.
ZHANG Rao, GAN Quan, LIU Jianchuan. Research on storage model of geographic information shared data based on MongoDB [J]. Surveying and mapping of Sichuan, 2014, 37(4): 147?150.
[7] 張小波,成良玉,邱科寧,等.基于協同數據庫的數據遷移模型研究與實現[J].計算機工程與設計,2005,26(5):1220?1222.
ZHANG Xiaobo, CHENG Liangyu, QIU Kening, et al. Research and implementation of data migration model based on collaborative database [J]. Computer engineering and design, 2005, 26(5): 1220?1222.
[8] 彭娜.基于Node.JS博客系統的設計與實現[D].大連:大連理工大學,2013:18?19.
PENG Na. Design and implementation of blog system based on Node.JS [D]. Dalian: Dalian University of Technology, 2013: 18?19.
[9] 舒昝,張曉冉.面向異構類型的大數據查詢優化研究[J].自動化與儀器儀表,2016(4):199?200.
SHU Zan, ZHANG Xiaoran. Research on query optimization for heterogeneous types of big data [J]. Automation and instrumentation, 2016(4): 199?200.
[10] 席曉晶.“智慧城市”時代“物聯網”技術在城市管理中的應用[J].物聯網技術,2016,6(5):55?56.
XI Xiaojing. Application of IoT technology to city management in smart city era [J]. Internet of Things technologies, 2016, 6(5): 55?56.endprint