Mongodb分片联表查询方法及装置的制作方法

文档序号:6363250阅读:261来源:国知局
专利名称:Mongodb分片联表查询方法及装置的制作方法
技术领域
本发明涉及基于分布式文件存储的数据库集群技术,尤其涉及一种M0NG0DB分片联表查询方法。
背景技术
数据库集群技术是将多台服务器联合起来组成集群来实现综合性能优于单个大型服务器的技术。M0NG0DB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MAPREDUCE是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(化简)",和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。他极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map (映射) 函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce (化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。SHARDING是一种数据库在水平扩展上的解决方案,其主要目的是为突破单节点数据库服务器的I/o能力限制,解决数据库扩展性问题。但是,随着数据库集群技术的发展,人们对其业务功能的需求也越来越高。例如, 要求对M0NG0DB中的已有数据进行分批分组。然而,本发明发明人经过研究发现,虽然当前的MapReduce可以实现多台M0NG0DB服务器之间的数据汇总(即GROUP BY),却难于进行多台M0NG0DB服务器之间的联表分组查询。

发明内容
本发明所要解决的技术问题之一是需要提供一种能够实现在多台M0NG0DB服务器之间联表分组查询的M0NG0DB分片联表查询方法。为了解决上述技术问题,本发明提供了一种M0NG0DB分片联表查询方法。该方法包括确定查询条件,所述查询条件用于查询MONGDB所有分片的指定数据表中与指定分组对应的分组汇总信息;确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识; 获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息;将所获取的数据信息存储在一临时数据表中;基于所述临时数据表对所获取的数据信息进行分组汇总,得到分组汇总信息。根据本发明又一方面的M0NG0DB分片联表查询方法,基于通过网络接收到的用户端发来的用户请求来确定查询条件;将所得到的分组汇总信息返回给所述用户端。根据本发明又一方面的M0NG0DB分片联表查询方法,通过Mongos来获取所述 M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息。根据本发明又一方面的M0NG0DB分片联表查询方法,通过MAPREDUCE来基于所述临时数据表对所获取的数据信息进行分组汇总。根据本发明又一方面的M0NG0DB分片联表查询方法,所述查询条件用于查询 MONGDB所有分片中的指定数据表中与指定分组对应且满足预设条件的分组汇总信息;在获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息时,获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一且满足所述预设条件的数据信息。根据本发明又一方面的M0NG0DB分片联表查询方法,基于存储了所述指定数据表的数据记录标识与所述指定分组的标识之间关联关系的关联表,来确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识。根据本发明又一方面还提供了一种M0NG0DB分片联表查询装置。该装置包括确定单元,查询单元和临时表管理单元,其中,所述确定查询条件,所述查询条件用于查询MONGDB所有分片中指定数据表中与指定分组对应的分组汇总信息;所述查询单元确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识,获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息;所述临时表管理单元将所获取的数据信息存储在一临时数据表中;所述查询单元在所述临时管理单元将所获取的数据信息存储在一临时数据表中之后,还基于所述临时数据表对所获取的数据信息进行分组汇总,得到分组汇总信息。根据本发明又一方面的M0NG0DB分片联表查询装置,还包括通信单元,其中,所述通信单元通过网络接收到的用户端发来的用户请求来确定查询条件,以及在所述查询单元得到分组汇总信息之后,将所得到的分组汇总信息返回给所述用户端。根据本发明又一方面的M0NG0DB分片联表查询装置,所述查询单元通过Mongos来获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息。根据本发明又一方面的M0NG0DB分片联表查询装置,所述查询单元通过 MAPREDUCE来基于所述临时数据表对所获取的数据信息进行分组汇总。与现有技术相比,本发明可以具有以下优点。本发明能够实现多台M0NG0DB服务器之间高效联表分组查询。本发明的一实施例中通过在在多台M0NG0DB服务器之间联表分组查询的过程中, 建立一临时数据表,将通过查询汇总所获得的属于各指定分组的数据记录存储在该临时数据表中,可以提高多台M0NG0DB服务器之间联表分组查询速度。本发明通过MAPREDUCE来基于上述临时数据表进行汇总,可以减少研发人员的工
作量,提高工作效率。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。


附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例共同用于解释本发明,并不构成对本发明的限制。在附图中图I是广告数据表中的一些记录的示例;图2是根据第一实施例的M0NG0DB分片联表查询方法流程示意图;图3是根据本发明第一实施例基于组标识orgid来查询数据记录标识的示例;图4是对根据本发明第一实施例的临时数据表tempDB内容的截图示例;图5是根据本发明第二实施例的M0NG0DB分片联表查询装置的架构示意图。
具体实施例方式以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成技术效果的实现过程能充分理解并据以实施。需要说明的是,只要不构成冲突,本发明中的各个实施例以及各实施例中的各个特征可以相互结合, 所形成的技术方案均在本发明的保护范围之内。另外,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。第一实施例本实施例提供了一种在配置了分片(SHARDING)的数据库集群环境下进行联表分组查询的M0NG0DB分片联表查询方法。为了便于说明,本实施例的数据库集群中设置了一用于存储广告信息的广告数据表,以及用于存储广告信息与广告信息分组的对应关系的分组映射表。广告数据表的记录包括adid字段和date字段等。其中,adid字段用于标识用户创建的广告投放,广告数据表中的一条记录包含adid字段、广告排期、投放状态(启动、删除、挂起)、广告定位(投放到哪些地域,哪些用户群,哪些行业)等。在广告数据表中,不要求adid唯一标识一条记录, 多条记录可以有相同的adid。图I示出了广告数据表中的一些记录的例子。分组映射表通过关联adid字段与orgid字段来存储广告信息与广告信息分组的对应关系,其中argid为各分组的标识。需要说明的是,本发明的发明人还注意到,当在存储时间字段时,现有技术一般是通过各种语言的生成时间戳的函数,直接将生成的时间戳存到MONODB中,而不将时间设置为整型。然而,在本实施例中,广告数据表中克服了技术偏见而采用了整型数据类型的时间戳,这样处理具有尽量使得各记录的时间数据唯一从而方便建立索引后查询、方便排序、 方便数据比较、以及/或者使得能够将该整型的时间戳转换成任意的时间维度从而方便检索。例如,通过如下代码可以使得日期采用整型来表示时间戳变得简单。$map = "functionQ { emit({"adid":this.adid,date:new Date(parselnt(this.date) * 1000).getFullYear()+'-,+parseInt(new Date(parselnt(this.date) * 1000).getMonth()+l)+'-'+newDate(parselnt(this.date)*
1000).getDate()},{show:this.show,ipthis.ip,uv:this.uv,click:this.click,orgid:this.o
rgid}); }',;下面结合图2详细说明在这种情形下进行广告记录分组查询的过程。图2示出根据本实施例的M0NG0DB分片联表查询方法流程示意图。在这个流程图中,用户希望查看2011-11-1至2011-11-30日某个分组下的所有广告汇总信息。换而言之,用户希望看到的是MONGDB的所有分片的广告数据表中属于某个分组下广告信息。由于各广告数据表分布式地存储于各个服务器中,因此无法像关系型数据库那样通过简单的关联操作来获取用户想要的数据结果。以下详细说明本实施例的实现过程。步骤S210,确定查询条件。查询条件用于查询MONGDB所有分片中的指定数据表中与指定分组对应的分组汇总信息。可以指定一个分组,也可以指定多个分组。通常,可通过接收用户端发来的用户请求来确定查询条件。可以通过网络接收来自浏览器等用户端发来的用户请求。更具体地,用户可以在浏览器中以选择、点击和/或输入等方式发送用户请求,处于后台的网站服务器、业务服务器等设备接收该用户请求并进行后续处理。例如,用户可以通过浏览器发送一用户请求,用于查看2011-11-1至2011-11-30 日之间MONGDB所有分片中分组号为I的分组下的所有广告汇总信息,其中广告汇总信息可通过作为指定数据表的例子的广告数据表中获得。此外,用户请求还可以用于查询MONGDB所有分片中的指定数据表中与指定分组对应且满足预设条件(例如,在一定时间段内、和/或属于某一地域内等)的数据。需要说明的是,通过用户端接收用户发来的用户请求只是一个例子,步骤S220,确定指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识。可以基于存储了指定数据表的数据记录标识与指定分组的标识之间关联关系的关联表,来执行本步骤的处理。以图3为例,图3示出了当orgid = I时,根据组号(组标识)orgid来查询数据记录标识的示例。需要说明的是,图3仅为查询MONGDB中所有分片中的指定数据表中与一个分组对应的数据的例子,这只是为了说明的简单,本实施同样适用于多个分组的情况,只要在步骤 120中确定出有属于多个组中任一组的数据记录标识即可。步骤S230,获取M0NG0DB各个分片中的指定数据表中数据记录标识是上述各目标数据记录标识之一的数据信息。可以针对各个目标数据记录标识,逐一查询MONGDB各分片的指定数据表中的数据信息。例如,可以利用如下代码来按天进行分组查询所有分片的广告数据表中某个adid下面的数据信息。
$reduce = "function(k, vals) {" ·
"var sshow = O'sip = 0, sclick = 0,suv=0;".
"for (var i in vals) {".
Mif(!isNaN(vals[i].show)&&!isNaN(vals[i].ip)
&&!isNaN(vals[i].click)) {" ·
"sshow += parselnt(vals[i].show);".
"sip += parselnt(vals[i].ip);".
"sclick += parselnt(vals[i].click);" ·
"suv += parselnt(vals[i].uv);".
"return {show:sshow,ip:sip,click:sclick,uv:suv};}";此时所获得的数据信息中,包含adid与orgid的关联关系,但并不是用户所需要的根据orgid进行了分组汇总后的分组汇总信息。如果将此时所获取的数据信息不经过分组汇总便返回给用户,则用户可能看到杂乱无章的数据信息,因此对用户而言是意义不大的。此外,可以通过Mongos来执行本步骤以获取M0NG0DB各个分片中的指定数据表中数据记录标识是上述各目标数据记录标识之一的数据信息。此外,当用户请求是用于查询MONGDB所有分片中的指定数据表中与指定分组对应且满足预设条件的分组数据信息时,在该步骤中获取所述M0NG0DB中各分片的指定数据表中数据记录标识是上述目标各数据记录标识之一且满足预设条件的数据信息。步骤S240,将步骤S230中所获取的数据信息存储在一临时数据表中。如果利用程序直接对步骤S230中所获取的数据信息进行汇总处理,则当数据量非常大时,将占用大量的处理资源,且处理时长。本实施例中,创造性地提出了将步骤S230 中所获取的数据信息存储在一张临时数据表中的构思,大大地减少了计算量和处理时长, 减少了研发人员的程序代码编写工作量。例如,当将通过上述代码所获取的数据信息存放在临时数据表tempDB中时,可以方便地通过如下代码来看到针对所有各数据记录标识adid的数据信息(
"mapreduce" => $tabName,
"map" => $map,
"reduce" => $reduce,
"query" => $search,
"out" => array("merge" => "tempDB")图4是对临时数据表tempDB内容进行截图的例子。步骤S250,基于步骤S240中的临时数据表对步骤S230中所获取的数据信息进行分组汇总,得到分组汇总信息。在将步骤S230中所获取的数据存储在一张临时数据表之后,可以方便地通过例如MAPREDUCE等来对临时数据表中的数据进行汇总,得到分组汇总信息。当该分组汇总信息是应用户通过浏览器等用户端请求而获取的时,还可以方便地将分组汇总信息返回给用户端。第二实施例本实施例提供了一种M0NG0DB分片联表查询装置。图5示出了该装置的结构示意图。根据本实施例的M0NG0DB分片联表查询装置包括确定单元51,查询单元52和临时表管理单元53。其中,确定单元执行与第一实施中步骤S210对应的操作,查询单元执行与第一实施中步骤S220、S230和S250对应的操作。第一实施例中关于步骤S210至S250的说明均适用于本实施例,在此不再赘述。此外,当基于通过网络接收到的用户端发来的用户请求来确定查询条件时,根据本实施例的M0NG0DB分片联表查询装置还包括通信单元54。该通信单元54通过网络接收到的用户端发来的用户请求来确定查询条件,以及在查询单元52得到分组汇总信息之后, 将所得到的分组汇总信息返回给所述用户端。虽然本发明所揭露的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化, 但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
9
权利要求
1.一种M0NG0DB分片联表查询方法,其特征在于,包括确定查询条件,所述查询条件用于查询MONGDB所有分片的指定数据表中与指定分组对应的分组汇总信息;确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识;获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息;将所获取的数据信息存储在一临时数据表中;基于所述临时数据表对所获取的数据信息进行分组汇总,得到分组汇总信息。
2.根据权利要求I所述的方法,其特征在于,基于通过网络接收到的用户端发来的用户请求来确定查询条件;将所得到的分组汇总信息返回给所述用户端。
3.根据权利要求I所述的方法,其特征在于,通过Mongos来获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息。
4.根据权利要求I至3中任一项所述的方法,其特征在于,通过MAPREDUCE来基于所述临时数据表对所获取的数据信息进行分组汇总。
5.根据权利要求I至3中任一项所述的方法,其特征在于,所述查询条件用于查询MONGDB所有分片中的指定数据表中与指定分组对应且满足预设条件的分组汇总信息;在获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息时,获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一且满足所述预设条件的数据信息。
6.根据权利要求I至3中任一项所述的方法,其特征在于,基于存储了所述指定数据表的数据记录标识与所述指定分组的标识之间关联关系的关联表,来确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识。
7.一种M0NG0DB分片联表查询装置,其特征在于,包括确定单元,查询单元和临时表管理单元,其中,所述确定查询条件,所述查询条件用于查询MONGDB所有分片中指定数据表中与指定分组对应的分组汇总信息;所述查询单元确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识, 作为目标数据记录标识,获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息;所述临时表管理单元将所获取的数据信息存储在一临时数据表中;所述查询单元在所述临时管理单元将所获取的数据信息存储在一临时数据表中之后, 还基于所述临时数据表对所获取的数据信息进行分组汇总,得到分组汇总信息。
8.根据权利要求7所述的装置,其特征在于,还包括通信单元,其中,所述通信单元通过网络接收到的用户端发来的用户请求来确定查询条件,以及在所述查询单元得到分组汇总信息之后,将所得到的分组汇总信息返回给所述用户端。
9.根据权利要求7所述的装置,其特征在于,所述查询单元通过Mongos来获取所述M0NG0DB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息。
10.根据权利要求7至9中任一项所述的装置,其特征在于,所述查询单元通过MAPREDUCE来基于所述临时数据表对所获取的数据信息进行分组汇总。
全文摘要
本发明公开了一种MONGODB分片联表查询方法及装置。该方法包括确定查询条件,所述查询条件用于查询MONGDB所有分片的指定数据表中与指定分组对应的分组汇总信息;确定所述指定数据表中属于所述指定分组中任一分组的数据记录标识,作为目标数据记录标识;获取所述MONGODB各个分片中的指定数据表中数据记录标识是各所述目标数据记录标识之一的数据信息;将所获取的数据信息存储在一临时数据表中;基于所述临时数据表对所获取的数据信息进行分组汇总,得到分组汇总信息。本发明能够实现多台MONGODB服务器之间的高效联表分组查询。
文档编号G06F17/30GK102609464SQ20121001212
公开日2012年7月25日 申请日期2012年1月16日 优先权日2012年1月16日
发明者刘涛, 李娜, 罗峰, 黄苏支 申请人:北京亿赞普网络技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1