ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mongoDB聚合操作(学习笔记)

2022-07-01 17:31:06  阅读:144  来源: 互联网

标签:count 聚合 mongoDB 笔记 文档 aggregate group id


mongoDB中的聚合是什么

聚合(aggregate)是MongoDB的高级查询语言,它允许我们通过转化合并多个文档的数据来生成新的在单个文档里不存在的文档信息,MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果,有点类似sql语句中的 count(*)。

聚合是基于数据处理的聚合管道,每个文档通过一个由多个阶段组成的管道,可以对每个阶段的管道进行分组、过滤等数据处理,输出相应的结果。

语法

MongoDB中聚合的方法使用aggregate()。

db.集合名.aggregate({管道:{表达式}})

常用管道命令

命令 描述
$project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
\$match 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit 用来限制MongoDB聚合管道返回的文档数。
$skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group 将集合中的文档分组,可用于统计结果。
$sort 将输入文档排序后输出。
$geoNear :输出接近某一地理位置的有序文档。

常用表达式

$group 用法

db.col.aggregate(
    {$group:{_id:"$orderId",count:{$sum:1}}}
)

其中:

  • _id 表示分组的依据,按照哪个字段进行分组,需要使用$orderId表示选择这个字段进行分组
  • \$ sum:1 表示把每条数据作为1进行统计,统计的是该分组下面数据的条数;也可以使用"$quantity",将quantity字段中的数字进行统计
  • 当_id为null时表示不指定分组的字段,$group会将所有文档分为一组进行统计。

将所有文档中的name的值并放在一个数组中

# 示例:
db.col.aggregate(
    {$group:{_id:null, name:{$push:"$name"}}}
)

# 结果:
{"_id" : null, "name" : ["a", "b", "c", "da", "ea"]}

连续使用\$ group时,在后一个\$ group中使用\$ _id.country获取前一个\$ group查询结果中的country字段

db.col.aggregate(
  {$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},
  {$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}}
)

$match 用法

$match用于进行数据的过滤,是在能够在聚合操作中使用的命令,作用类似于find。

db.col.aggregate(
  {$match:{userid:"a"}}
)

$project 用法

$project用于修改文档的输入输出结构,例如重命名,增加,删除字段

db.col.aggregate(
    {$group:{_id:"$orderId", count:{$sum:1}}},
    {$project:{_id:0, count:1, flag:"flag"}}
)

\$ sort 、$ skip 和 \$limit 用法

  • $sort用于将输入的文档排序后输出,-1为降序,1为升序
  • $limit限制返回数据的条数
  • $skip 跳过指定的文档数,并返回剩下的文档数
    同时使用时先使用skip在使用limit
# 通过userid分组统计,按count进行升序排序,从第二条开始取一条数据返回
db.col.aggregate(
    {$group:{_id:"$userid", count:{$sum:1}}},
    {$sort:{count:1}},
    {$skip:1},
    {$limit:1}
)

标签:count,聚合,mongoDB,笔记,文档,aggregate,group,id
来源: https://www.cnblogs.com/wangzhebin/p/16435365.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有