一、sql与mongo聚合函数对应关系
SQL中 mongodb中
WHERE $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() $sum
join $lookup
二、数据准备
for(var i = 0; i < 100; i++){
for(var j = 0; j < 4; j++){
db.scores.insert({uid:"u" + i, course:"课程" + j, score: Math.random()*100});
}
}
三、使用示例
1、match过滤记录
db.scores.aggregate({$match:{score:{$gte:80}}})
查询score>=80的记录
2、project过滤字段
db.scores.aggregate({$match:{score:{$gte:80}}}, {$project:{_id:0, uid:1, course:1}})
查询score>=80的uid和course,过滤_id
project支持的函数
举例:
db.scores.aggregate({$project:{uid:1, cname:"$course",
newScore:{$add:["$score", 20]}}}
)
查询uid,把course字段取别名cname,所有score加20后取别名newScore
日期函数
官网文档:
https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/
举例
db.scores.aggregate({$project:{ uid:1,
createTime:{$dateToString:{format: "%Y-%m-%d %H:%M:%S", date:"$createTime"}}}})
3、group分组
db.scores.aggregate({$match:{score:{$gte:80}}}, {$project:{uid:1}}, {$group:{_id:"$uid", count:{$sum:1}}})
查询score>=80的uid,统计每个uid出现的次数
$group:{$_id:{uid:”$uid”, cid:”$course”}}
按多字段分组
group支持的函数
举例:
db.scores.aggregate(
{$group:{_id:"$uid", total:{$sum:"$score"}}},
{$sort:{total:-1}},
{$limit:10})
查询总分前十名用户
4、sort排序
db.scores.aggregate(
{$match:{score:{$gte:80}}}, {$project:{uid:1}},
{$group:{_id:"$uid", count:{$sum:1}}},
{$sort:{count:-1}}
)
查询score>=80的uid,统计每个uid出现的次数,根据次数倒序排序
5、limit
db.scores.aggregate(
{$match:{score:{$gte:80}}}, {$project:{uid:1}},
{$group:{_id:"$uid", count:{$sum:1}}}, {$sort:{count:-1}},
{$limit:3}
)
查询score>=80的uid,统计每个uid出现的次数,根据次数倒序排序,取前三条记录