MongoDB中的aggregate()方法

    MongoDB的一个很大的好处是能够使用MapReduce来吧数据库查询的结果简化成一个与原来的集合完全不同的结构。MapReduce把一个数据库查询的值映射为一个完全不同的形式,然后简化结果,使它们的可用性更好。

    MongoDB有一个MapReduce框架,它也允许你使用聚合来简化吧一个MapReduce操作传输到另一个MapReduce操作的一系列过程。有了MapReduce和聚合,可以用数据生成一些不平凡的业绩。聚合的概念是指,在把MongoDB服务器上的文档汇编为一个结果集时,对它们执行一些列的操作。这比在Node.js应用程序中检索它们和处理它们更高效,因为MongoDB的服务器可以在本地操作数据块。

1,了解aggergate()方法

    Collection对象提供了aggregate()方法来对数据进行聚合操作。aggregate()方法的语法如下

aggregate(operators,[options],callback)

    operators参数是如表1所示的聚合运算符的数组,它允许你定义对数据执行什么汇总操作。options参数允许你设置readPreference属性,它定义了从哪里读取数据。callback参数是接受err和res

可以在aggregate()方法上使用的聚合运算符
运算符说明
$project

通过重命名,添加或删除字段重塑文档。你也可以重新计算值,并添加子文档。例如,下面的例子包括title并排除name:

{$project:{title:1,name:0}}

以下是把name重命名为title的例子:

{$project{title:"$name"}}

下面是添加一个新的total字段,并用price和tax字段计算它的值的例子:

{$project{total:{$add:["$price","$tax"]}}}

$match通过使用query对象运算符来过滤文档集。
$limit限定可以传递到聚合操作的下一个管道中的文档数量。例如{$limit:5}
$skip指定处理聚合操作的下一个管道前跳过的一些文档
$unwind指定一个数组字段用于分割,对每个值创建一个单独的文档。例如{$unwind:"$myArr"}
$group

把文档分成一组新的文档用于在管道中的下一级。新对象的字段必须在$group对象中定义。你还可以把表2中列出的分组表

达式运算符应用到该组的多个文档中。例如,使用下面的语句汇总value字段:{$group:{set_id:"$0_id",total:{$sum:"$value"}}}

$sort

在把文档传递给处理聚合操作的下一个管道前对它们排序。排序指定一个带有field:<sort_order>属性的对象,其中<sort_order>

为1表示升序,而-1表示降序

2,实现聚合表达式运算符

    当你实现聚合运算符时,你建立将传递到聚合操作流水线的下一级的新文档。MongoDB的聚合框架提供了许多表达式运算符,它们有助于对新字段计算值或对文档中的现有字段进行比较。

    当在$group聚合管道上操作时,多个文档与创建的新文档中定义的字段匹配。MongoDB提供了一组你可以应用到这些文档的运算符,并用它在原来文档集的字段值的基础上计算新组文档中的字段值。下表列出了$group表达式运算符。

聚合$group表达式运算符
运算符说明
$addToSet返回一组文档中所有文档所选字段的全部唯一值的数组。例如:colors:{$addToSet:"color"}
$first返回一组文档中一个字段的第一个值。例如:firstValue:{$first:"$value"}
$last返回一组文档中一个字段的最后一个值。例如:lastValue:{$last:"$value"}
$max返回一组文档中一个字段的最大值。例如:maxValue:{$max:"$value"}
$min返回一组文档中一个字段的最小值。例如:minValue:{$min:"$value"}
$avg返回一组文档中以个字段的平均值。例如:avgValue:{$avg:"$value"}
$push返回一组文档中所有文档所选字段的全部值的数组。例如:username:{$push:"$username"}
$sum返回一组文档中以个字段的全部值的总和。例如:total:{$sum:"$value"}

    此外,计算新的字段值时,可以应用一些字符串和算术运算符。下表列出了在聚合运算符中计算新字段值可以应用的最常用的一些运算符。

可用在聚合表达式的字符串和算术运算符
运算符说明
$add计算数值的总和。例如:valuePlus5:{$add:["$value",5]}
$divide给定两个数值,用第一个数除以第二个数。例如:valueDividedBy5:{$divide:["$value",5]}
$mod取模。例如:{$mod:["$value",5]}
$multiply计算数值数组的乘积。例如:{$multiply:["$value",5]}
$subtract给定两个数值,用第一个数减去第二个数。例如:{$subtract:["$value",5]}
$concat

连接两个字符串 例如:{$concat:["str1","str2"]}

$strcasecmp比较两个字符串并返回一个整数来反应比较结果。例如 {$strcasecmp:["$value","$value"]}
$substr返回字符串的一部分。例如:hasTest:{$substr:["$value","test"]}
$toLower将字符串转化为小写。
$toUpper将字符串转化为大写


MongoDB,聚合(aggregate)是一种用于处理数据的强大工具,它允许您根据指定的条件对集合的文档进行分组、筛选、排序和转换等操作。聚合框架提供了一组操作符,可以按照特定的顺序将这些操作链接在一起,以便对数据进行复杂的处理。 聚合操作通常由一个或多个阶段(stage)组成,每个阶段都会对输入文档进行处理,并将结果传递给下一个阶段。以下是一些常用的聚合阶段: 1. `$match`:用于筛选满足指定条件的文档。 2. `$group`:根据指定的字段对文档进行分组,并可以对每个分组进行聚合操作,如计数、求和等。 3. `$sort`:对文档进行排序。 4. `$project`:指定输出文档包含的字段,并可以进行字段重命名、计算新字段等操作。 5. `$limit`:限制输出文档的数量。 6. `$skip`:跳过指定数量的文档。 7. `$unwind`:将包含数组的字段拆分成多个文档。 除了上述阶段外,还有其他一些用于数据转换、计算和操作的阶段可供使用。 下面是一个示例,展示了如何使用聚合操作来计算集合每个作者的文章数量: ```javascript db.articles.aggregate([ { $group: { _id: "$author", count: { $sum: 1 } } }, { $sort: { count: -1 } } ]) ``` 这个聚合操作首先使用`$group`阶段按照`author`字段进行分组,并使用`$sum`操作符计算每个分组的文档数量。然后,使用`$sort`阶段按照计数结果进行降序排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值