李紀(jì)偉 段中帥 王順曄
摘要:計(jì)算機(jī)信息化系統(tǒng)中的數(shù)據(jù)分為結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。隨著大數(shù)據(jù)的發(fā)展,數(shù)據(jù)內(nèi)容的多樣性帶動(dòng)了非結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)技術(shù)的發(fā)展。本文選擇非結(jié)構(gòu)化數(shù)據(jù)庫(kù)MongoDB,介紹了其存儲(chǔ)原理及其與結(jié)構(gòu)化數(shù)據(jù)庫(kù)的區(qū)別,講述MongoDB的主要技術(shù),含數(shù)據(jù)結(jié)構(gòu)、主要操作、數(shù)據(jù)檢索、安全,最后描述MongoDB的主要應(yīng)用,包括與Java、Python連接,作為后臺(tái)數(shù)據(jù)庫(kù)配置服務(wù)器,并實(shí)現(xiàn)了對(duì)圖片和視頻的存儲(chǔ)和爬蟲(chóng)的功能,后續(xù)將其應(yīng)用到大數(shù)據(jù)應(yīng)用和非結(jié)構(gòu)化多媒體數(shù)據(jù)庫(kù)中。
關(guān)鍵詞:非結(jié)構(gòu)化數(shù)據(jù)庫(kù);MongoDB;數(shù)據(jù)庫(kù)存儲(chǔ);網(wǎng)絡(luò)爬蟲(chóng)
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)27-0007-03
The Storage Technology in NoSQL of MongoDB
LI Ji-wei, DUAN Zhong-shuai, WANG Shun-ye
(Langfang Normal University, Computer Technology Department, Langfang 065000, China)
Abstract: The data in computer information system can be divided into SQL and NoSQL. With the development of big data, the diversity of data content has led to the development of NoSQL technology.This paper introduces the storage principle of unstructured database technology of MongoDB, and the difference from SQL, describes the main technology of MongoDB, including the data structure, main operation, data retrieval, security. And finally it describes the main application of MongoDB, including the connection with Java and Python, serving as background database, configuring server, and realizing the function of storing and crawling pictures and videos. Then it will apply to big data application and unstructured multimedia database.
Key words: NoSQL; MongoDB;database storage; web crawler
1 非結(jié)構(gòu)化數(shù)據(jù)庫(kù)
非結(jié)構(gòu)化數(shù)據(jù)庫(kù),是指字段長(zhǎng)度可變,并且每個(gè)字段的又可以由可重復(fù)或不可重復(fù)的子字段共同構(gòu)成數(shù)據(jù)庫(kù)。[1]
2 MongoDB數(shù)據(jù)庫(kù)存儲(chǔ)原理
2.1 MongoDB簡(jiǎn)介
MongoDB高性能、易部署、易使用、可擴(kuò)展、無(wú)模式的文檔行數(shù)據(jù)庫(kù),由C++語(yǔ)言編寫(xiě)的分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù),MongoDB可運(yùn)行于Windows平臺(tái),也可以運(yùn)行于UNIX平臺(tái),用戶根據(jù)應(yīng)用需求可以選擇32bit或64bit版,其中32bit版最大支持2GB文件,而64bit版則無(wú)限制。
主要功能有:面向文檔存儲(chǔ)(BSON);支持動(dòng)態(tài)查詢;為文檔創(chuàng)建索引;支持復(fù)合索引;使用地理空間索引;全新的聚合框架;二進(jìn)制數(shù)據(jù)存儲(chǔ)(海量數(shù)據(jù)、圖片、視頻等);碎片自動(dòng)處理;就地更新信息;實(shí)施分片(自動(dòng)分片);分析查詢、復(fù)制數(shù)據(jù);內(nèi)置GridFS,支持海量存儲(chǔ)。
2.2 MongoDB存儲(chǔ)原理
MongoDB數(shù)據(jù)存儲(chǔ)的單位是集合,分組存儲(chǔ),有唯一的標(biāo)識(shí),集合中可包含多個(gè)二進(jìn)制文件。對(duì)于關(guān)系型數(shù)據(jù)庫(kù),MongoDB是非關(guān)系型的,也將這類(lèi)數(shù)據(jù)庫(kù)稱之為非關(guān)系型數(shù)據(jù)庫(kù)。MongoDB面向文檔,在存儲(chǔ)時(shí),采用
2.3 與SQL數(shù)據(jù)庫(kù)的比較
SQL數(shù)據(jù)庫(kù)適合需求確定和對(duì)數(shù)據(jù)完整性要求嚴(yán)格的應(yīng)用。NoSQL數(shù)據(jù)庫(kù)適用于對(duì)速度和可擴(kuò)展性比較看重的那些不相關(guān)的,不確定和不斷發(fā)展的需求。
2.4 MongoDB應(yīng)用的場(chǎng)景
MongoDB的主要目標(biāo)是高性能和高度伸縮性以及豐富的功能。
(1) 網(wǎng)站中存儲(chǔ)的數(shù)據(jù):MongoDB非常適合實(shí)時(shí)的插入,更新與查詢,高伸縮性的表現(xiàn)。
(2) 用戶緩存的數(shù)據(jù):持久化緩存層可以避免下層的數(shù)據(jù)源過(guò)載。
(3) 數(shù)據(jù)量大,價(jià)值低的數(shù)據(jù)。
(4) 伸縮性大的場(chǎng)景。
3 非結(jié)構(gòu)化數(shù)據(jù)庫(kù)的主要技術(shù)
3.1 數(shù)據(jù)類(lèi)型
MongoDB支持一下數(shù)據(jù)類(lèi)型[2]:
String:文本值
Integer:數(shù)值
Boolean:真、假
Double:浮點(diǎn)數(shù)
Min/Max keys:與BSON中的最低和最高值比較
Arrays:數(shù)組
Timestamp:時(shí)間戳(記錄文檔的修改或添加的時(shí)間)
Object:嵌入文檔
Null:Null值
Symbol:與字符串用法一致(用于特定的符號(hào)類(lèi)型)
Date *:UNIX時(shí)間格式的當(dāng)前日期或時(shí)間
Object data *:文檔的ID
Binary data *:二進(jìn)制數(shù)據(jù)
Regular expression *:正則表達(dá)式
JavaScript Code *:javaScript代碼
其中后五個(gè)BSON類(lèi)型的。
3.2 數(shù)據(jù)檢索與信息安全
MongoDB在數(shù)據(jù)檢索與信息安全方面的應(yīng)用主要有以下幾方面:[3]
索引的類(lèi)型:
_id索引;單鍵索引;多鍵索引;復(fù)合索引;過(guò)期索引;全文索引;全文索引相似度查詢:可返回相似度;地理位置索引;2D索引。
安全的方法:
物理隔離;網(wǎng)絡(luò)隔離;防火墻隔離;用戶名、密碼。
安全度:
最安全:物理隔離;
次安全:網(wǎng)絡(luò)隔離;
次次安全:防火墻隔離;
次次次安全:用戶名、密碼;
復(fù)制集保證數(shù)據(jù)安全:多副本存儲(chǔ)(主從模式)。
4 非結(jié)構(gòu)化數(shù)據(jù)庫(kù)的應(yīng)用
4.1 與Java、Python的結(jié)合
通過(guò)Java連接MongoDB數(shù)據(jù)庫(kù)有兩種方法:
方法一:
建立javaProject項(xiàng)目,通過(guò)引入外包mongo-java-driver連接MongoDB非結(jié)構(gòu)化數(shù)據(jù)庫(kù)(通過(guò) Mongo mongo = new Mongo(host, port)連接)
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("test");
方法二:
建立maven項(xiàng)目,創(chuàng)建與java的依賴連接MongoDB
// 連接Mongodb服務(wù)
MongoClientclient=new MongoClient("localhost",27017);
//連接到數(shù)據(jù)庫(kù)
MongoDatabase db=mongoClient.getDatabase("test");
通過(guò)Python連接數(shù)據(jù)庫(kù)
前提工作:有Pymongo數(shù)據(jù)包
import pymongo
client=pymongo.MongoClient(host='localhost',port=27017)
4.2 基本的方法
MongoDB在應(yīng)用中常使用到的基本方法如下:
show dbs #顯示所有db
use fengDb #轉(zhuǎn)換到哪個(gè)db,沒(méi)有這個(gè)db就自動(dòng)新建一個(gè)這個(gè)db
db 顯示當(dāng)前操作的db
db.fengDb.insert({"name":"fengnovo"}) #在fengDb上增加一個(gè)記錄
db.dropDatabase()# 刪除當(dāng)前db(fengDb)
use fengDb #將操作對(duì)象轉(zhuǎn)到db
show collections #顯示上面的db即fengDb這個(gè)數(shù)據(jù)庫(kù)下所有的集合
db.printCollectionStats() #查看各collection的狀態(tài)
db.user1.drop() #刪除fengDb數(shù)據(jù)庫(kù)下面的user1集合
show users # 查看所有用戶
db.addUser('admin','pwd') #增加或修改用戶密碼
db.user1.save({'name':'fengnovo','age':26,'favor':['singing','playing']}) #存儲(chǔ)嵌套的對(duì)象
db.user1.save({'name':'fengnovo','age':27})#存儲(chǔ)數(shù)組對(duì)象
db.user1.update({'name':'fengnovo'},{'$set':{'age':27}},psert=true,multi=true) #根據(jù)條件修改,允許一次性修改多條記錄
db.user1.remove({'age':24})#刪除age=24的記錄
db.user1.remove()#刪除所有的記錄
db.user1.find() #查找所有
db.user1.find().pretty() #查找所有并格式化在控制臺(tái)
db.user1.findOne({'name':'fengnovo'})#查找一條記錄
db.user1.find({'name':'fengnovo'}).limit(10)#根據(jù)條件檢索10條記錄
db.user1.find({'name':'fengnovo'}).sort({'age': 1})#按age正序
db.user1.find({'name':'fengnovo'}).sort({'age': -1})#按age倒序
db.user1.find().sort({'age': -1}).limit(1) #sort排序
db.user1.count() #count操作 ,user1集合的數(shù)目
db.user1.distinct(‘a(chǎn)ge) #distinct操作,只取age的值
db.user1.find({"age": {‘$gte' : 27}}) #>=操作
db.user1.find({"age": {'$lte' : 27}}) #<=操作
db.user1.find({'address.city':'beijing'}) #子對(duì)象的查找
4.3 存儲(chǔ)圖片和視頻
使用Java和Gridfs向MongoDB中存儲(chǔ)圖片。
優(yōu)點(diǎn):MongoDB通過(guò)Fridfs可以存儲(chǔ)大文件,并且可以值訪問(wèn)部分文件。
代碼實(shí)例:
publicstaticvoid main(String[] args) {
try {
Mongo mongo = newMongo("localhost", 27017);
DB db = mongo.getDB("test");
DBCollection collection = db.getCollection("photo");
String newFileName = "testphoto";
File imageFile = new File("E:\\image\\1.png"); //圖片的路徑
// 創(chuàng)建photo
GridFS gfsPhoto = new GridFS(db, "photo");
// 從本地驅(qū)動(dòng)獲取圖片的文件
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
// 將圖片保存至MongoDB中
gfsFile.save();
添加視頻:
File imageFile = new File("E:\\image\\1.avi");
查看結(jié)果:show dbs。注意:添加圖片時(shí),由于圖片太小,內(nèi)存無(wú)法顯示變化,可以添加大一點(diǎn)的視頻文件開(kāi)觀察內(nèi)存的變化。
4.4 爬取數(shù)據(jù)并存儲(chǔ)
使用Python爬蟲(chóng)技術(shù)爬取中國(guó)大學(xué)排名并存儲(chǔ)在MongoDB中。[4]
實(shí)例:
import pymongo
import requests
from bs4 import BeautifulSoup
import bs4
# 連接mongodb
client =pymongo.MongoClient(host='localhost',port=27017)
# 數(shù)據(jù)庫(kù)
db = client['xiaozhu']
# collection 表
item_info = database['data']
def getHTML(u):
try:
r=requests.get(u,timeout=15)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return
def fillUl(ulist,html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
Ifisinstance(tr,bs4.element.Tag):
tds=tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUl(ulist,num):
for i in range(num):
u=ulist[i]
data={
"排名":u[0],
"學(xué)校名稱":u[1],
"總分":u[2] }
# 將數(shù)據(jù)存儲(chǔ)至mongodb
result= item_info.insert_one(data)
print(result)
def main():
uinfo=[]
url='http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html=getHTML(url)
fillUl(uinfo,html)
printUl(uinfo,100)
main()
查看結(jié)果:
import pymongo
client = pymongo.MongoClient(host='localhost',port=27017)
db=client.xiaozhu
collection=db.data
count=collection.find().count()#計(jì)數(shù)
print(count)
5 結(jié)論
探討非結(jié)構(gòu)化數(shù)據(jù)庫(kù)的特點(diǎn),介紹了MongoDB數(shù)據(jù)庫(kù)的她點(diǎn)以及檢索的優(yōu)勢(shì),并對(duì)MongoDB的連接進(jìn)行展示,實(shí)驗(yàn)證明,使用MongoDB的MongoClient連接更加方便和快捷,而且Python的連接易于Java的連接。在使用Gridfs存儲(chǔ)時(shí),大的文件容易顯示,建議存儲(chǔ)大文件時(shí)使用。在網(wǎng)絡(luò)信息發(fā)達(dá)的社會(huì),MongoDB會(huì)有越來(lái)越大的分量。
參考文獻(xiàn):
[1] (美)豪斯(Hows,D.)等. MongoDB大數(shù)據(jù)處理權(quán)威指南[M]. 2版.王肖峰,譯.北京:清華大學(xué)出版社,2015(2016.6重?。?
[2] (美)班克(Banker,k.). MOngoDB實(shí)戰(zhàn)[M]. 丁雪豐, 譯. 北京:人民郵電出版社,2012.10.
[3] Seanz.MongoDB入門(mén)篇[M/CD].http://www.imooc.com/learn/295.2017-05-24/2818-05-17.
[4]嵩天.Python網(wǎng)絡(luò)爬蟲(chóng)與信息提取[M/CD].http://www.icourse163.org/learn/BIT-1001870001?tid=100278106#/learn/cnnounce.2018-04-07/2018-06-13.
[通聯(lián)編輯:王力]