聚合aggregate
一般$match是在前面,这样查询可以使用索引。
在上面的基础上,对字段"gender"每出现一次就加1
在上面的基础上进行排序,1表示升序,-1表示降序
在上面的基础上,只查出前几条,用$limit
先投射出字段"gender",在投射子集上再进行$group,$sort,$limit操作
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 }
..