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用来实现对文档的拆分,可以将文档中的值拆分为单独的文档,比如我的数据如下:
{ "_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的效率低,要慎用。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。