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 • '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( ■■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 ■'•〇 wiv»'»i»u J iunvid 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 • 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 ii-n t%*0^U oldv us «ini94i in a1fr>!]»>"•>〇*: «W »»ni|MlVjucifM cni; U iu; tonfelVN «V«<< tf >i>n«l ^*4 MtOtArwiAi lelVaupt*'^1?ax'-S i >n 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 ipC 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 #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
版权声明:本文标题:一种面向MongoDB的数据库统一访问接口设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1702742004a428938.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论