admin 管理员组

文章数量: 1184232


2023年12月16日发(作者:各种花边图片大全)

电子技术与软件工程数据库技术Database TechnologyElectronic Technology & Software Engineering一种面向MongoDB的数据库统一访问接□设计与实现王辉傅康平侯毅王阳(中国电子科技集团公司电子科学研究院北京市lOOtMl)摘要:本文结合某大型电子信息系统对MongoDB数据库访问操作的需求,提出了一种基于Mongo-C Driver的MongoDB数据库访问

接口的设计目标、设计思路,并采用C++语言开发了基于Mongo-C Driver的面向对象的数据库统一访问接口 MongoASI (MongoDB Access

Service Interface)。通过调用MongoASI类中的方法可以很轻松的实现对MongoDB各种操作,同时,MongoASI还实现了一种通用的抽

象数据结构,该结构可实现大部分数据类型(基本类型、构造类型)的存储,有效的满足了某大型电子信息系统对MongoDB数据库访问操

作的需求。关键词:数据库接口;

MongoDB;数据结构1引言随着信息技术的不断发展,电子信息产品及互联网应用用户量

剧增,数据量呈几何级数增长,巨大的存储压力对海量数据存储技

术提出了新的要求。而传统的关系型数据库难以提供超大规模的数

据存储以及高并发的读写访问能力,因此提出了

NoSQL数据库。

NoSQL全称是Not

Only

Sql,指的是非关系型的数据库。NoSQL

数据库主要应用于大规模系统,具有模式灵活、最终一致性、面向

海量数据、分布式、开源、水平可扩展、配置简单、非关系型等特点。

自从谷歌提出BigTable数据库概念后,NoSQL技术逐渐成为业界

探讨和人们研宄的热点[ *1]。并出现了

HBase,

Cassandra,

MongoDB

等一系列基于NoSQL的存储技术。这些新的NoSQL数据库越来

越多的被应到大型的数据存储系统中。越来越多的技术人员开始从

事NoSQL数据库幵发工作,因此,数据库访问接口也成为了业界

研究的主要课题,本文中描述的MongoASI既是为了满足某大型电

子信息系统对于数据库访问操作的需求所设计与实现的一套通用的

MongoDB数据库访问接口。2 MongoDB概述MongoDB应用程序;MongoASI

API :应用程序数据库访问接口

MongoASIlibBsonn!MongoDB数据库集群Mongo

C

Driver驻留丨、V:用的pc机图h数据库访问接口在系统应用中的位置图2:

MongoASI总体架构是一个基于分布式,文件存储的非关系型数据库,

3. 2设计思路数据库为了满足应用程序的调用,都会提供一组跨平台的、语

言绑定的API (应用程序编程接口),这些API通常又被称为数据

库驱动[3]。一个基于MongoASI的应用程序可轻松的实现对数据库

的各种操作。这些操作包括:连接打开数据库、打开/创建数据集;

MongoDB

SQL语句的直接执行;用户数据到BSON文件的转化。MongoASI位于数据库应用程序和数据库驱动的中间层(见图

1),它即为上层的数据库应用程序提供了一个抽象的、易使用的

应用层接口及应用层需要的数据库查询结果集、数据库控制、数据

库状态监控、数据库索引等信息的统一管理和操作的平台,又为

下层数据库驱动程序提供了一个抽象的BSON文档封装。因此,

MongoASI包含了两方面的内容。第一,面向应用程序的数据库操

作接口;第二,一个屏蔽了

MongoDB数据存储单元BSON文档的

抽象数据结构。本文中所实现的数据库访问接口

MongoASI选择采用

MongoDB提供的一套C语言的数据库驱动程序Mongo-C

Driver。

之所以采用Mongo-C

Driver作为数据库驱动程序,是因为:(1)

MongoASI所用于系统中的全部应用程序均采用C/C++

其特点是高性能、易部署、易使用,存储数据方便。不同于传统

关系型数据库将数据以表的形式进行存储,在MongoDB中数据是

以文档的形式进行存储。文档为BSON格式,其内部可以包含多

种类型的文件、数据,也可以内嵌别的文档,模式十分自由[2]。

MongoDB也被认为是最像关系数据库的非关系型数据库,是一个

介于关系数据库和非关系数据库之间的产品,其功能也是众多非关

系数据库当中最丰富的。MongoDB的设计理念基于分布式扩展,它使用自动分片机制

将数据库中的集合和文档分布在多个不同的数据库节点上。只需向

集群中添加新机器便可以简单方便地获得更大的容量。MongoDB

在存储上的高拓展性使得其在面对海量级数据时比其他的数据库更

加具备优势,其数据模型自由可变,存储内容可按照需求随意拓展,

所以也适用于一些新应用,需求容易改变,数据模型无法确定,或

者想快速迭代开发的产品。由于其高效的实时插入、更新与查询性

能,并具备网站实时数据存储所需的复制及高度伸缩性。因此适用

于常见的游戏场景、物流场景和物联网场景等。3 MongoAS丨设计3. 1设计目标语言进行开发;(1) 数据库访问接口位于数据库应用程序和具体的数据库驱

(2) 有利于接口的封装,从而能够实现更丰富的接口功能;动的中间层。数据库访问接口提供了一个抽象的、易使用的应用层

(3)

Mongo-C

Driver在执行效率上具有一定的优势。接口及应用层需要的数据库查询结果集、数据库控制、数据库状态

3. 3总体设计监控、数据库索引等信息的统一管理和操作的平台;(2) 封装一些冗余的操作,使得数据库开发人员可以专注于

MongoASI主要围绕以下两个方面来设计:(1)提供应用层调用的统一接口 :通过对Mongo-C

Driver驱

数据库的管理和针对特定数据集的优化;动程序的封装实现对MongoDB的各种操作,如数据库的连接、建表、

(3) 提供一种统一的数据存储结构,避免数据库开发人员从

插入、更新、查询等;外部数据结构到BSON文件转换带来的大量的时间开销。171

数据库技术Database Technology电子技术与软件工程Electronic Technology & Software EngineeringMISImptaArrayFidid•

■♦•'Til•

•laU t>p« tt'i'V* i^〇 ltn^o

mVmiw^hI

li^ti«ik-»ort.1ej«s9t- tie n-vm->ivV*i»f叫Ua7 私 cld «rng•

icooc

ww

n

flew•

f|»TXC

r*»«*•*•!**• spcend l»- I rar MVa-«ntA > 6〇wIW urrtMi trt.• uSt',VQ>oc< ii• -4«iK

T^Cm

s»'li fi

'mrtSrH ' ■, i *W *!(«〇•

UBln*r^h:c> |fn«4

Mr

Mlfi

i• oniwiritr* i,和• teiVnkje fi'oiBU pa cn»* an im: voifl• ihi«l>tiw«ivy 11 Mi• gdVnhM '.pt cT**jk

r*t,< vtrnl•

-t(^ciL

^aoill

w«ak

M>*>g4l

ncu

UwUiIHontWjM

Mtr |.

«j 讲vo*f*v3TPt*a i) %fa ift*rty

iitOia. MiS'J' rnthiw tJrt ILl'i'igA, •%>*!nViiije »non

ui'>〇i«« unoB'irO nhmM'^rhM•

iMBtsMcmury II >rAI•

• KCtfUt >.D tr-vt«

Mfu^r>tiVi^K*yutViUATip* i; uMiSrxw A>n»^ .*•〇IVk、>«0*-' M(H{jjilari»d ii£*»; DU* I' N:n〇a^sr-«: Ud .-iO• fru*T没.,” Wri*yft: wOr»-'B«3 •;(!•«0«» M<3imM<0*rw• »e(V«iuel >p* If <»3 ••tje t»p« sM UrngA' <«io• ai4*ypo.: k»i itnna• ' *w*'V>t.^rna *At *lr"iu(4

gUVAlJe

:im

BaaAi

poo* *l»•

/gXVMl'l* 11 »W

-OMVWacAS ■ B9» <«

i *tt «lrn

«ng»f>II ■liiJjMKi

U6llA-Wr I U8KArt»v&vailvaygiur. .htca viMi&iAni^. vaa■HUI ^KRIIItl} 10) »«ntxntf |i〇h

fl(

asusicA

i om• »•

huu• :ncs anusnad uwu,! nooCf!w«t iravii:•

luo^ ('•

jc«v»ij»

[m nWi.'aoo•

Q5*V«ij» : ■•*

i*y«S: »»• »C«*un〇 cniu Ml»,• ■jefVBI.K !W3

lH!«|jn«1I

>:|->a

ic«q*;

to:'4 iV* '«*«• ■i)C*'<〇Ue

:ub

MHJrts*i'3v4i «■»•

MlAWtffFiikt• A 'Vrmf *«!fl• MtAffSTaF ^->C»1CC< M'At;ffieWi'• iAKVWJw 'V« tin^A U« >• ^ ;»*

ar^vii.w >/>

aviiLc^vM:

fuu'• >i*

ti^Hutf1V(«u«kfMlA: (him.• *C^-VT|I»«« (, DOOl»oEac«

aan>>irt(1D I«

■■ttr'u '. 1*3 Ur»B

t«W

M.>•,'***»〇 叫UvvtfH Ivil «c*t:.Mv«rr 州 i 相iMVuf Rnl'iniWV'*l »nl l'«Ktvaronl IVitV«r iu*l iVUi Ut'4iy >VlVatam ■'•〇M I« MiblAr-v.4M Vi»» i*t*tMVarsnl 吻 MffwmfimM'Vut lltflUI> •〇0 «*JI U)ltaXvd>>iebat&!f '»1H3 V3* iilV9"W«rtVBuei»t>t cr»«: >.vm

wiv»'»i»u J iunvid WlVa.K

sotv•‘ X

liiivaica:'Aahou-I'ftiwdwy «rvp|k

e

ftpil

MIRcid'A

ra

t»ccifnmi t9f a^-Qi v- ■••d

Mlv»>atU. ax«tt Mifw>r »:«»| «fiy Xsi^ (i lan

■ mliKwrt u*»..*•> kiMICompourtdFieldi

ilMTiierlKifSPtcciOunfi 3

m/rt* FiMi*»*T

atfTVW'丨*i«*o»K' Wv»,!mtSH tn«'.. #03/M >cA»im ]p

M'nSstmfc*aM»i it »"»». ie» won fc. f Mi^ietr• !tt«n_.tc_p»^,icFX-/W-»if

li«r |»wr*_n#'J*»tux〇K lc £»o«.iKf r: Mifse*r• awi lr._ !•» e*〇ft tWi r M'F'UW•

s«^c*i*.»f»y

lik»-

t-«!H.'lw_n• 1作3 Unnflft.• umy«

litai* ti»on,Hsf i^iM9yi«ft/rj*y riVfHyh>«r«y iFod .i)< WAytaV^vKluaerinii丨-丨M丨lMoAna«4_i «uj

Ittl ouiltrtV«»r > Mw •ni if'«*' - V-t t>*t >4 iUil T«#;|wSV"〇il S*S sW”B• ~i«ir| ' WKf-'WiTIX>J9C•

ftiinrioc*.f

n«j»ec

*li

_ tl%mAhrftt i .'IU.r>f^u>^ wk*fi*-***my*-/i »r> rtnc®*.' iMffa'» fKdn^twrt i■ (»〇« 11

di#«,• MIRMnd: ii MWn«»I» 'fH«M Oft MIHoojtW:•

M^〇

Mir^A

UlV

ucu•

to

M(»(9〇»c 6«n

r*i

too•

cancUVun

piAa:

hn«^('At

KMf• ii(uls>e*'<9i> iT-iiad noflitile srrQA l- Redwv )(rn〇4 t'iMMvnUm «tr4A < vw«taM U~ng-MiCwTtunol-'eri :.V/to*>9Jnn〇Binrysoct> |ia> >4 ecu• tfit «>'iii^4,i tubnuJ-.it'Wf te».i-»J HnxteftfVflJrKr»/' Trtrt <*nyAi '<9K〇«i-〇(i»9in>ia: i tia wns

f) v>r^■ncifiW4nc« :F-taa • Nl "rrU»*HttflS J-javtCNamcfcT »〇£• 1 H««il

t^VniU {IK.r^UKt'B'jtr*r〇r T'«« H »W nir> ijilloc wor |- «ev «»>

talFliWlTftx*'ftuut I.V1

«w#w>irtfCMTVMI 丨< jan^i 州na tlxxnc i*o«; »oeIHfflMlIU* 41 abMMoI «U4liwecwofu(.-eiUccTB 'tnJang: vjutM»rt*i*in«l ibanf :Jauill.-f%ciB>au

ii-n

t%*0^U oldv us «ini94i in a1fr>!]»>"•>〇*: «W »»ni|MlVjucifM cni; U iu; tonfelVN «%) *^*(1IV«'. »a M:B>t)u>.til| «u:l

«V«<< tf >i>n«l ^*4 MtOtArwiAi

lelVaupt*'^1?ax'-S i >n«i*', waoMtIVttvA* IF »Ml VM A»tllir«y|l〇<»«r»' .j>i»r woi t* * unS n»me «tt .®J»Tltf*r.u-rt tt«;> i •* *. vtd fcl'ixkA1Wli'irvB*c«r« • MI&nafvB ««*

kAnA-r.>> 11 tifliiA iNvA

WJo«j 11 ocaWWwu-tC'^Hlftun f '***- » «V1 >l*OflvjHyUA..'、i WRyifcVn»y*t 1■,丨ffrf •I*、.

I>»3n IhuKUtr *M A>• rortH. kM Mr»a&I^«*d

■Wii'm11taairni; u an3 stn^iyi| a-wijiirlf»iW八,*n〇,’.、’/〇•»!)DC'iaiTu^en ipCujr«r-〇 eu tr n〇A'■ ui'niit Tc*C;ti*»i-Jitnlfr^txin n^ii^> i

i«pil 't«*«n shj n(*rUinl I O tal>>; 6«>n ■ »etf •umo tin tr*ili| ungl >> r,*&v»tll U-IT34I H«B

-Ill itnul

tilt W rv'1 »VO• i It . jT«*t teti*-Ill anyft^dltH twi«n»i*T» i« urwiwtl (SWI *〇; SW VBt10»«S«>:artH〇〇>* couftl (cofid. MinaocvoA) W}〇4_l* create index (^>ec Kays »MIBec〇r〇&, F

wUniqws: Bool/ hoo«naw» UBAcc«ss 11* -DBAoowra 〇*

(tmp

jndox

fTinet}

mrHi* iuwxb;

BtrtagA)

C* «» delete (ccxid: Mlflocortlll;; boa*««»r tr>*«1(r«a>r(J MlRncofiJ/llJ hrwl

• «»c一a«*ci (fBixnls:

sW"veci〇f"cMiRacoia>&.

cond 1 MIRnco»^A>: MW«co»< tort• 0IMC <»«MM;t f

ond MIFter-ufiM) boa

-«ntec. update

Mf»cord: M*R«c〇fd4, ccndMIR«〇7<>i) be-qet 9fKr 〇: eal: Jytn* «

s-aueS»l st »〇

• OWJ" l,i

atavuuaf^vodrurt*nIF^aMTlMil ( •» « > •〇> ;

»M »wl* > •cf• . UIV» 〇• .!»• i>v〇i>jvS«<

i ;

ccoi• aW/wit

utV/er( ud ilnnsS f n6e vx• t'fcj» mvtnfr.w^ ■**»! :»a.

is»X:<

* uftwiti-Bw • *pnfnt|n>34()I I^wm "1KI »lr lid tr rc^i *W» g«< collectton_naPhi

%U1 string

• g«f ilf* Into (ho«: *W utrWQit. prot *M atrinflft

Ob rams s»o: sRtegij iwkt•

iMi db 0 bool» next

(): MlfteoonJ"• oc«n odtsenop |), bod» oixin jaw^fJion (Fl*«i run«« sUt s&lrig4| w»〇)

-〇yi*f sfl<«ctioo(r vow• mil

nrthm:tK)c name {rtamrt r.o1 nianoBtd::3inr>9A»: v£d〇tlti ttflnoA. f'iutd Itti n«v>n. sKI

-set Iwili »rfo ^wsd host sW: strmgi. F«ed po«:

tnnA- rh'WKMeisnfwic«iti

t '*t0i * .vnld图3:

MongoASI类设计(2)提供一种抽象的数据存储结构:MongoDB数据库将

BSON

(Binary

JSON)作为数据的存储形式存放在磁盘中。当客

户端要将数据存入数据中时,首先需要将用户结构化的数据转换成

BS0N格式,软后将转换成的BS0N格式数据发送给数据库服务端;

当执行查询操作时,数据库服务器返回BSON数据给用户,用户通

过解析BSON数据才能够得到真正的查询结果。MongoASI应提供

一种抽象的数据存储格式,并实现抽象数据和BSON格式数据之间

的相互转化。根据以上两点主要设计要点数据库访问接口

MongoASI可设计

为数据库操作统•接口和抽象数据类型两部分。前者用于对数据库

进行基本的操作,提供一个标准的数据结构用于存储用户数据。MongoASI总体架构见图2。3. 4数椐库操作接口DBAccess设计数据库操作接口设计的目标是,通过指定数据库服务器地址、

端口、数据库名等信息,然后连接到数据库并打幵或创建数据集。

数据集打开或创建成功后就可以执行插入、查询、更新等操作,并

返回结果。以下是数据库操作接口主要接口的定义:(1) 设置数据库连接信息:Set_Link_Info(string

host,

string

port,

string

db

name)。通过此接口设置数据库服务器的地址、端口

和数据库实伊r的名称,用于连接数据库:(2) 连接数据库:Link_Db()。根据Set_Link_Info()设置的连

接信息连接数据库;172

电子技术与软件工程数据库技术Database TechnologyElectronic Technology & Software Engineeringvoid

demo

inscti()MIRecord

record;iflUuS]®.史 5?书卢ldl "ficld_char*.M

I

VarianU 'xT).

reconl-addFickll'field

Vanantl(ini 11));ld('field

long'.MlVarmnn(kmg 1 'J2RW000));

record^ddlickJ("field_n〇»nH(n〇at )24.89)).

recortuiddl

icWCfield

s!ring",MIVanan«Casdfasdfasdfassdfas")):

record

addl

ieklCrMrld

bool".MIVariant!

false));.iflDnc赛衣类T点

MIKicId

*p

Icntp _

new

MIFieldO:

liirsimple一

array'ArrayhMISimpkArrayKield*

p

simple

array ^

siatic

casf:MISimpleArrayl

icld* 'ipjempl;

fortim

i=0;i< 10;i+-*)!p

simple

anay->appciKl(

MIVanant(

(double

M ? 1))):^include ^include "MICoreDBAcccsvDBAccess.h*

#includc 'MICore/TypevMlVariam.h"DBAcccss

db://设置e接罄截

link

mfo(stnn^"mongodb: .,127.0.0.J")jlring(*270l7"),striBg("DB"));

_I4据A

if{

dbOIIsld::coui

«"!ink

em)rC<'^_eTror().t

sir〇;細y//tIJT即将vfiH的集合ilib

opcn_

collcction(

stmg( "data*)):/«au结构沐//定义值范围MICompoundField*

compound

fieU ~

new

MICampoundField(*tring("compamiy*)l.

MlArrayFicld*

p_array2 -

new

MlAnayFicldTcorapound

array*);

compound

fic!d->append(striDgrtypc").MIVanannsiringrsmici"))):

fol(iai

i - 0;i < 10;

i++)MINumencVBlueRangcrg("n〇al,,,>[0,100)"),

vector

records:M1

Record

cond;//添曲篆ftcond

addKicld('ficldjm".MIVananHrg));//执行ft珣嫌ftid

))!

ad::coui

«*Sclco

error'«_«T〇it ).c_sm)<,1

std :cndl;MICompoundFtcId*

tcmp

fickl ••

new

MK

ompouiHlFicliKlcmp);

temp

fi«ld->appcod(string! "int_val")>1IVanani( (ini)l 01));

temp

f*ek)->append(stringrioi>i^Tir).MIVanaimlong)IOIO)J:

temp

fkld->appcnd

p

array2-'append(sialtc_casi*MIFicld,;»(icmp

Held)).compound_field-'-append(p_array2).rccord

appcmKcompound

field);/z与入ill !scn(

record))!

sid.:coui«°lnscrt

crror-^bgct

cnwOcI"以JSON供式輪出ft®结®

for(int

i -

O.i •

/e〇,i++){s«d;:cout <•-

retordsji]-json〇;J图4:

MongoASI调用与执行(3) 打开 / 创建数据集:Open_Collection(stringname)。打开指定名称的数据集,若数据集存在则"打开,若数据集不存在则创建

一个新的数据集;(4) 插入数据:Exec」nsert(MIRecordrecord)。向数据集中插入一条数据,数据类型MIRecord为本文设计的一个通用的抽象数

以是$set、Sunset、$push等命令),新的数据在var中给出;(6) 从BSON文档转换成MIRecord数据对象:from_

bson(bson_t *doc);(7) 将MIRecord数据对象转换成BSON文档:to_bson(bson_

t *doc)。据结构;3. 6

MongoASI类设计(5) 更新数据:Exec—Update(MIRecord

record,

MIRecord

cond)〇

MongoASI数据库操作接口类及抽象数据存储结构类设计如图

根据设置的条件corn!更系数据库中的一条数据,record中为要更

3所示。新的内容;4

MongoAS丨应用(6) 删除数据:Exec_Delete(MIRecordcond)。根据条件

condMongoASI承担了

MongoDB数据库连接、操作及结果集的管

删除数据集中的数据;所示。(7) 查询数据:Exec_Select(vector

MIReco理工作,其调用及执行过程如图4rd

cond)。根据条件cond在irecords 中;(据集中查询数据,并把查询结果写入

5结语本文设计实现的数据库访问接口

MongoASI经过测试,能够

(8) 创建索引:Create_Index(string

key,

string

index

name,

bool

稳定的运行在Windows、Linux、VxWorks平台上,它不仅提供了

is

Unique)。在指定的Key创建名字为index_name的索引;MongoDB操作接口,还提供了一种通用的数据存储结构,该结构

(9) 删除索引:Drop_Index(string

index

name)。删除名字为

屏蔽了从用户数据到BSON文档的转换过程,使得数据库应用开发

index

name 的索弓I;人员可以更专注于业务和数据本身,大大的缩短了数据库应用程序

(10) 删除数据集:Drop_current_collection()。删除数据集及

的开发时间。有效的满足了某大型电子信息系统对MongoDB数据

其内的全部数据。库访问操作的需求。3. 5抽象数据结构MIRecord设计抽象数据结构MIRecord实现了从用户数据到MongoDB所存

参考文献[1] 郭匡宇.基于MongoDB的传感器数据分布式存储的研究与应用

储的BSON文档的相互转换。其主要的接口定义如下:D].南京:南京邮电大学,2013.(1) 添加基本类型节点:add_field(

string

key,

MI

Variant

[[2] 任明飞.基于MongoDB的非关系型数据库的设计与开发[J].

var)。给记录增加一个指定key的基本数据类型节点。MlVariant

电脑知识与技术,2019 (34): 1-2.是MongoASI中定义的基本存储数据类型,可实现bool、char、

[3] 洪承煜.数据库统一接口模型设计与实现[J].网络新媒体技

short、int、long、float、double等基本数据类型存储;2012 (3): 49-50.(2) 添加复合类型节点:add_field(string

key,MI

Field*

field,

术,FieldType

type)。给记录增加一个指定key的复合类型的字节点,

MIField是MongoASI中定义的复合存储数据类型,可实现array、

作者简介王辉( 1982-),男,辽宁省沈阳市人。硕士学位,中国电子科技

struct等构造类型数据的存储。type指定数据类型;集团公司电子科学研究院,工程师。研究方向为网络通信、中间件、

(3) 给复合节点添加基本类型子节点:add_field(MIField*

pre_field,

string

sub

key,

MlVariant

var)。给指定复合节点添加一个

数据记录与回放。傅康平( 1987-),山东省人。博士,高级工程师。研究方向为空

指圣key的基本类i字节点;(4) 给复合节点添加一个复合类型子节点:add_field(MIField基信息系统基础计算架构。*

1978-),男,陕西省西安市人。硕士研究生学历,助理工程师。

pre

field,

string

sub_key,

MIField*

field,

FieldType

type)。给指定的复

侯毅(合节点添加一个指定key的array或struct类型的子节点;研究方向为计算机应用科学。王阳( 1986-),男,江苏省连云港市人。硕士研究生,高级工程师。

(5) 设置更新数据参数:update_field(string

operate,

string

key,

MlVariant

var)。对记录中指定key的节点进行operate指定的操作(可研究方向为分布式系统架构。173


本文标签: 数据库 数据 接口