Go教程

mongoDB聚合操作(学习笔记)

本文主要是介绍mongoDB聚合操作(学习笔记),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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}
)
这篇关于mongoDB聚合操作(学习笔记)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!