位置: 编程技术 - 正文

MongoDB的聚合框架Aggregation Framework入门学习教程(mongodb 聚合)

编辑:rootadmin

推荐整理分享MongoDB的聚合框架Aggregation Framework入门学习教程(mongodb 聚合),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mongodb 聚合,mongodb分组聚合,mongodb分组聚合,mongodb的聚合框架构件,mongotemplate聚合,mongodb聚合函数详解,mongodb聚合函数详解,mongodb聚合函数详解,内容如对您有帮助,希望把文章链接给更多的朋友!

1. 聚合框架使用聚合框架对集合中的文档进行变换和组合,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理。这些构件包括筛选(filtering),投射(projecting),分组(grouping),排序(sorting),限制(limiting),跳过(skipping)。例如一个保存着动物类型的集合,希望找出最多的那种动物,假设每种动物被保存为一个mongodb文档,可以按照以下步骤创建管道。1)将每个文档的动物名称映射出来。2)安装名称排序,统计每个名称出现的次数。3)将文档按照名称出现的次数降序排列。4)将返回结果限制为前五个。具体操作符:1){"$porject", {"name" : 1}}类似于查询阶段的字段选择器,指定"fieldname" : 1选定需要的字段,"fieldname" : 0排除不需要的字段,"_id"字段自动显示。结果保存在内存中,不会写入磁盘。

2){"$group", {"_id" : "$name", "count" : {"$sum" : 1}}}首先指定了分组的字段"name",该操作执行完后,每个name只对应一个结果,所有可以将name指定为唯一标识符"_id"。第二个字段表明分组内的每个文档"count"字段加1。新加入的文档中不会有count字段。

3){"$sort" : {"count" : -1}}对结果集中的文档根据count字段做降序排列。4){"$limit" : 5}将返回结果限制为5个文档。将上述结果综合起来:

aggregate会返回一个文档数组,内容为出现次数最多的5个动物:

调试过程中。可以逐一对管道符进行排查。聚合框架不能对集合进行写入操作,所有结果返回给客户端,聚合结果必须限制在M以内。

2. 管道操作符每个操作符都会接受一连串的文档,对这些文档进行类型转换,最后得到的文档作为结果传递给下一操作符。不同的管道操作符可以将任意顺序组合在一起使用,而且可以被重复任意多次。

2.1 $match$match用于对文档集合进行筛选,之后得到的文档子集做聚合。"$match"支持所有的常规查询操作符("$gt","$lt","$ne")等,不能使用地理空间操作符。实际操作中尽量将"$match"放在管道的前面部分,一方面可以提快速将不需要的文档过滤掉,另外在映射和分组前筛选,查询可以使用索引。

2.2 $project使用"$project"可以提取字段,可以重命名字段,

可以将投射过的字段重命名:

使用"$fieldname"语法为了在聚合框架中引用fieldname字段,例如上面"$city"会被替换为"NEW WORK"。对字段重命名后,Mongdb不会记录其记录字段的历史名称,所以应该在修改字段名称前使用索引。2.2.1 管道表达式可以使用表达式将多个字面量和变量组合为一个值。可以使用组合或者任意深度的嵌套,创建复杂的表达式。2.2.2 数学表达式数学表示式用来操作数据运算。

可以将多个表达式组合为更为复杂的表达式:

操作符语法:1)"$add" : [expr1, [, expr2, ..., exprN]]将表达式相加2)"$subtract" : [expr1, expr2]表达式1减去表达式)"$multiply" : [expr1, [, expr2, ..., exprN]]将表达式相乘4)"$divide" : [expr1, expr2]表达式1除以表达式2得到商5)"$mod" : [expr1, expr2]表达式1除以表达式2得到余数

2.2.3 日期表达式用于提取日期信息的表达式:"$year","$month","$week","$dayOfMonth","$dayOfweek","$hour","$minute","$second"。只能对日期类型的字段进行日期操作,不能对数值类型进行日期操作。

也可以使用字面量日期。

2.2.3 字符串表达式操作符语法:1)"$substr" : [expr, startOffset, numoReturn]接受字符串,起始位置以后偏移N个字节,截取字符串。2)"$concat" : [expr1[, expr2, ..., exprN]]将给定的表达式连接在一起作为返回结果。3)"$toLower" : expr返回参数的小写形式4)"$toUpper" : expr返回参数的大写形式例如:

2.2.3 逻辑表达式操作符语法:1)"$cmp" : [expr1, expr2]比较两个参数,相等返回0,大于返回整数,小于返回负数。2)"$strcasecmp" : [string1, string2]比较字符串,区分大小写3)"$eq"/"$ne"/"$gt"/"$gte"/"lt"/"lte" : [expr1, expr2]比较字符串,返回结果(true or false)4)"$and" : [expr1[, expr2, ..., exprN]]所有值为true返回true,否则返回false。5)"$or" : [expr1[, expr2, ..., exprN]]任意表达式为true返回true,否则返回false6)"$not" : expr对表示式取反还有两个控制语句。

如果为true,返回trueExpr,否则,返回falseExpr。

如果expr为null,返回replacementExpr,否则返回expr。算术操作符必须接受数值,日期操作符必须接受日期,字符串操作符必须接受字符串。例如,根据学生出勤率(%),平时作业(%)和考试成绩(%)得出最终成绩,如果是老师宠爱的学生,直接得分:插入数据:

MongoDB的聚合框架Aggregation Framework入门学习教程(mongodb 聚合)

聚合:

返回结果:

3. MapReduceMapreduce非常强大与灵活,Mongodb使用javascript作为查询语言,可以表示任意复杂的逻辑。Mapreduce非常慢,不应该用在实际的数据分析中。Mapreduce可以在多台服务器之间并行执行,可以将一个问题拆分为多个小问题,之后将各个小问题发送到不同的机器上,每台机器只负责完成一部分工作,所有的机器完成时,将这些零碎的解决方案合并为一个完整的解决方案。最开始的是映射(map),将操作映射到集合中的各个文档,然后是中间环节,成为洗牌(shuffle),按照键分组,将产生的键值组成列表放在对应的键中。化简(reduce)则是把列表中的值化简为一个单值。

3.1 找出集合中的所有键MongoDB假设你的模式是动态的,所以并不会跟踪记录每个文档的键。通常找到集合中所有文档的所有键的最好方式就是MapReduce。在映射环节,map函数使用特别的emit函数返回要处理的值。emit会给MapReduce一个键和一个值。这里用emit将文档某个键的计数返回。this就是当前映射文档的引用:

reduce接受两个参数,一个是key,就是emit返回的第一个值,还有一个数组,由一个或多个键对应的{count : 1}文档组成。

示例表数据:

运行结果:

(1)result:存放的集合名(2)timeMillis:操作花费的时间,单位是毫秒(3)input:传入文档数目(4)emit:此函数被调用的次数(5)reduce:此函数被调用的次数(6)output:最后返回文档的个数查看下collection结果内容:

3.2 MapRecude其他的键(1)"finalize" : function可以将reduce的结果发送给这个键,这是整个处理过程的最后一步。(2)"keeptemp自动为true。" : boolean如果为true,则在连接关闭后结果保存,否则不保存。(3)"out" : string输出集合的名称,如果设置,keeptemp自动为true。(4)"query" : document在发往map前,先用指定条件过滤文档。(5)"sort" : document在发往map前,先进行排序。(6)"limit" : integer发往map函数的文档数量上限。(7)"scope" : document可以在javascripts代码中使用的变量。(8)"verbose" : boolean是否记录详细的服务器日志。3.2.1 finalize函数可以使用finalize函数作为参数,会在最后一个reduce输出结果后执行,然后将结果保存在临时集合里。3.2.2 保存结果集合默认情况下,执行mapreduce时创建一个临时集合,集合名称为mr.stuff.ts.id,即mapreduce.集合名.时间戳.数据库作业ID。MongoDB会在调用的连接关闭时自动销毁这个集合。3.2.3 对子文档执行mapreduce每个传递给map的文档都需要先反序列化,从BSON对象转换为js对象,这个过程非常耗时,可以先对文档过滤来提高map速度,可以通过"query","limit"和"sort"等对文档进行过滤。"query"的值是一个查询文档。"limit","sort"配合可以发挥很大的作用。"query","limit"和"sort"可以随意组合使用。3.2.4 作用域作用域键"scope",可以用变量名:值这样普通的文档来设置该选项,3.2.5 获取更多的输出设置verbose为true,可以将mapreduce过程更多的信息输出到服务器日志上。

4 聚合命名count和distinct操作可以简化为普通命令,不需要使用聚合框架。4.1 countcount返回集合中的文档数量:

可以传入一个查询文档:

增加查询条件会使count变慢。4.2 distinctdistinct用来找出给定键的所有不同值。使用时必须指定集合和键。

4.3 group使用group可以进行更为复杂的聚合。先选定分组所依据的键,然后根据选定键的不同值分为若干组,然后对每一个分组进行聚合,得到结果文档。插入示例数据:

生成的列表中包含最新的时间和最新的时间对应的年纪。可以安装name进行分组,然后取出每个分组中date最新的文档,将其加入结果集。

(1)"ns" : "coll"指定进行分组的集合。(2)"key" : {"name" : true}指定分组依据的键。(3)"initial" : {"time" : 0}初始化time值,作为初始Wednesday传递给后续过程。每组成员都会使用这个累加器。结果:

如果有文档不存在指定分组的键,这些文档会单独分为一组,缺失的键会使用name:null这样的形式。如下:

返回结果:

为了排除不包含指定用于分组的键的文档,可以在"condition"中加入"name":{"$exists" : true}。

4.3.1 使用完成器完成器(finalizer)用于精简从数据库传到用户的数据,因为group命令的输出结果需要能够通过单次数据库响应返回给用户。4.3.2 将函数作为键使用分组条件可以非常复杂,不是单个键,例如分组时按照类别分组dog和DOG是两个完全不同的组,为了消除大小写差异,可以定义一个函数决定文档分组所依据的键。定义分组函数需要用到"$keyf"键,

mongodb+php实现简单的增删改查 windows上安装mongodb的php扩展下载地址

MongoDB在不同主机间复制数据库和集合的教程 1.db.cloneCollection()db.cloneCollection(from,collection,query)在不同的mongodb实例间复制数据,db.cloneCollection是cloneCollection数据库命令的一个外在体现。function(from,colle

MongoDB的基本安装与管理命令脚本总结 安装1.Linux安装MongoDB1.1创建数据目录和日志文件:mkdir-p/data/node/touch/data/mongodb.log1.2安装mongodb:tarzxfmongodb-linux-x_-2.4.9.tgzmvmongodb-linux-x_-2.4.9/opt/mongodb

标签: mongodb 聚合

本文链接地址:https://www.jiuchutong.com/biancheng/312556.html 转载请保留说明!

上一篇:MongoDB中对文档的增删查改基本操作方法总结(mongodb 数据文件)

下一篇:mongodb+php实现简单的增删改查(mongodb用法)

  • 研发设备定义
  • 车船使用税2021
  • 国有企业投资方式
  • 什么是长期股权结构
  • 甲方也要跟项目走的吧
  • 房地产企业所得税预缴
  • 溢价发行债券的发行价格怎么计算的
  • 长期债券是指偿还期限超过几个月的债券
  • 施工企业增值税纳税地点
  • 无形资产撤资要交税吗
  • 服装批发零售交什么税
  • 金融企业三大使命是什么
  • 在建工程转固定资产当月提折旧吗?
  • 专项应付款现在叫什么
  • 开发人员选项怎么改定位
  • 公允价值变动损益转入其他业务成本
  • 物料买回来再发货可以吗
  • 预付款能开发票吗?
  • 软件开发公司研发主管绩效考核
  • 计提坏账准备的会计分录
  • 结转法定盈余公积会计分录怎么写
  • 如何禁止远程
  • 大白菜u盘启动后黑屏
  • 法人不缴纳社保员工可以缴纳吗怎么办
  • PHP:curl_reset()的用法_cURL函数
  • 委托外单位加工发出的材料会影响账面价值吗
  • 装机电源怎么装
  • php精彩编程200例
  • 看望员工生病的家属支付现金如何入账
  • 赔偿款财务如何做账
  • php pathinfo
  • linuxvim批量替换
  • 材料成本差异属于流动资产吗
  • php字符串包含某个字符串
  • 在项目进行过程中,一个开发人员
  • chattra
  • 2020年防洪基金计算公式
  • 固定资产的主要风险有哪些
  • 房屋出租怎么开电子发票
  • 增值税主要内容
  • 公司活动举办属于哪个部门
  • 预收款项可以开发票吗
  • 现金流量表为负数的几种原因
  • 设备维修三种形式
  • 子公司将股权转让给父公
  • 亏损做t计算方法
  • 协作费用
  • 基建待摊费用如何分摊
  • 连锁店的总部取名
  • 应付账款不需要付情况说明
  • 健身中心开的服装店
  • 财务费用的内容包括哪些
  • 捐赠利得计入资产成本吗
  • 工会经费的计提与缴纳
  • 一个基于口令的用户身份认证基本过程是怎样的?
  • mysql安装包和免安装的区别
  • mac怎么共享wifi密码给iphone
  • win7鼠标右键没有压缩文件
  • window web
  • mac安装mysql详细教程
  • 邮件远程控制
  • 重装系统前 病毒怎么办
  • xp系统怎么关闭更新系统
  • linux滚动更新是什么
  • centos怎么安装yum源
  • win8 64位触控版导致笔记本键盘失灵解决方法
  • win8.1使用教程
  • Linux CentOS系统下tomcat配置ssl教程
  • d命令怎么用
  • 基于jquery实现可定制的web在线富文本编辑器附源码下载
  • 不错的意思
  • vue的ssr渲染
  • unity fixed update
  • shell脚本生成文件
  • jquery foreach循环
  • js截取数组方法
  • 办理税控盘的流程
  • 安徽省滁州市税务局地址
  • 记账凭证编制的依据可以用
  • 江西国家税务局入围体检名单
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设