资讯专栏INFORMATION COLUMN

MongoDB管道操作符(二)

张率功 / 1975人阅读

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

上篇文章中我们已经学习了MongoDB中几个基本的管道操作符,本文我们再来看看其他的管道操作符。

本文是MongoDB系列的第十三篇文章,了解前面的文章有助于更好的理解本文:


1.Linux上安装MongoDB
2.MongoDB基本操作
3.MongoDB数据类型
4.MongoDB文档更新操作
5.MongoDB文档查询操作(一)
6.MongoDB文档查询操作(二)
7.MongoDB文档查询操作(三)
8.MongoDB查看执行计划
9.初识MongoDB中的索引
10.MongoDB中各种类型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)


$group 基本操作

$group可以用来对文档进行分组,比如我想将订单按照城市进行分组,并统计出每个城市的订单数量:

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

我们将要分组的字段传递给$group函数的_id字段,然后每当查到一个,就给count加1,这样就可以统计出每个城市的订单数量。

算术操作符

通过算术操作符我们可以对分组后的文档进行求和或者求平均数。比如我想计算每个城市订单运费总和,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",totalFreight:{$sum:"$freight"}}})

先按地址分组,再求和。这里贴出部分查询结果,如下:

{
    "_id" : "HaiKou",
    "totalFreight" : 20.0
}
{
    "_id" : "HangZhou",
    "totalFreight" : 10.0
}

也可以计算每个城市运费的平均数,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",avgFreight:{$avg:"$freight"}}})

先按地址分组,然后再计算平均数。

极值操作符

极值操作符用来获取分组后数据集的边缘值,比如获取每个城市最贵的运费,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",maxFreight:{$max:"$freight"}}})

查询每个城市最便宜的运费:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",minFreight:{$min:"$freight"}}})

按城市分组之后,获取该城市第一个运费单:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",firstFreight:{$first:"$freight"}}})

获取分组后的最后一个运费单:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",lastFreight:{$last:"$freight"}}})
数据操作符

$addToSet可以将分组后的某一个字段放到一个数组中,但是重复的元素将只出现一次,而且元素加入到数组中的顺序是无规律的,比如将分组后的每个城市的运费放到一个数组中,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$addToSet:"$freight"}}})

重复的freight将不会被添加进来。

$push则对重复的数据不做限制,都可以添加进来,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$push:"$freight"}}})
$unwind

$unwind用来实现对文档的拆分,可以将文档中的值拆分为多带带的文档,比如我的数据如下:

{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "鲁迅",
    "books" : [ 
        {
            "name" : "呐喊",
            "publisher" : "花城出版社"
        }, 
        {
            "name" : "彷徨",
            "publisher" : "南海出版出"
        }
    ]
}

使用$unwind命令将其拆分为独立文档,如下:

db.sang_books.aggregate({$unwind:"$books"})

拆分结果如下:

{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "鲁迅",
    "books" : {
        "name" : "呐喊",
        "publisher" : "花城出版社"
    }
}
{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "鲁迅",
    "books" : {
        "name" : "彷徨",
        "publisher" : "南海出版出"
    }
}
其他操作符

$sort操作可以对文档进行排序,如下:

db.sang_collect.aggregate({$sort:{orderAddressL:1}})

用法和我们之前介绍普通搜索中的一致,可以按照存在的字段排序,也可以按照重命名的字段排序,如下:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$sort:{oa:-1}})

1表示升序、-1表示降序。

$limit返回结果中的前n个文档,如下表示返回结果中的前三个文档:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$limit:3})

$skip表示跳过前n个文档,比如跳过前5个文档,如下:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$skip:5})

$skip的效率低,要慎用。

总结

在管道开始执行的阶段尽可能过滤掉足够多的数据,这样做有两个好处:1.只有从集合中直接查询时才会使用索引,尽早执行过滤可以让索引发挥作用;2.该过滤的数据过滤掉之后,也可以降低后面管道的执行压力。另外,MongoDB不允许一个聚合操作占用过多的内存,如果有一个聚合操作占用了超过20%的内存,则会直接报错。

好了,MongoDB中的管道操作符我们就先说到这里,小伙伴们有问题欢迎留言讨论。

参考资料:

1.《MongoDB权威指南第2版》

更多资料请关注公众号:

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

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

相关文章

  • mongoDB查询进阶】聚合管道(四) -- 累加器(Accumulators)

    摘要:累加器累加器本来只能使用与下,但是版本或以上,部分累加器还能使用于。当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用。 回顾 相关文章回顾 mongoDB查询进阶--聚合管道(一)回顾mongoDB查询进阶--聚合管道(二)回顾mongoDB查询进阶--聚合管道(三)回顾 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(Stage Oper...

    tomato 评论0 收藏0
  • mongoDB查询进阶】聚合管道(四) -- 累加器(Accumulators)

    摘要:累加器累加器本来只能使用与下,但是版本或以上,部分累加器还能使用于。当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用。 回顾 相关文章回顾 mongoDB查询进阶--聚合管道(一)回顾mongoDB查询进阶--聚合管道(二)回顾mongoDB查询进阶--聚合管道(三)回顾 管道操作符的分类 管道操作符可以分为三类: 阶段操作符(Stage Oper...

    wmui 评论0 收藏0
  • mongoDB查询进阶】聚合管道() -- 阶段作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    brianway 评论0 收藏0
  • mongoDB查询进阶】聚合管道() -- 阶段作符

    摘要:当在中使用时,累加器是针对每个分组使用的当在中使用时,累加器则是针对每个字面量起作用,具体用法下一篇文章阐述。另外再加以配合表达式操作符组成的表达式或者在或中使用累加器能查询统计的内容会更加的多样化。 上篇最后说到管道操作符,本篇文章将详细说一下管道操作符。 mongoDB查询进阶--聚合管道(一)回顾 什么是管道操作符(Aggregation Pipeline Operators) ...

    flybywind 评论0 收藏0
  • 手把手教你 MongoDB 的安装与详细使用(

    摘要:实例教程是一个数据库搜云库教程专注于开发技术的研究与知识分享方法中你也可以设置使用多个字段创建索引关系型数据库中称作复合索引。 上一篇文章练习了,MongoDB 的以下操作 安装 MongoDB 服务 连接 MongoDB MongoDB 创建数据库 MongoDB 删除数据库 MongoDB 插入文档 MongoDB 删除文档 MongoDB 查询文档 MongoDB AND 条件...

    jayzou 评论0 收藏0

发表评论

0条评论

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