李纪伟 段中帅 王顺晔
摘要:计算机信息化系统中的数据分为结构化数据和非结构化数据。随着大数据的发展,数据内容的多样性带动了非结构化数据存储技术的发展。本文选择非结构化数据库MongoDB,介绍了其存储原理及其与结构化数据库的区别,讲述MongoDB的主要技术,含数据结构、主要操作、数据检索、安全,最后描述MongoDB的主要应用,包括与Java、Python连接,作为后台数据库配置服务器,并实现了对图片和视频的存储和爬虫的功能,后续将其应用到大数据应用和非结构化多媒体数据库中。
关键词:非结构化数据库;MongoDB;数据库存储;网络爬虫
中图分类号:TP311 文献标识码:A 文章编号: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 非结构化数据库
非结构化数据库,是指字段长度可变,并且每个字段的又可以由可重复或不可重复的子字段共同构成数据库。[1]
2 MongoDB数据库存储原理
2.1 MongoDB简介
MongoDB高性能、易部署、易使用、可扩展、无模式的文档行数据库,由C++语言编写的分布式文件存储的数据库,MongoDB可运行于Windows平台,也可以运行于UNIX平台,用户根据应用需求可以选择32bit或64bit版,其中32bit版最大支持2GB文件,而64bit版则无限制。
主要功能有:面向文档存储(BSON);支持动态查询;为文档创建索引;支持复合索引;使用地理空间索引;全新的聚合框架;二进制数据存储(海量数据、图片、视频等);碎片自动处理;就地更新信息;实施分片(自动分片);分析查询、复制数据;内置GridFS,支持海量存储。
2.2 MongoDB存储原理
MongoDB数据存储的单位是集合,分组存儲,有唯一的标识,集合中可包含多个二进制文件。对于关系型数据库,MongoDB是非关系型的,也将这类数据库称之为非关系型数据库。MongoDB面向文档,在存储时,采用
2.3 与SQL数据库的比较
SQL数据库适合需求确定和对数据完整性要求严格的应用。NoSQL数据库适用于对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求。
2.4 MongoDB应用的场景
MongoDB的主要目标是高性能和高度伸缩性以及丰富的功能。
(1) 网站中存储的数据:MongoDB非常适合实时的插入,更新与查询,高伸缩性的表现。
(2) 用户缓存的数据:持久化缓存层可以避免下层的数据源过载。
(3) 数据量大,价值低的数据。
(4) 伸缩性大的场景。
3 非结构化数据库的主要技术
3.1 数据类型
MongoDB支持一下数据类型[2]:
String:文本值
Integer:数值
Boolean:真、假
Double:浮点数
Min/Max keys:与BSON中的最低和最高值比较
Arrays:数组
Timestamp:时间戳(记录文档的修改或添加的时间)
Object:嵌入文档
Null:Null值
Symbol:与字符串用法一致(用于特定的符号类型)
Date *:UNIX时间格式的当前日期或时间
Object data *:文档的ID
Binary data *:二进制数据
Regular expression *:正则表达式
JavaScript Code *:javaScript代码
其中后五个BSON类型的。
3.2 数据检索与信息安全
MongoDB在数据检索与信息安全方面的应用主要有以下几方面:[3]
索引的类型:
_id索引;单键索引;多键索引;复合索引;过期索引;全文索引;全文索引相似度查询:可返回相似度;地理位置索引;2D索引。
安全的方法:
物理隔离;网络隔离;防火墙隔离;用户名、密码。
安全度:
最安全:物理隔离;
次安全:网络隔离;
次次安全:防火墙隔离;
次次次安全:用户名、密码;
复制集保证数据安全:多副本存储(主从模式)。
4 非结构化数据库的应用
4.1 与Java、Python的结合
通过Java连接MongoDB数据库有两种方法:
方法一:
建立javaProject项目,通过引入外包mongo-java-driver连接MongoDB非结构化数据库(通过 Mongo mongo = new Mongo(host, port)连接)
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("test");
方法二:
建立maven项目,创建与java的依赖连接MongoDB
// 连接Mongodb服务
MongoClientclient=new MongoClient("localhost",27017);
//连接到数据库
MongoDatabase db=mongoClient.getDatabase("test");
通过Python连接数据库
前提工作:有Pymongo数据包
import pymongo
client=pymongo.MongoClient(host='localhost',port=27017)
4.2 基本的方法
MongoDB在应用中常使用到的基本方法如下:
show dbs #显示所有db
use fengDb #转换到哪个db,没有这个db就自动新建一个这个db
db 显示当前操作的db
db.fengDb.insert({"name":"fengnovo"}) #在fengDb上增加一个记录
db.dropDatabase()# 删除当前db(fengDb)
use fengDb #将操作对象转到db
show collections #显示上面的db即fengDb这个数据库下所有的集合
db.printCollectionStats() #查看各collection的状态
db.user1.drop() #删除fengDb数据库下面的user1集合
show users # 查看所有用户
db.addUser('admin','pwd') #增加或修改用户密码
db.user1.save({'name':'fengnovo','age':26,'favor':['singing','playing']}) #存儲嵌套的对象
db.user1.save({'name':'fengnovo','age':27})#存储数组对象
db.user1.update({'name':'fengnovo'},{'$set':{'age':27}},psert=true,multi=true) #根据条件修改,允许一次性修改多条记录
db.user1.remove({'age':24})#删除age=24的记录
db.user1.remove()#删除所有的记录
db.user1.find() #查找所有
db.user1.find().pretty() #查找所有并格式化在控制台
db.user1.findOne({'name':'fengnovo'})#查找一条记录
db.user1.find({'name':'fengnovo'}).limit(10)#根据条件检索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集合的数目
db.user1.distinct(‘age) #distinct操作,只取age的值
db.user1.find({"age": {‘$gte' : 27}}) #>=操作
db.user1.find({"age": {'$lte' : 27}}) #<=操作
db.user1.find({'address.city':'beijing'}) #子对象的查找
4.3 存储图片和视频
使用Java和Gridfs向MongoDB中存储图片。
优点:MongoDB通过Fridfs可以存储大文件,并且可以值访问部分文件。
代码实例:
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"); //图片的路径
// 创建photo
GridFS gfsPhoto = new GridFS(db, "photo");
// 从本地驱动获取图片的文件
GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
gfsFile.setFilename(newFileName);
// 将图片保存至MongoDB中
gfsFile.save();
添加视频:
File imageFile = new File("E:\\image\\1.avi");
查看结果:show dbs。注意:添加图片时,由于图片太小,内存无法显示变化,可以添加大一点的视频文件开观察内存的变化。
4.4 爬取数据并存储
使用Python爬虫技术爬取中国大学排名并存储在MongoDB中。[4]
实例:
import pymongo
import requests
from bs4 import BeautifulSoup
import bs4
# 连接mongodb
client =pymongo.MongoClient(host='localhost',port=27017)
# 数据库
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],
"学校名称":u[1],
"总分":u[2] }
# 将数据存储至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()
查看結果:
import pymongo
client = pymongo.MongoClient(host='localhost',port=27017)
db=client.xiaozhu
collection=db.data
count=collection.find().count()#计数
print(count)
5 结论
探讨非结构化数据库的特点,介绍了MongoDB数据库的她点以及检索的优势,并对MongoDB的连接进行展示,实验证明,使用MongoDB的MongoClient连接更加方便和快捷,而且Python的连接易于Java的连接。在使用Gridfs存储时,大的文件容易显示,建议存储大文件时使用。在网络信息发达的社会,MongoDB会有越来越大的分量。
参考文献:
[1] (美)豪斯(Hows,D.)等. MongoDB大数据处理权威指南[M]. 2版.王肖峰,译.北京:清华大学出版社,2015(2016.6重印).
[2] (美)班克(Banker,k.). MOngoDB实战[M]. 丁雪丰, 译. 北京:人民邮电出版社,2012.10.
[3] Seanz.MongoDB入门篇[M/CD].http://www.imooc.com/learn/295.2017-05-24/2818-05-17.
[4]嵩天.Python网络爬虫与信息提取[M/CD].http://www.icourse163.org/learn/BIT-1001870001?tid=100278106#/learn/cnnounce.2018-04-07/2018-06-13.
[通联编辑:王力]