本文共 3449 字,大约阅读时间需要 11 分钟。
MongoDB 的聚合功能是一种强大的工具,主要用于对集合中的数据进行统计、分析和转换操作。类似于 SQL 中的 count(*)
,MongoDB 的聚合操作可以帮助我们快速获取聚合后的数据结果。
MongoDB 的聚合操作主要通过 aggregate()
方法来执行。以下是该方法的基本使用格式:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
以下是一个典型的聚合操作示例,假设我们有一个名为 mycol
的集合,其内容如下:
{ _id: ObjectId(7df78ad8902c), title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100},{ _id: ObjectId(7df78ad8902d), title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 10},{ _id: ObjectId(7df78ad8902e), title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750}
通过以下聚合操作,可以计算每个作者撰写的文章数量:
db.mycol.aggregate([ { $group: { _id: "$by_user", num_tutorial: { $sum: 1 } } }])
运行上述聚合操作后,会返回以下结果:
{ "result": [ { "_id": "runoob.com", "num_tutorial": 2 }, { "_id": "Neo4j", "num_tutorial": 1 } ], "ok": 1}
这与 SQL 中的 select by_user, count(*) from mycol group by by_user
类似。
以下是 MongoDB 聚合操作中常用的表达式:
表达式 | 描述 | 示例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 插入值到数组中 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在数组中插入唯一值 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 获取排序后的第一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 获取排序后的最后一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
MongoDB 的聚合操作支持多个管道操作符,可用于数据处理和转换。以下是一些常用的管道操作符:
操作符 | 描述 | 示例 |
---|---|---|
$project | 修改文档结构 | db.article.aggregate({$project: {title: 1, author: 1}}) |
$match | 过滤数据 | db.articles.aggregate([{$match: {score: {$gt: 70, $lte: 90}}}, {$group: {count: $sum: 1}}]) |
$limit | 限制返回数量 | db.article.aggregate({$limit: 5}) |
$skip | 跳过指定数量文档 | db.article.aggregate({$skip: 5}) |
$unwind | 拆分数组字段 | db.article.aggregate({$unwind: "$tags"}) |
$group | 分组聚合 | db.mycol.aggregate({$group: {_id: "$by_user", num_tutorial: $sum: 1}}) |
$sort | 排序数据 | db.mycol.aggregate({$sort: {likes: -1}}) |
$geoNear | 地理位置聚合 | db.mycol.aggregate({$geoNear: {type: "point", location: "$location", maxDistance: 1000}}) |
$project
实例通过 $project
操作符,可以重命名或修改字段名:
db.article.aggregate({ $project: { _id: 0, title: 1, author: 1 }})
$match
实例通过 $match
过滤数据:
db.articles.aggregate([ { $match: { score: { $gt: 70, $lte: 90 } } }, { $group: { _id: null, count: { $sum: 1 } } }])
$skip
实例跳过指定数量文档:
db.article.aggregate({ $skip: 5})
MongoDB 的聚合功能为开发者提供了强大的数据处理能力,通过合理组合不同的聚合操作和管道操作符,可以实现复杂的数据分析任务。理解和掌握这些操作是 MongoDB 编程中的核心技能。
转载地址:http://wjffk.baihongyu.com/