MongoDB(四)聚合

本文详细介绍了MongoDB中聚合操作的使用方法,包括如何通过$project进行字段选择、利用$group进行分组统计、结合$match进行条件筛选、运用$sort进行结果排序以及使用$limit限制返回数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚合aggregate
db.user.find();
{ "_id" : ObjectId("5835468f1fab7204b0cd4ed2"), "id" : 3, "username" : "lin3", "fullname" : "超级3", "gender" : 2, "classmate" : [ { "name" : "angel" } ] }
{ "_id" : ObjectId("5835481c1fab7208a4424d4c"), "id" : 4, "username" : "lin", "fullname" : "超级", "classmate" : [ { "name" : "cool" } ] }
将"username"从每个文档中投射出来,1表示需要到结果的字段,0则表示不需要
> db.user.aggregate({"$project":{"username":1}});
{ "_id" : ObjectId("5835468f1fab7204b0cd4ed2"), "username" : "lin3" }
{ "_id" : ObjectId("5835481c1fab7208a4424d4c"), "username" : "lin" }
投射不需要"id"字段
> db.user.aggregate({"$project":{"username":1,"_id":0}});
{ "username" : "lin3" }
{ "username" : "lin" }
{ "username" : "li" }
分组
db.user.find();
{ "_id" : ObjectId("5835468f1fab7204b0cd4ed2"), "id" : 3, "username" : "lin3", "fullname" : "超级3", "gender" : 2, "classmate" : [ { "name" : "angel" } ] }
{ "_id" : ObjectId("5835481c1fab7208a4424d4c"), "id" : 4, "username" : "lin", "fullname" : "超级", "classmate" : [ { "name" : "cool" } ], "gender" : 3 }
{ "_id" : ObjectId("583566521fab7215ec038034"), "id" : 5, "username" : "li", "fullname" : "超级", "gender" : 1 }
对"gender"字段分组,
> db.user.aggregate({"$group":{"_id":"$gender"}});
{ "_id" : 1 }
{ "_id" : 3 }
{ "_id" : 2 }
可使用$match进行条件筛选,筛选后再进行聚合操作,$match中可以使用find()查询的各种条件,如$gt,$lt,$gte,$glt等等,
一般$match是在前面,这样查询可以使用索引。
> db.user.aggregate({"$match":{"id":{"$gt":3}}},{"$group":{"_id":"$gender"}});
{ "_id" : 1 }
{ "_id" : 3 }
当然,如果需要对多个字段进行分组,可以这样
> db.user.aggregate({"$group":{"_id":{"gender":"$gender","username":"$username"}}});

在上面的基础上,对字段"gender"每出现一次就加1
db.user.aggregate({"$group":{"_id":"$gender","count":{"$sum":1}}});
{ "_id" : 1, "count" : 1 }
{ "_id" : 3, "count" : 1 }
{ "_id" : 2, "count" : 1 }

在上面的基础上进行排序,1表示升序,-1表示降序
db.user.aggregate({"$group":{"_id":"$gender","count":{"$sum":1}}},{"$sort":{"_id":1}});
{ "_id" : 1, "count" : 1 }
{ "_id" : 2, "count" : 1 }
{ "_id" : 3, "count" : 1 }

在上面的基础上,只查出前几条,用$limit
db.user.aggregate({"$group":{"_id":"$gender","count":{"$sum":1}}},{"$sort":{"_id":1}},{"$limit":2});
{ "_id" : 1, "count" : 1 }
{ "_id" : 2, "count" : 1 }

先投射出字段"gender",在投射子集上再进行$group,$sort,$limit操作
db.user.aggregate({"$project":{"gender":1}},{"$group":{"_id":"$gender","count":{"$sum":1}}},{"$sort":{"_id":1}},{"$limit":2});
{ "_id" : 1, "count" : 1 }

{ "_id" : 2, "count" : 1 }

..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值