Heim  >  Artikel  >  Datenbank  >  在MongoDB中实现聚合函数

在MongoDB中实现聚合函数

WBOY
WBOYOriginal
2016-06-07 17:18:401150Durchsuche

我们在本文中使用的NoSQL是MongoDB,它是一种开源的文档数据库系统,开发语言为C++。它提供了一种高效的面向文档的存储结构,同时

随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据。传统方法存储和处理数据的成本将会随着数据量增长而显著增加。这使得很多组织都在寻找一种经济的解决方案,比如NoSQL数据库,它提供了所需的数据存储和处理能力、扩展性和成本效率。NoSQL数据库不使用SQL作为查询语言。这种数据库有多种不同的类型,比如文档结构存储、键值结构存储、图结构、对象数据库等等。

我们在本文中使用的NoSQL是MongoDB,它是一种开源的文档数据库系统,开发语言为C++。它提供了一种高效的面向文档的存储结构,同时支持通过MapReduce程序来处理所存储的文档;它的扩展性很好,而且支持自动分区。Mapreduce可以用来实现数据聚合。它的数据以BSON(二进制JSON)格式存储,在存储结构上支持动态schema,并且允许动态查询。和RDBMS的SQL查询不同,Mongo查询语言以JSON表示。

MongoDB提供了一个聚合框架,其中包括常用功能,比如count、distinct和group。然而更多的高级聚合函数,比如sum、average、max、min、variance(方差)和standard deviation(标准差)等需要通过MapReduce来实现。

这篇文章描述了在MongoDB存储的文档上使用MapReduce来实现通用的聚合函数,如sum、average、max、min、variance和standard deviation;聚合的典型应用包括销售数据的业务报表,比如将各地区的数据分组后计算销售总和、财务报表等。

我们从本文示例应用所需软件的安装开始。

软件安装

首先在本地机器上安装并设置MongoDB服务。

  • 从Mongo网站上下载MongoDB,解压到本地目录,比如C:>Mongo
  • 在上一个文件夹内创建数据目录。比如:C:\Mongo\Data   
  • 如果数据文件存放在其他地方,那么在用mongod.exe命令启动MongoDB时,需要在命令行加参数—-dbpath
  • 启动服务   
  • MongoDB提供了两种方式:mongod.exe以后台进程启动;mongo.exe启动命令行界面,可做管理操作。这两个可执行文件都位于Mongo\bin目录下;
  • 进入Mongo安装目录的bin目录下,比如:C:> cd Mongo\bin
  • 有两种启动方式,如下:

    mongod.exe –dbpath C:\Mongo\data或者        mongod.exe –config mongodb.config        mongodb.config是Mongo\bin目录下的配置文件,需要在此配置文件中指定数据目录(比如,dbpath= C:\Mongo\Data)的位置。
  • 连接到MongoDB,到这一步,mongo后台服务已经启动,可以通过:27017查看。 MongoDB启动运行后,我们接下来看它的聚合函数。

  • 实现聚合函数

    在关系数据库中,我们可以在数值型字段上执行包含预定义聚合函数的SQL语句,比如,SUM()、COUNT()、MAX()和MIN()。但是在MongoDB中,需要通过MapReduce功能来实现聚合以及批处理,它跟SQL里用来实现聚合的GROUP BY从句比较类似。下一节将描述关系数据库中SQL方式实现的聚合和相应的通过MongoDB提供的MapReduce实现的聚合。

    为了讨论这个主题,我们考虑如下所示的Sales表,它以MongoDB中的反范式形式呈现。

    Sales表

    #

    列名

    数据类型

    1

    OrderId

    INTEGER

    2

    OrderDate

    STRING

    3

    Quantity

    INTEGER

    4

    SalesAmt

    DOUBLE

    5

    Profit

    DOUBLE

    6

    CustomerName

    STRING

    7

    City

    STRING

    8

    State

    STRING

    9

    ZipCode

    STRING

    10

    Region

    STRING

    11

    ProductId

    INTEGER

    12

    ProductCategory

    STRING

    13

    ProductSubCategory

    STRING

    14

    ProductName

    STRING

    15

    ShipDate

    STRING

     

    基于SQL和MapReduce的实现

    我们提供了一个查询的样例集,这些查询使用聚合函数、过滤条件和分组从句,及其等效的MapReduce实现,即MongoDB实现SQL中GROUP BY的等效方式。在MongoDB存储的文档上执行聚合操作非常有用,这种方式的一个限制是聚合函数(比如,SUM、AVG、MIN、MAX)需要通过mapper和reducer函数来定制化实现。

    MongoDB没有原生态的用户自定义函数(UDFs)支持。但是它允许使用db.system.js.save命令来创建并保存JavaScript函数,JavaScript函数可以在MapReduce中复用。下表是一些常用的聚合函数的实现。稍后,我们会讨论这些函数在MapReduce任务中的使用。

    聚合函数

    Javascript 函数

    SUM

    db.system.js.save( { _id : "Sum" , value : function(key,values) { var total = 0; for(var i = 0; i

    AVERAGE

    db.system.js.save( { _id : "Avg" , value : function(key,values) { var total = Sum(key,values); var mean = total/values.length; return mean; }});

    MAX

    db.system.js.save( { _id : "Max" , value : function(key,values) { var maxValue=values[0]; for(var i=1;i

    MIN

    db.system.js.save( { _id : "Min" , value : function(key,values) { var minValue=values[0]; for(var i=1;i
    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn