首页 Mongdb数据库教程 MongoDB聚合操作符$match、$group、$project、$sort、$limit、$skip、$unwind、$lookup使用
pay pay
教程目录

MongoDB聚合操作符$match、$group、$project、$sort、$limit、$skip、$unwind、$lookup使用

日期: 四月 11, 2023, 5:38 a.m.
阅读: 170
作者: Python自学网-村长

摘要: MongoDB 中,聚合(Aggregation)是一种数据处理操作,它可以对文档进行分组、筛选、统计等操作,类似于SQL中的GROUP BY和SELECT语句。MongoDB聚合框架提供了丰富的操作符和管道操作,可以对数据进行灵活的处理和转换。

MongoDB 中,聚合(Aggregation)是一种数据处理操作,它可以对文档进行分组、筛选、统计等操作,类似于SQL中的GROUP BY和SELECT语句。MongoDB聚合框架提供了丰富的操作符和管道操作,可以对数据进行灵活的处理和转换。本文将介绍MongoDB聚合的常见操作符和使用方法。

假设我们有一个名为students的集合,它包含以下文档:

{ "_id" : ObjectId("61e053bcf56e7f46489abcf7"), "name" : "Alice", "age" : 18, "gender": "female", "score": {"math": 90, "english": 80} }
{ "_id" : ObjectId("61e053bcf56e7f46489abcf8"), "name" : "Bob", "age" : 20, "gender": "male", "score": {"math": 70, "english": 85} }
{ "_id" : ObjectId("61e053bcf56e7f46489abcfa"), "name" : "Charlie", "age" : 18, "gender": "male", "score": {"math": 85, "english": 90} }

1.$match操作符

$match操作符用于筛选文档,类似于find方法的查询条件。它可以使用查询操作符($eq、$ne、$lt、$gt等)进行筛选。例如,以下聚合操作可以筛选出age大于等于18的文档:

db.students.aggregate([
    {$match: {age: {$gte: 18}}}
])

2.$group操作符

$group操作符用于对文档进行分组统计,类似于SQL中的GROUP BY和SUM函数。它可以按照指定字段进行分组,并对分组后的文档进行统计操作。例如,以下聚合操作可以按照gender字段进行分组,并计算每个分组的平均年龄和平均数学成绩:

db.students.aggregate([
    {$group: {_id: "$gender", avgAge: {$avg: "$age"}, avgMathScore: {$avg: "$score.math"}}}
])

3.$project操作符

$project操作符用于对文档进行投影,类似于find方法中的投影操作。它可以选择需要的字段,并进行重命名、计算、表达式等操作。例如,以下聚合操作可以选择name、gender和数学成绩,并将数学成绩除以10:

db.students.aggregate([
    {$project: {name: 1, gender: 1, mathScore: {$divide: ["$score.math", 10]}}}
])

4.$sort操作符

$sort操作符用于对聚合结果进行排序,可以根据一个或多个字段进行排序,还可以指定排序顺序(升序或降序)。$sort操作符接受一个包含排序条件的文档作为参数,文档中的键为排序字段,值为排序顺序,1表示升序,-1表示降序。例如,以下聚合操作将按照sales字段降序排列结果:

db.sales.aggregate([
    {$group: {_id: "$product", sales: {$sum: "$amount"}}},
    {$sort: {sales: -1}}
])

这个聚合操作首先使用$group操作符将sales数据按照产品进行分组,然后使用$sum操作符计算每个产品的销售总额,最后使用$sort操作符按照销售总额进行降序排列。

如果需要按照多个字段进行排序,可以在$sort操作符中指定多个键值对。以下聚合操作将按照sales字段和product字段进行排序,首先按照销售总额降序排列,如果销售总额相同,则按照产品名称升序排列:

db.sales.aggregate([
    {$group: {_id: "$product", sales: {$sum: "$amount"}}},
    {$sort: {sales: -1, _id: 1}}
])

5.$limit和$skip操作符

$limit和$skip操作符用于分页操作,类似于SQL中的LIMIT和OFFSET。$limit操作符用于限制返回的文档数量,$skip操作符用于跳过指定数量的文档。例如,以下聚合操作可以返回前2个文档:

db.students.aggregate([
    {$limit: 2}
])

以下聚合操作可以跳过前2个文档,并返回后面的文档:

db.students.aggregate([
    {$skip: 2}
])

6.$unwind操作符

$unwind操作符用于展开文档中的数组,将数组中的每个元素作为一个新文档进行处理。例如,如果我们将文档中的score字段改为数组类型:

{ "_id" : ObjectId("61e053bcf56e7f46489abcf7"), "name" : "Alice", "age" : 18, "gender": "female", "score": [{"subject": "math", "score": 90}, {"subject": "english", "score": 80}] }
{ "_id" : ObjectId("61e053bcf56e7f46489abcf8"), "name" : "Bob", "age" : 20, "gender": "male", "score": [{"subject": "math", "score": 70}, {"subject": "english", "score": 85}] }
{ "_id" : ObjectId("61e053bcf56e7f46489abcfa"), "name" : "Charlie", "age" : 18, "gender": "male", "score": [{"subject": "math", "score": 85}, {"subject": "english", "score": 90}] }

以下聚合操作可以展开score数组,将每个成绩作为一个新文档进行处理:

db.students.aggregate([
    {$unwind: "$score"}
])

7.$lookup操作符

$lookup操作符用于进行关联查询,类似于SQL中的JOIN操作。它可以将当前集合中的字段与另一个集合进行关联,并返回关联后的结果。例如,假设我们有一个名为courses的集合,它包含以下文档:

{ "_id" : ObjectId("61e05f5ef56e7f46489abd02"), "name" : "math", "teacher": "Tom" }
{ "_id" : ObjectId("61e05f5ef56e7f46489abd03"), "name" : "english", "teacher": "Lucy" }

以下聚合操作可以将students集合中的数学成绩与courses集合中的math课程进行关联,并返回关联后的结果:

db.students.aggregate([
    {$lookup: {from: "courses", localField: "score.math", foreignField: "_id", as: "mathCourse"}}
])

上述聚合操作中,from指定要关联的集合,localField指定当前集合中的字段,foreignField指定要关联集合中的字段,as指定返回结果中的字段名。

以上是MongoDB聚合的常见操作符和使用方法,MongoDB聚合框架还提供了许多其他操作符,如$group、$project、$match等,它们可以用于进行更复杂的聚合操作。下面是一个更复杂的例子:

假设我们有一个名为orders的集合,它包含以下文档:

{ "_id" : ObjectId("61e05d10f56e7f46489abce3"), "item" : "apple", "price" : 2.5, "quantity": 5, "date": ISODate("2022-01-01T00:00:00Z") }
{ "_id" : ObjectId("61e05d10f56e7f46489abce4"), "item" : "banana", "price" : 1.5, "quantity": 3, "date": ISODate("2022-01-01T00:00:00Z") }
{ "_id" : ObjectId("61e05d10f56e7f46489abce5"), "item" : "apple", "price" : 2.5, "quantity": 2, "date": ISODate("2022-01-02T00:00:00Z") }
{ "_id" : ObjectId("61e05d10f56e7f46489abce6"), "item" : "banana", "price" : 1.5, "quantity": 1, "date": ISODate("2022-01-02T00:00:00Z") }
{ "_id" : ObjectId("61e05d10f56e7f46489abce7"), "item" : "orange", "price" : 3.0, "quantity": 4, "date": ISODate("2022-01-02T00:00:00Z") }

以下聚合操作可以计算每个商品的销售总额,并按销售总额从高到低排序:

db.orders.aggregate([
    {$project: {item: 1, sales: {$multiply: ["$price", "$quantity"]}, date: 1}},
    {$group: {_id: "$item", totalSales: {$sum: "$sales"}}},
    {$sort: {totalSales: -1}}
])

上述聚合操作中,$project操作符用于计算每个订单的销售额,$group操作符用于将同一商品的订单进行合并,并计算销售总额,$sort操作符用于按销售总额从高到低排序。执行以上聚合操作后,将会得到以下结果:

{ "_id" : "apple", "totalSales" : 15 }
{ "_id" : "orange", "totalSales" : 12 }
{ "_id" : "banana", "totalSales" : 6 }

以上就是MongoDB聚合的基本操作符和使用方法,通过这些操作符的灵活组合,我们可以完成更复杂的数据分析和统计任务。

部分文字内容为【Python自学网】原创作品,转载请注明出处!视频内容已申请版权,切勿转载!
回顶部