【MongoDB学习笔记30】MongoDB的聚合框架

使用聚合框架可以对集合中的文档进行变换和组合。用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理。这些构件包括:

筛选(filtering)

投射(projecting)

分组(grouping)

排序(sorting)

限制(limiting)

跳过(skipping)

 

在MongoDB中实际的集合框架,需要将这些操作传给aggregate函数,例如:

(1)将文档的name字段投射出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> db.post.aggregate({$project:{ "name" :1}})   
"_id"  : ObjectId( "54a530c3ff0df3732bac1681" ),  "name"  "joe"  }    
"_id"  : ObjectId( "54a530c3ff0df3732bac1680" ),  "name"  "joe"  }    
"_id"  : ObjectId( "54a9700e1b5afd45354fd086" ) }    
"_id"  : ObjectId( "54a9701c1b5afd45354fd087" ) }    
"_id"  : ObjectId( "54a970281b5afd45354fd088" ) }    
"_id"  : ObjectId( "54a970351b5afd45354fd089" ) }    
"_id"  : ObjectId( "54a970781b5afd45354fd08a" ) }    
"_id"  : ObjectId( "54a970831b5afd45354fd08b" ) }    
"_id"  : ObjectId( "54a970901b5afd45354fd08c" ) }    
"_id"  : ObjectId( "54a9709c1b5afd45354fd08d" ) }    
"_id"  : ObjectId( "54aa8a90652d8bdfa0566d34" ) }    
"_id"  : ObjectId( "54aa97b894dcf31069b590ca" ) }    
"_id"  : ObjectId( "54aa97d794dcf31069b590cb" ) }    
"_id"  : ObjectId( "54aa97f294dcf31069b590cc" ) }    
"_id"  : ObjectId( "54aff7f43bd1048e7b585e39" ) }    
> db.post.aggregate({$project:{ "name" :1, "_id" :0}})    
"name"  "joe"  }    
"name"  "joe"  }

  可以看的出了find的用法类似;

 

(2)以name字段的值对其分组并计算其个数   

1
2
3
4
> db.post.aggregate({$group:{ "_id" : "$name" , "count" :{$ sum :1}}})    
"_id"  : null,  "count"  : 13 }    
"_id"  "joe" "count"  : 2 }    
>

   
(3)对结果集进行降序排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> db.post.aggregate({$ sort :{ "id" :-1}})   
"_id"  : ObjectId( "54aa97d794dcf31069b590cb" ),  "id"  : 13,  "fruit"  : [  "apple" "kumquat" "orange" "fruit01"  ] }    
"_id"  : ObjectId( "54aa97b894dcf31069b590ca" ),  "id"  : 12,  "fruit"  : [  "apple" "banana" "peach"  ] }    
"_id"  : ObjectId( "54aa8a90652d8bdfa0566d34" ),  "id"  : 11,  "test10"  : 11 }    
"_id"  : ObjectId( "54a9709c1b5afd45354fd08d" ),  "id"  : 10,  "test10"  : 10 }    
"_id"  : ObjectId( "54a970901b5afd45354fd08c" ),  "id"  : 9,  "test9"  : 9 }    
"_id"  : ObjectId( "54a970831b5afd45354fd08b" ),  "id"  : 8,  "test8"  : 8 }    
"_id"  : ObjectId( "54a970781b5afd45354fd08a" ),  "id"  : 7,  "test7"  : 7 }    
"_id"  : ObjectId( "54a970351b5afd45354fd089" ),  "id"  : 6,  "test6"  : 6 }    
"_id"  : ObjectId( "54a970281b5afd45354fd088" ),  "id"  : 5,  "test5"  : 5 }    
"_id"  : ObjectId( "54a9701c1b5afd45354fd087" ),  "id"  : 4,  "test4"  : 4 }    
"_id"  : ObjectId( "54a9700e1b5afd45354fd086" ),  "id"  : 3,  "test3"  : 3 }    
"_id"  : ObjectId( "54a530c3ff0df3732bac1681" ),  "id"  : 2,  "name"  "joe" "age"  : 30,  "sex"  : 1,  "school"  "marry"  }    
"_id"  : ObjectId( "54a530c3ff0df3732bac1680" ),  "id"  : 1,  "name"  "joe" "age"  : 30,  "comments"  : [  "test2" "test9" "test5"  ],  "sex"  : 1,  "school"  "marry"  }    
"_id"  : ObjectId( "54aa97f294dcf31069b590cc" ),  "push"  : {  "fruit"  "fruit01"  } }    
"_id"  : ObjectId( "54aff7f43bd1048e7b585e39" ),  "username"  "sid" "loc"  : {  "ip"  "1.2.3.4" "city"  "springfield" "state"  "ny"  } }    
>

 

(4)限制显示排序后的前5个结果

1
2
3
4
5
6
7
> db.post.aggregate({$ sort :{ "id" :-1}},{$limit:5})   
"_id"  : ObjectId( "54aa97d794dcf31069b590cb" ),  "id"  : 13,  "fruit"  : [  "apple" "kumquat" "orange" "fruit01"  ] }    
"_id"  : ObjectId( "54aa97b894dcf31069b590ca" ),  "id"  : 12,  "fruit"  : [  "apple" "banana" "peach"  ] }    
"_id"  : ObjectId( "54aa8a90652d8bdfa0566d34" ),  "id"  : 11,  "test10"  : 11 }    
"_id"  : ObjectId( "54a9709c1b5afd45354fd08d" ),  "id"  : 10,  "test10"  : 10 }    
"_id"  : ObjectId( "54a970901b5afd45354fd08c" ),  "id"  : 9,  "test9"  : 9 }    
>

 

聚合框架类似关系行数据库中的select,不会对集合进行写入操作,结果只会返回给客户端。





本文转自 bannerpei 51CTO博客,原文链接:http://blog.51cto.com/281816327/1604102,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值