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