楊潔+趙啟飛
摘 要: 物聯(lián)網(wǎng)具有涉及領(lǐng)域廣、數(shù)據(jù)結(jié)構(gòu)復(fù)雜、信息覆蓋面大、使用用戶多等一系列特點。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在存儲用戶信息數(shù)據(jù)時,往往要預(yù)先定義數(shù)據(jù)表結(jié)構(gòu),這將難以實現(xiàn)動態(tài)增加多樣化用戶屬性信息的功能。此外,復(fù)雜的用戶信息查詢需求也難以得到滿足。提出一種基于非關(guān)系型數(shù)據(jù)庫MongoDB的物聯(lián)網(wǎng)開放平臺用戶數(shù)據(jù)存儲管理方式,可滿足用戶存儲的各種需求。同時,屬性查詢、特殊字段查詢、限制返回信息等需求都可得到有效支持。
關(guān)鍵詞: 物聯(lián)網(wǎng); 數(shù)據(jù)庫; 用戶信息; 開放平臺; 用戶存儲; 用戶信息查詢
中圖分類號: 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 引 言
當(dāng)今,物聯(lián)網(wǎng)的運用已牽扯到多個范疇,如醫(yī)療行業(yè)、智能家居、生態(tài)監(jiān)視、智能交通等[1?2]。盡管如此,但仍沒有形成大規(guī)模的、開放式的行業(yè)應(yīng)用。運用內(nèi)容從周密的業(yè)務(wù)流程發(fā)展到現(xiàn)在的通信、購物、娛樂、社交等各范疇。數(shù)據(jù)量也從前期的TB級升至PB級,并仍在連續(xù)爆炸式生長,互聯(lián)網(wǎng)運用進入大數(shù)據(jù)時期。另外,隨著全球定位系統(tǒng)(GPS)、傳感器、自動追蹤器和監(jiān)控系統(tǒng)的廣泛運用,新的數(shù)據(jù)源也生成了大量數(shù)據(jù),這些數(shù)據(jù)給存儲、分析和歸檔帶來了新的機遇和挑戰(zhàn)[3]。隨著互聯(lián)網(wǎng)用戶的不斷增加,用戶角色的不同管理,面對日新月異的互聯(lián)網(wǎng)應(yīng)用,需要良好的數(shù)據(jù)組織模型與數(shù)據(jù)庫解決方案來支持用戶信息的快速查詢。
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,能夠為Web運用供應(yīng)可擴展的高性能數(shù)據(jù)存儲處理方法,它供應(yīng)了一種強大、矯捷、可擴展的數(shù)據(jù)存儲方法,支撐疏松的數(shù)據(jù)結(jié)構(gòu),運用JSON語句[4]。其具有模式自由、可存儲二進制數(shù)據(jù)對象、支持查詢和網(wǎng)絡(luò)訪問等優(yōu)點。MongoDB將關(guān)系型數(shù)據(jù)庫中“行”的概念轉(zhuǎn)換為“文檔”,支撐文檔數(shù)據(jù)的內(nèi)嵌[5]。
由于無模式限制,MongoDB可以為不同的用戶提供多樣化的字段定義,而無須大量遷移數(shù)據(jù),從而使得數(shù)據(jù)模型具備靈活變更的能力。本文設(shè)計的用戶信息管理系統(tǒng)以MongoDB的對象模型工具Mongoose為接口,設(shè)計與實現(xiàn)一系列用戶文檔信息操作,用于支持用戶信息入庫、用戶信息修改、查詢等。
1 物聯(lián)網(wǎng)開放平臺總體架構(gòu)
在通用B/S架構(gòu)的互聯(lián)網(wǎng)理論上,添加機器客戶端,構(gòu)建人和機器為客戶端的實時B/S/M架構(gòu)[1],如圖1所示。
本文系統(tǒng)由IoT云平臺、用戶瀏覽器和IoT網(wǎng)關(guān)端三個部分組成[1]。
2 MongoDB介紹及特點
MongoDB是10gen公司研發(fā)的面向文檔的基于云計算的數(shù)據(jù)庫,用C++代碼編寫,介于關(guān)系型與非關(guān)系型數(shù)據(jù)庫中,它供應(yīng)了一種強大、矯捷、可擴展的數(shù)據(jù)存儲方法,支持松散的數(shù)據(jù)結(jié)構(gòu),運用JSON的語法[6]。MongoDB的功能十分強大,如內(nèi)置MapReduce映射聚合的計算方式,以及對復(fù)合索引的支撐,還支撐巨大的查詢語言,其語法格式與面向?qū)ο蟮牟樵冾愃疲С志W(wǎng)絡(luò)形式的訪問。MongoDB可在Linux,Windows或OS平臺上操作,并且支撐32位和64位的字長,默認端口為27017。同時該軟件還提供了對多種語言的支撐,如Java,Ruby,PhP,C++等。MongoDB的邏輯結(jié)構(gòu)實質(zhì)上是一種層次構(gòu)造,包含文檔、集合和數(shù)據(jù)庫三部分[7]。在MongoDB內(nèi)部,每個數(shù)據(jù)庫都有一個.ns文件和一些數(shù)據(jù)文件,采取預(yù)分配空間的機制,永遠維持附加的空間和空余的數(shù)據(jù)文件,進而有效防止了因為數(shù)據(jù)暴增產(chǎn)生的磁盤壓力過大的問題。每個預(yù)分配的文件都用0進行添補,數(shù)據(jù)文件每更新分配一次,此數(shù)據(jù)文件的大小將會是上一個文件的2倍,每個數(shù)據(jù)文件最大為2 GB。
3 用戶數(shù)據(jù)結(jié)構(gòu)模型及需求分析endprint
所謂用戶,就是在物聯(lián)網(wǎng)開放平臺上注冊的客戶,他們是網(wǎng)絡(luò)服務(wù)的應(yīng)用者。當(dāng)用戶在平臺上注冊個人信息之后,他們的信息會自動存儲到MongoDB數(shù)據(jù)庫中,存儲所有用戶信息的一個集合就叫用戶集合。
在數(shù)據(jù)庫中對用戶進行存儲建模時用到Mongoose這個類庫。Mongoose是MongoDB的一個對象模型工具,是基于node?mongodb?native開發(fā)的MongoDB NodeJS驅(qū)動,在異步的環(huán)境下可執(zhí)行。同時它也為關(guān)于MongoDB操作的一個對象模型庫,包含了MongoDB對文檔的一些增刪改查等一般方式,讓NodeJS操作MongoDB數(shù)據(jù)庫變得越發(fā)靈活簡略[8]。即Mongoose提供了一個模型層讓接口能通過Node操作MongoDB的集合。這個模型層提供了一個共同的定位操作文檔驗證,持久化迂回,還有應(yīng)該從業(yè)務(wù)層中抽象出來其他的邏輯操作。Mongoose還可以執(zhí)行一個中間件功能。中間件就等同于Java中的過濾器、攔截器,在執(zhí)行某一方式前,將其阻擋,好像AOP中的前置注入。舉個簡單的例子,當(dāng)執(zhí)行save方法時,往往需要對存入的數(shù)據(jù)進行驗證,雖然Mongoose提供了safe,strict,schematype,default,validaition驗證,但是這些驗證都沒有提供完善的錯誤處理或者攔截機制,而運用中間件,可以對錯誤的數(shù)據(jù)進行阻擋、錯誤處理、修訂等。由此看來,safe,strict,schematype,default,validaition本身就是內(nèi)部提供的中間件。中間件是一種控制函數(shù),近似插件,能控制流程中的init,validate,save,remove方式。
借助node.js+mongodb+mongoose的開發(fā)環(huán)境,在MongoDB數(shù)據(jù)庫中,采用JSON格式[4]表述用戶信息,文本表達方式如下:
{ "_id": //用戶文檔ID,Mongodb自動生成
"username": //用戶名
"password": //用戶登錄密碼
"email": //用戶E?mail地址
"regtime": //注冊時間
"time": //最后登錄時間
"status": //用戶狀態(tài)
"description": //用戶簡介
"Gateways": //["GID1","GID2",…]
}
在數(shù)據(jù)庫用戶集合中每個用戶一個文檔,其中的信息以鍵值對的方式存在[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
})
再根據(jù)建立的文本屬性Schema,設(shè)置相應(yīng)的數(shù)據(jù)庫模型Model如下:
var User=mongoose.model(′user′,UserSchema);
最后就是創(chuàng)建Model模型的實體Entity。
3.1 在MongoDB數(shù)據(jù)庫中存取數(shù)據(jù)
數(shù)據(jù)庫中對用戶的管理包含添加用戶、刪除用戶、修改用戶密碼和查詢用戶。具體實施方法如下:
3.1.1 用戶集合的查詢操作
首先,查詢使用最簡單的find函數(shù)。查詢條件可以包括以下幾個:用戶名(usename)、密碼(password)、郵箱(E?mail)等。
舉例函數(shù)為:
User.find({"usename":syh},function(err,docs)
{
console.log(docs);
})
用以上任意一個作為條件皆可進行查詢操作,并且已經(jīng)驗證成功,是可以查詢到的。
其次,若用findOne函數(shù),把以上屬性的任意一個作為查詢條件,也可進行查詢,但是返回的是查詢到的第一個符合條件的文檔。
舉例函數(shù)為:
User.findOne({"usename":"ycc"},function(err,docs)
{
console.log(docs);
})
已驗證成功。
再次,若用count函數(shù),把以上屬性的任意一個作為查詢條件,則可統(tǒng)計出來符合條件的文檔個數(shù)。
舉例函數(shù)為:
User.count({"usename":true},function(err,docs)
{
console.log(docs);
})
已驗證成功。
最后,用映射(projection)申明來限定全部查詢匹配文檔的返回字段。projection以文檔的形式列舉結(jié)果集中要包含或者排除的字段??梢灾付ㄒ淖侄危ɡ纾簕field:1})或者指定要排除的字段(例如:{field:0})。默認_id被包括在結(jié)果集中的,需從結(jié)果集合中除去_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 用戶集合的插入(增加)操作
要插入數(shù)據(jù)到MongoDB集合,需要使用Mongoose的save()函數(shù)。
語法為:
Entity.save();
3.1.3 用戶集合的更新(修改)操作
Mongoose的update()和save()方法用于更新文檔的集合。Update()方法不斷更新現(xiàn)有的文檔值,而替換現(xiàn)有的文檔需要通過文件中的save()方法。
語法:
Entity.update({name:′111′},function(err,docs)
{
console.log(docs);
})
3.1.4 用戶集合的刪除操作
Mongoose的remove()方法用于從集合中刪除文檔。remove()方法接受兩個參數(shù)。第一個是刪除criteria,第二是justOne標志:
1) deletion criteria:(可選)刪除標準,根據(jù)文件將被刪除。
2) justOne:(可選)如果設(shè)置為true或1,然后只刪除一個文件。
語法:
Entity.remove({name:′111′},function(err,docs)
{
console.log(docs);
})
3.2 用戶密碼加密設(shè)計與登錄驗證
用戶集合中加密算法使用的是哈希運算,哈希運算是一個單向的過程,它能把任意數(shù)目的數(shù)據(jù)變成固定長度的指紋,即在數(shù)學(xué)性質(zhì)上不可能從哈希值反推出哈希前的明文密碼。并且當(dāng)輸入發(fā)生變化時,盡管只變化一個字節(jié),那輸出的哈希值也會有極大的差異。這種特性恰好很合適保存密碼,因此一般來說希望有一種不可逆的算法來保存加密后的密碼,同時又需要在用戶登錄時來驗證密碼是否是正確的。假如設(shè)置的登錄密碼明文是“123456”,用普通的MD5哈希運算MD5(“123456”) 得到e10adc3949ba59abbe56e057f20f883e這個哈希值。最后網(wǎng)站把這個哈希值存入數(shù)據(jù)庫中。如果下次登錄時仍然輸入“123456”這個密碼明文,則網(wǎng)站得到密碼明文后先進行MD5哈希運算,把獲得的哈希值和數(shù)據(jù)庫中儲存的哈希值進行比對,若兩個哈希值相同時,說明輸入了正確的密碼明文。
加密的具體函數(shù)使用如下:
var secretKey=user.password;
var hasher=crypto.createHash("md5");
//構(gòu)建并返回一個hash對象,其是一個指定算法的加密hash,用于產(chǎn)生hash摘要
hasher.update(secretKey);
//更新hash的內(nèi)容為指定的數(shù)據(jù),即secretKey
var hashmsg=hasher.digest(′hex′);
//計算所有傳入數(shù)據(jù)的hash摘要,hex為編碼方式,hashmsg為加密之后的數(shù)據(jù)
console.log(hashmsg);
user.password=hashmsg;
加密后在數(shù)據(jù)庫中查詢用戶信息時,看到的用戶密碼已是密文形式,這樣確保了用戶數(shù)據(jù)的安全性。
針對用戶登錄物聯(lián)網(wǎng)平臺時數(shù)據(jù)庫中進行的驗證用戶名和密碼是否為正確事件,在此是利用中間件函數(shù)做的。筆者進行的驗證函數(shù)如下:
UserSchema.pre(′save′,function(next){
var user=this;
if(user.username==′Will′&&user.password==′7aec8f6a18f18156
da8b48bd9f0e567f′)
{
console.log(′登錄成功′);
}
else
{
console.log(′用戶名或密碼錯誤′);}
});
要是用戶輸入的用戶名和密碼都正確,就可看到登錄成功的提示,直接跳到物聯(lián)網(wǎng)平臺首頁;要是系統(tǒng)顯示用戶名或密碼錯誤,這種情況就需用戶重新輸入準確的信息進行驗證。
4 結(jié) 語
基于MongoDB的用戶信息管理可支持大量信息存儲,查詢方式以及自定義方式更新等需求,傳統(tǒng)關(guān)系型數(shù)據(jù)的模式化限制得到有效解決,從而支持多樣化地用戶數(shù)據(jù)讀取。其中使用到的一些索引方法對用戶直接快速地得到自己想要的信息提供了很大的方便,對后臺管理人員的工作也提升了效率,基于MongoDB的用戶信息存儲方式是可行的技術(shù)方案。
參考文獻
[1] 蘇祥林,陳文藝,閆灑灑.基于樹莓派的物聯(lián)網(wǎng)開放平臺[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] 劉丹丹.物聯(lián)網(wǎng)產(chǎn)業(yè)化遇挑戰(zhàn)智能家居或成突破口[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] 杜衛(wèi)華.淺析基于MongoDB的云數(shù)據(jù)管理技術(shù)的研究與應(yīng)用[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,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] 謝華成,陳向東.面向云存儲的非結(jié)構(gòu)化數(shù)據(jù)存取[J].計算機應(yīng)用,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的海量空間數(shù)據(jù)存儲和并行[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的地理信息共享數(shù)據(jù)存儲模型研究[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] 張小波,成良玉,邱科寧,等.基于協(xié)同數(shù)據(jù)庫的數(shù)據(jù)遷移模型研究與實現(xiàn)[J].計算機工程與設(shè)計,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博客系統(tǒng)的設(shè)計與實現(xiàn)[D].大連:大連理工大學(xué),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] 舒昝,張曉冉.面向異構(gòu)類型的大數(shù)據(jù)查詢優(yōu)化研究[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] 席曉晶.“智慧城市”時代“物聯(lián)網(wǎng)”技術(shù)在城市管理中的應(yīng)用[J].物聯(lián)網(wǎng)技術(shù),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