Centos系统下载大全 | Redhat系统下载大全 | Windows2012系统下载大全 | Windows2008系统下载大全| CMS教程 | 网站地图 51运维网-专注Linux/Unix系统安全运维!
当前位置:51运维网 > 数据库 > MariaDB > 正文

MongoDB 聚合

时间:2014-07-26 20:46 来源:未知 作者:www.51ou.com 阅读:

聚合操作过程中的数据记录和计算结果返回。聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果。在SQL COUNT(*)和group by 相当于MongoDB的聚集。

aggregate() 方法

对于在MongoDB中聚集,应该使用aggregate()方法。 

语法:

aggregate() 方法的基本语法如下

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)  

例子:

在集合中,有以下的数据: 51ou.com

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: '51ou point',
   url: 'http://www.51ou.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: '51ou point',
   url: 'http://www.51ou.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},  

现在从上面的集合,如果想显示一个列表,有很多用户写的教程,那么使用 aggregate() 方法,如下所示:

> db.mycol.aggregate([{$group :
 {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "51ou point",
         "num_tutorial" : 2
      },
      {
         "_id" : "51ou point",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>  

上述使用的情况相当于SQL查询 select by_user, count(*) from mycol group by by_user

在上面的例子中,我们已分组字段 by_user 文档,并在每个的次数by_user先前的值总和递增。没有聚集表达式列表。 

表达式 描述 实例
$sum 总结从集合中的所有文件所定义的值. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 从所有文档集合中所有给定值计算的平均. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 获取集合中的所有文件中的相应值最小. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 获取集合中的所有文件中的相应值的最大. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 值插入到一个数组生成文档中. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 值插入到一个数组中所得到的文档,但不会创建重复. db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根据分组从源文档中获取的第一个文档。通常情况下,这才有意义,连同以前的一些应用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根据分组从源文档中获取最后的文档。通常,这才有意义,连同以前的一些应用 “$sort”-stage. db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道概念

在UNIX 命令 shell 管道是指一些输入和输出作为输入下一个命令等执行操作的可能性。 MongoDB 聚合框架也支持同样的概念。有一组可能的阶段,每个这些的一组文档作为输入,并产生一个结果集的文件(或最终生成的JSON文档在管道末端)。然后又再次被用来为下一阶段等。 

可能的阶段聚合框架如下: www.51ou.com

  • $project: 用于选择从收集的一些具体字段。
  • $match: 这是一个滤波操作,因此可以减少量,作为下一阶段的输入给定的文档。
  • $group: 如上所讨论的,这不实际的聚合。
  • $sort: 文件排序。
  • $skip: 与此有可能向前跳过的文件列表中的一个给定的的文档数量。
  • $limit: 这限制了的文档数量看一下由从当前位置开始的给定数
  • $unwind: 这是用来平仓文档的中使用数组。使用数组时,数据是一种pre-joinded,再次有个别文件,此操作将被取消。因此,这个阶段,数量会增加文件的下一阶段。

感谢您对【51运维网 http://www.51ou.com/】的支持,我们为您免费提供《MongoDB 聚合》技术文章,《MongoDB 聚合》详细使用和说明,有时《MongoDB 聚合》可能不完善、敬请谅解!如果《MongoDB 聚合》有错误请给我们留言,我们将尽快修复文章错误,如果您觉得本站不错,请分享给周围的朋友!谢谢!

顶一下
(0)
0%
踩一下
(0)
0%
上一篇:MongoDB 索引
下一篇:MongoDB 复制
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
验证码:点击我更换图片