`
cooler1217
  • 浏览: 374051 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

mongo mapreduce 聚合查询

 
阅读更多
MongoDB---聚合简析

MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数,
复杂的可利用MapReduce做复杂数据分析.
   www.2cto.com 
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将会将集合依据选定键值的不同分成若干组.然后可以通过聚合每一组内的文档,
产生一个结果文档.
如:  www.2cto.com 
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的值  www.2cto.com 
    "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能修改传递的参数也能返回新值.
   www.2cto.com 
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都能做.它是一个可以轻松并行化到多个服务器的聚合方法.它会  www.2cto.com 
拆分问题,再将各个部分发送到不同机器上,让每台机器完成一部分.当所有机器都完成时候,再把结果汇集起来形成
最终完整的结果.
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})
  }
};  www.2cto.com 
这样返回了许许多多的{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}
  }
)  www.2cto.com 
或:
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:文档  www.2cto.com 
会在发往map函数前,先用指定条件过滤文档
sort:文档
会在发往map函数前先给文档排序
limit:整数
发往map函数文档的最大数量
scope:文档
javascript代码中要用到的变量
verbose:布尔值
是否产生更加信息的服务器日志


作者 refactor
分享到:
评论

相关推荐

    MongoDB中MapReduce的使用方法详解

    运行MapReduce操作并查询结果: ```javascript var options = {out: "totalAuthorPrice"}; db.sang_books.mapReduce(map, reduce, options); db.totalAuthorPrice.find(); ``` 这样,我们就可以在`...

    nosql-compare:nosql mapreduce,聚合比较

    2. 操作方式:NoSQL数据库通常提供API或查询语言进行数据操作,如MongoDB的MongoShell或CQL(Cassandra查询语言);MapReduce则需要编写Map和Reduce函数,通常用Java或JavaScript实现,执行过程相对复杂。 3. 扩展...

    mongo 数据库工具

    用户可以直接在界面上执行查询和更新操作,支持复杂的聚合框架和MapReduce任务。 4. **文档管理**:MongoVUE提供了文档编辑器,可以查看、添加、修改和删除单个文档。其内置的JSON格式化功能有助于用户理解文档结构...

    mongo学习和操作手册

    MongoDB提供了丰富的查询语法,包括基本查询、条件查询、投影查询和聚合操作。例如,使用"$gt"、"$lt"可以查询数值范围,"$regex"可用于模糊匹配字符串。更新文档则可以使用updateOne或updateMany方法,结合$set、$...

    MongoDB聚合分组取第一条记录的案例与实现方法

    对于大数据集,考虑优化数据结构、索引设计以及使用更高效的处理方式(如MapReduce或在应用程序层面处理)可能会更合适。 总结起来,MongoDB的聚合框架在处理复杂的数据分析任务时提供了强大功能,但在这个特定场景...

    mongo db demo

    1. MapReduce:用于大数据处理和分析,通过映射(map)函数和减少(reduce)函数实现数据聚合。 2. GridFS:用于存储和检索大型文件,将文件分割为多个块存储在MongoDB中。 3. TTL索引:可以设置文档过期时间,自动...

    mysql-mongo-for-mysql-dba-webinar.zip

    - MongoDB的查询语言:虽然也支持部分SQL语法,但更倾向于JSON风格,提供了强大的聚合框架和MapReduce功能。 5. **弹性与扩展性**: - MySQL的水平扩展通常通过复制和分区实现,而MongoDB天生支持水平扩展,通过...

    非关系型数据库实验.docx

    四、MapReduce聚合运算 MapReduce是一种分布式计算模型,常用于大数据处理和分析。在MongoDB中,可以利用MapReduce函数进行聚合操作。 1. 数据导入:将地震数据导入到dizhen集合中。 2. 定义Map函数:映射数据,...

    Mongodb入门教程、示例+Spring Boot完整示例+聚合.docx

    5. Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。 6. MongoDB 使用 update() 命令可以实现替换完成的文档(数据)或者一些指定的数据字段。 7. Mongodb 中的 Map/...

    mongo集群说明文档加补充

    8. **大数据处理**:MongoDB 的大数据处理能力得益于其强大的聚合框架和MapReduce功能,允许进行复杂的分析操作。 9. **备份与恢复**:MongoDB 提供了多种备份和恢复选项,如oplog tailing、mongodump/mongorestore...

    mongodb基础语句大全

    MongoDB支持MapReduce函数,用于处理大数据分析,通过映射(map)和化简(reduce)过程对数据进行聚合计算。 以上只是MongoDB基础操作的一部分,实际使用中还有许多其他高级特性和用法,如聚合框架、索引、GridFS...

    mongo开发指南

    - Map/Reduce操作:MongoDB提供了Map/Reduce功能,可用于数据处理和聚合查询。 - GridFS:MongoDB的GridFS用于存储大文件,支持文件的上传和下载。 - 脚本执行:MongoDB支持服务器端脚本执行,可以使用JavaScript...

    Hadoop&MongoDB;学习资料

    5. **聚合框架**:学习使用聚合管道进行复杂的数据分析和报告生成。 6. **MongoDB工具**:熟悉Mongo shell、MongoDB Compass(图形化界面)和其他管理工具的使用。 7. **副本集和分片**:理解副本集的概念,实现高...

    MongoClass:蒙哥班

    10. 高级话题:可能还会涉及到地理空间索引、TTL索引、聚合框架、MapReduce等进阶主题。 MongoClass项目很可能包含一系列教程、示例代码和练习,帮助你逐步掌握MongoDB在JavaScript环境中的应用。通过这个课程,...

    MongoDB期末考试测试题

    这份期末考试测试题旨在帮助学生巩固MongoDB的相关知识,包括数据库管理、数据操作、查询语法、索引优化等核心概念。 1. 数据库创建与数据插入: 在MongoDB中,可以使用`use`命令切换到特定的数据库,如`xsgl`,...

    mongodb一些笔记

    MongoDB的查询语法类似JavaScript,支持丰富的查询表达式和条件。例如,使用`$gt`, `$lt`, `$eq`等比较运算符,以及`$exists`, `$in`, `$all`等逻辑运算符进行复杂查询。 4. 复合索引: 索引是提高查询性能的关键...

    Mongo_On_Web

    6. MapReduce 和聚合框架:MongoDB 提供了 MapReduce 功能,用于处理大数据并执行复杂分析。同时,聚合框架提供了一种更直观的方式来组合查询,进行数据汇总和分析。 7. 安全性:MongoDB 提供了认证、授权和加密等...

    浅析mongodb中group分组

    - MapReduce是另一种强大的聚合工具,它将数据处理分为映射(map)和化简(reduce)两个阶段,更适合大规模数据处理。与`group`相比,MapReduce允许更复杂的计算和分布式处理,但使用起来也更为复杂。 总的来说,...

Global site tag (gtag.js) - Google Analytics