资讯专栏INFORMATION COLUMN

MongoDB:aggregate与aggregateCursor

goji / 452人阅读

摘要:环境使用可以实现较为复杂的数据聚合操作,例如汇总去重汇总分组统计等。返回结果为数组,需要注意数据大小不能超过。的返回结果为游标,可循环取数。

环境
mongos 3.0.14
aggregate

使用 aggregate 可以实现较为复杂的数据聚合操作,例如 汇总(count)、去重汇总(distinct count)、分组统计(group having)等。

aggregate 返回结果为数组,需要注意数据大小不能超过16M。

例如:

$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id" => ["user_id"=>"$user_id"]
            ]],
            ["$group" => [
                "_id" => "_id.user_id",
                "number" => ["$sum"=>1]
            ]]
        ];
$options = [
        "allowDiskUse"=>true,
        "cursor"=>["batchSize"=>1]
];
        $data = MongoSvc::get("user")->user_info->aggregate($pipeline,$options);
aggregateCursor

对于大量返回结果的聚合,可以使用 aggregateCursor 返回游标,可以避免数据大小超限。

aggregateCursor 的返回结果为游标,可循环取数。

例如:

$pipeline = [
            ["$match" => $matchArr],
            ["$project" => ["id"=>1,"_id"=>0]],
            ["$group" => [
                "_id" => "$id",
                "count" => ["$sum" => 1]
            ]],
            ["$match" => [
                "count" => ["$gt" => 1]
            ]]
        ];
        //这里改为aggregateCursor用游标循环获取
        $data = MongoSvc::get("user")->user_info->aggregateCursor($pipeline);
pipeline 参数

$match
条件匹配。

$addFields
增加新字段。

$count
该stage的文档总数。

$group
分组。

$limit
限制数量。

$skip
跳步。

$sort
排序。

$out
输出结果到集合。

$project
过滤字段。

https://docs.mongodb.com/manu...

options 参数

explain boolean
处理信息。

allowDiskUse boolean
true 可往磁盘写临时数据。

cursor
cursor: { batchSize: }
给返回集合设置一个初始大小。

hint string or document
强制指定索引。

https://docs.mongodb.com/manu...

查询示例

汇总统计文档中某个字段(如"sum")的count值:

$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id" => ["sum"],
                "sum_value" => ["$sum" => "$money"]
            ]]
        ];

某列的去重后的数据:

$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id" => ["user_id" => "$user_id"]
            ]]
        ];

统计某列(如"user_id")去重后的count值:

$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id" => ["user_id"=>"$user_id"]
            ]],
            ["$group" => [
                "_id" => "_id.user_id",
                "number" => ["$sum"=>1]
            ]]
        ];
        
$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id"        => ["qid" => "$qid"],
                "max_number" => ["$max" => "$days"] 
            ]],
            ["$group" => [
                "_id" => ["number" => "$max_number"],
                "total" => ["$sum" => 1]
            ]]
        ];

统计分组后,各组内的某列汇总值:

$pipeline = [
            ["$match" => $tmpCondition],
            ["$group" => [
                "_id" => ["type" => "$type"],
                "sum_value" => ["$sum" => "$number"]
            ]]
        ];

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19329.html

相关文章

  • mongoDB原生查询spring data mongoDB的映射

    摘要:一按照等条件组合查询,同时添加和原生二执行操作,更新单个文档原生三通过命令更新文档并且返回更新之后的文档只能作用于单个文档原生四聚合操作根据某一字段,并且将文档中的某一字段合并到数组中,最后取数组中的第一个元素原生五数组查询,在某个中包 一、按照in、eq、lte等条件组合查询,同时添加sort和limit1、原生 db.message.find( { receiverRol...

    ziwenxie 评论0 收藏0
  • MongoDB管道操作符(二)

    摘要:上篇文章中我们已经学习了中几个基本的管道操作符,本文我们再来看看其他的管道操作符。算术操作符通过算术操作符我们可以对分组后的文档进行求和或者求平均数。好了,中的管道操作符我们就先说到这里,小伙伴们有问题欢迎留言讨论。 上篇文章中我们已经学习了MongoDB中几个基本的管道操作符,本文我们再来看看其他的管道操作符。 本文是MongoDB系列的第十三篇文章,了解前面的文章有助于更好的理...

    张率功 评论0 收藏0
  • MongoDB优化之倒排索引

    摘要:简单地说,倒排索引就是把与对调之后的索引,构建倒排索引的目的是提升搜索性能。本文将介绍中两种构建倒排索引的方法与。 摘要: 为MongoDB中的数据构建倒排索引(Inverted Index),然后缓存到内存中,可以大幅提升搜索性能。本文将通过为电影数据构建演员索引,介绍两种构建倒排索引的方法:MapReduce和Aggregation Pipeline。 GitHub地址: 作者:...

    Nino 评论0 收藏0
  • MongoDB指南---16、聚合

    摘要:将返回结果限制为前个。所以,聚合的结果必须要限制在以内支持的最大响应消息大小。包含字段和排除字段的规则与常规查询中的语法一致。改变字符大小写的操作,只保证对罗马字符有效。只对罗马字符组成的字符串有效。 上一篇文章:MongoDB指南---15、特殊的索引和集合:地理空间索引、使用GridFS存储文件下一篇文章:MongoDB指南---17、MapReduce 如果你有数据存储在Mon...

    Keagan 评论0 收藏0
  • MongoDB指南---16、聚合

    摘要:将返回结果限制为前个。所以,聚合的结果必须要限制在以内支持的最大响应消息大小。包含字段和排除字段的规则与常规查询中的语法一致。改变字符大小写的操作,只保证对罗马字符有效。只对罗马字符组成的字符串有效。 上一篇文章:MongoDB指南---15、特殊的索引和集合:地理空间索引、使用GridFS存储文件下一篇文章:MongoDB指南---17、MapReduce 如果你有数据存储在Mon...

    _Zhao 评论0 收藏0

发表评论

0条评论

goji

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<