国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

非結(jié)構(gòu)化數(shù)據(jù)庫(kù)MongoDB的數(shù)據(jù)存儲(chǔ)

2018-12-18 01:08:58李紀(jì)偉段中帥王順曄
電腦知識(shí)與技術(shù) 2018年27期
關(guān)鍵詞:網(wǎng)絡(luò)爬蟲

李紀(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ǔ)和爬蟲的功能,后續(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ò)爬蟲

中圖分類號(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ǔ)言編寫的分布式文件存儲(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)系型的,也將這類數(shù)據(jù)庫(kù)稱之為非關(guān)系型數(shù)據(jù)庫(kù)。MongoDB面向文檔,在存儲(chǔ)時(shí),采用的模式,其中Key是一個(gè)文件數(shù)據(jù)的關(guān)鍵詞,BinaryValue則對(duì)應(yīng)于一個(gè)文件的二進(jìn)制流?;镜乃悸肪褪菍able中的行概念轉(zhuǎn)換成了更加靈活的文檔模型。[2]

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ù)類型

MongoDB支持一下數(shù)據(jù)類型[2]:

String:文本值

Integer:數(shù)值

Boolean:真、假

Double:浮點(diǎn)數(shù)

Min/Max keys:與BSON中的最低和最高值比較

Arrays:數(shù)組

Timestamp:時(shí)間戳(記錄文檔的修改或添加的時(shí)間)

Object:嵌入文檔

Null:Null值

Symbol:與字符串用法一致(用于特定的符號(hào)類型)

Date *:UNIX時(shí)間格式的當(dāng)前日期或時(shí)間

Object data *:文檔的ID

Binary data *:二進(jìn)制數(shù)據(jù)

Regular expression *:正則表達(dá)式

JavaScript Code *:javaScript代碼

其中后五個(gè)BSON類型的。

3.2 數(shù)據(jù)檢索與信息安全

MongoDB在數(shù)據(jù)檢索與信息安全方面的應(yīng)用主要有以下幾方面:[3]

索引的類型:

_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爬蟲技術(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/CD].http://www.imooc.com/learn/295.2017-05-24/2818-05-17.

[4]嵩天.Python網(wǎng)絡(luò)爬蟲與信息提取[M/CD].http://www.icourse163.org/learn/BIT-1001870001?tid=100278106#/learn/cnnounce.2018-04-07/2018-06-13.

[通聯(lián)編輯:王力]

猜你喜歡
網(wǎng)絡(luò)爬蟲
基于分布式的農(nóng)業(yè)信息檢索系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
微信平臺(tái)下的教務(wù)信息獲取和隱私保護(hù)方法研究
基于網(wǎng)絡(luò)爬蟲的電子易購(gòu)軟件設(shè)計(jì)與實(shí)現(xiàn)
搜索引擎技術(shù)的發(fā)展現(xiàn)狀與前景
煉鐵廠鐵量網(wǎng)頁(yè)數(shù)據(jù)獲取系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
基于社會(huì)網(wǎng)絡(luò)分析的權(quán)威網(wǎng)頁(yè)挖掘研究
主題搜索引擎中網(wǎng)絡(luò)爬蟲的實(shí)現(xiàn)研究
淺析如何應(yīng)對(duì)網(wǎng)絡(luò)爬蟲流量
基于淘寶某商品銷售量監(jiān)控系統(tǒng)
網(wǎng)絡(luò)爬蟲針對(duì)“反爬”網(wǎng)站的爬取策略研究
阿合奇县| 阳山县| 兰州市| 梅河口市| 丹东市| 南安市| 湖南省| 盐源县| 思南县| 洪湖市| 法库县| 桂平市| 崇明县| 连州市| 越西县| 太白县| 滕州市| 伽师县| 鄂托克前旗| 阿克苏市| 库尔勒市| 伊通| 万全县| 洪泽县| 龙胜| 寻甸| 得荣县| 孝感市| 盐池县| 九寨沟县| 永新县| 定襄县| 临澧县| 城口县| 辉南县| 海门市| 上犹县| 平安县| 西城区| 萍乡市| 东港市|