前言
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
运算符 | 说明 |
$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表达式运算符。
运算符 | 说明 |
$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()方法实例详解的文章就介绍到这了,更多相关MongoDB aggregate()方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!