热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在MongoDB数据库中使用聚合工具

1.countcount返回集合中的文档数量db.refactor.count()不管集合有多大,都能很快的返回文档数量.可以传递查询,MongoDB会计算查询结果的数量db.refactor.count({username:refactor})但是增加查询条件会使count变慢.2.distinctdistinct用
1.count
count返回集合中的文档数量
db.refactor.count() 
不管集合有多大,都能很快的返回文档数量.
可以传递查询,MongoDB会计算查询结果的数量
db.refactor.count({"username":"refactor"}) 
但是增加查询条件会使count变慢.

2.distinct
distinct用来找出给定键的所有不同值.使用时必须指定集合和键.
如:
db.runCommand({"distinct":"refactor","key":"username"}) 


3.group
group先选定分组所依据的键,MongoDB将会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,
产生一个结果文档.
如:
db.runCommand( 

"group": 

"ns":"refactor", 
"key":{"username":true}, 
"initial":{"count":0}, 
"$reduce":function(doc,prev) 

prev.count++; 
}, 
"condition":{"age":{"$gt":40}} 



 "ns":"refactor",
指定要进行分组的集合
    "key":{"username":true},
指定文档分组的依据,这里是username键,所有username键的值相等的被划分到一组,true为返回键username的值
    "initial":{"count":0},
每一组reduce函数调用的初始个数.每一组的所有成员都会使用这个累加器.
    "$reduce":function(doc,prev){...}
每个文档都对应的调用一次.系统会传递两个参数:当前文档和累加器文档.
"condition":{"age":{"$gt":40}} 
这个age的值大于40的条件

4.使用完成器
完成器用于精简从数据库传到用户的数据.group命令的输出一定要能放在单个数据库相应中.
"finalize"附带一个函数,在数组结果传递到客户端之前被调用一次.
db.runCommand( 

"group": 

"ns":"refactor", 
"key":{"username":true}, 
"initial":{"count":0}, 
"$reduce":function(doc,prev) 

prev.count++; 
}, 
"finalize":function(doc) 

doc.num=doc.count; 
delete doc.count; 




finalize能修改传递的参数也能返回新值.

5.将数组作为键使用
有些时候分组所依据的条件很复杂,不仅是一个键.比如要使用group计算每个类别有多篇博客文章.由于有很多作者,
给文章分类时可能不规律的使用了大小写.所以,如果要是按类别名来分组,最后"MongoDB"和"mongodb"就是不同的组.
为了消除这种大小写的影响,就要定义一个函数来确定文档所依据的键.
定义分组要用到$keyf
db.runCommand( 
 { 
  "group": 
   { 
    "ns":"refactor", 
    "$keyf":function(doc){return {"username":doc.username.toLowerCase()}}, 
    "initial":{"count":0}, 
    "$reduce":function(doc,prev) 
       { 
        prev.count++; 
       } 
   } 
 } 

6.MapReduce
count,distinct,group能做的事情MapReduce都能做.它是一个可以轻松并行化到多个服务器的聚合方法.它会
拆分问题,再将各个部分发送到不同机器上,让每台机器完成一部分.当所有机器都完成时候,再把结果汇集起来形成
最终完整的结果.
MapReduce需要几个步骤:
1.映射,将操作映射到集合中的每个文档.这个操作要么什么都不做,要么 产生一个键和n个值.
2.洗牌,按照键分组,并将产生的键值组成列表放到对应键中.
3.化简,把列表中的值 化简 成一个单值,这个值被返回.
4.重新洗牌,直到每个键的列表只有一个值为止,这个值就是最终结果.
MapReduce的速度比group慢,group也很慢.在应用程序中,最好不要用MapReduce,可以在后台运行MapReduce
创建一个保存结果的集合,可以对这个集合进行实时查询.

找出集合中的所有键
MongoDB没有模式,所以并不知晓每个文档有多少个键.通常找到集合的所有键的做好方式是用MapReduce.
在映射阶段,想得到文档中的每个键.map函数使用emit 返回要处理的值.emit会给MapReduce一个键和一个值.
这里用emit将文档某个键的记数(count)返回({count:1}).我们为每个键单独记数,所以为文档中的每一个键调用一次emit,
this是当前文档的引用:
map=function(){ 
for(var key in this) 

emit(key,{count:1}) 

}; 
这样返回了许许多多的{count:1}文档,每一个都与集合中的一个键相关.这种有一个或多个{count:1}文档组成的数组,
会传递给reduce函数.reduce函数有两个参数,一个是key,也就是emit返回的第一个值,另一个参数是数组,由一个或者多个
对应键的{count:1}文档组成.
reduce=function(key,emits){ 
total=0; 
for(var i in emits){ 
total+=emits[i].count;  

return {count:total}; 

reduce要能被反复被调用,不论是映射环节还是前一个化简环节.reduce返回的文档必须能作为reduce的
第二个参数的一个元素.如x键映射到了3个文档{"count":1,id:1},{"count":1,id:2},{"count":1,id:3}
其中id键用于区别.MongoDB可能这样调用reduce:
>r1=reduce("x",[{"count":1,id:1},{"count":1,id:2}]) 
{count:2} 
>r2=reduce("x",[{"count":1,id:3}]) 
{count:1} 
>reduce("x",[r1,r2]) 
{count:3} 
reduce应该能处理emit文档和其他reduce结果的各种集合.
如:
mr=db.runCommand( 

"mapreduce":"refactor", 
"map":map, 
"reduce":reduce, 
"out":{inline:1} 


或:
db.refactor.mapReduce(map,reduce,{out:{inline:1}})

"timeMillis" : 5,//操作花费的时间
"counts" : {
"input" : 10,//发往到map函数的文档个数
"emit" : 40,//在map函数中emit被调用的次数
"reduce" : 4,//在map函数中reduce被调用的次数
"output" : 4//结果集合中创建的文档数量.
},
1.mapreduce是根据map函数里调用的emit函数的第一个参数来进行分组的
2.仅当根据分组键分组后一个键匹配多个文档,才会将key和文档集合交由reduce函数处理
注意MongoDB 1.8版本以上,必须指明 out 参数
否则会报如下错误:
"assertion" : "'out' has to be a string or an object",
"assertionCode" : 13606,

MapReduce中的其他键
mapreduce,map,reduce这三个键是必须的,MapReduce命令还有其他的可选键
finalize:函数
将reduce的结果发送给这个键,这是处理过程的最后一步
keeptemp:布尔值
连接关闭时,临时结果是否保存
output:字符串
结果集合的名字,设定该项则隐含着keeptemp:true
query:文档
会在发往map函数前,先用指定条件过滤文档
sort:文档
会在发往map函数前先给文档排序
limit:整数
发往map函数文档的最大数量
scope:文档
Javascript代码中要用到的变量
verbose:布尔值
是否产生更加信息的服务器日志 

推荐阅读
  • MongoDB核心概念详解
    本文介绍了NoSQL数据库的概念及其应用场景,重点解析了MongoDB的基本特性、数据结构以及常用操作。MongoDB是一个高性能、高可用且易于扩展的文档数据库系统。 ... [详细]
  • 本文介绍了如何使用Node.js通过两种不同的方法连接MongoDB数据库,包括使用MongoClient对象和连接字符串的方法。每种方法都有其特点和适用场景,适合不同需求的开发者。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • MongoDB高可用架构:深入解析Replica Set机制
    MongoDB的高可用架构主要依赖于其Replica Set机制。Replica Set通过多个mongod节点的协同工作,实现了数据的冗余存储和故障自动切换,确保了系统的高可用性和数据的一致性。本文将深入解析Replica Set的工作原理及其在实际应用中的配置和优化方法,帮助读者更好地理解和实施MongoDB的高可用架构。 ... [详细]
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 提升MySQL数据库架构性能的策略与方法
    为了提升MySQL数据库架构的性能,本文探讨了多种策略与方法。首先,分析了影响数据库性能的关键因素,并详细阐述了数据库结构优化的重要性。接着,介绍了数据库设计的基本步骤,包括第一、第二和第三范式的应用,以及反范式化设计的场景。此外,还讨论了数据库物理设计的关键要素,如表定义、索引设计和存储引擎选择,以确保高效的查询响应和数据管理。 ... [详细]
  • Fiddler 安装与配置指南
    本文详细介绍了Fiddler的安装步骤及配置方法,旨在帮助用户顺利抓取用户Token。文章还涵盖了一些常见问题的解决方案,以确保安装过程顺利。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文介绍了如何通过命令行有效地终止所有 Node.js 进程实例,以解决因端口冲突或其他服务冲突导致的问题。 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 了解多域名SAN SSL证书及其工作原理
    本文介绍了多域名SAN SSL证书的概念及其工作方式,探讨其在现代网络安全中的重要性和应用。 ... [详细]
author-avatar
哎哟不错哦凉皮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有