聚合
提示
MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。管道在 Unix 和 Linux 中一般用于将当前命令的输出结果作为下一个命令的参数。
聚合框架中常用的几个操作:
$project
修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。$match
用于过滤数据,只输出符合条件的文档。$match 使用 MongoDB 的标准查询操作。$limit
用来限制 MongoDB 聚合管道返回的文档数。$skip
在聚合管道中跳过指定数量的文档,并返回余下的文档。$group
将集合中的文档分组,可用于统计结果。$sort
将输入文档排序后输出。$unwind
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。$geoNear
输出接近某一地理位置的有序文档。
# $project
类似于 SQL 中的返回指定字段。
// 只返回age字段
db.accounts.aggregate([{"$project": {"age": 1, "_id": 0}}])
1
2
2
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$project": {"age": 1, "_id": 0}}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $match
指定各种查询条件,类似于 SQL 中的指定条件查询和$or。
db.accounts.aggregate([{"$match": {"$or": [{"firstname": "Amber", "lastname" : "Duke"}, {"lastname" : "Davidson"}]}}])
1
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$match": {"$or": [{"firstname": "Amber", "lastname" : "Duke"}, {"lastname" : "Davidson"}]}}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $limit
指定返回数据条数,类似于 SQL 中的limit 和 pretty。
db.accounts.aggregate([{"$limit": 1}]).pretty()
1
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$limit": 1}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $skip
结合 $limit 实现分页,类似于 SQL 中的skip。
注意
注意聚合这里 $skip 和 $limit 的顺序,$skip 在 $limit 的前面。
db.accounts.aggregate([{"$skip": 40}, {"$limit": 10}])
1
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$skip": 40}, {"$limit": 10}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $group
分组,可以用于统计。
$sum
计算总和。$avg
计算平均值。$min
获取集合中所有文档对应值得最小值。$max
获取集合中所有文档对应值得最大值。$push
将值加入一个数组中,不会判断是否有重复的值。$addToSet
将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。$first
根据资源文档的排序获取第一个文档数据。$last
根据资源文档的排序获取最后一个文档数据。
# 单个字段分组
db.accounts.aggregate([{"$group": {"_id": "$gender","gender": {"$sum": 1}}}])
# 多个字段分组
db.accounts.aggregate([{"$group": {"_id": {"gender": "$gender", "age": "$age"},"gender": {"$sum": 1}}}])
1
2
3
4
2
3
4
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$group": {"_id": {"gender": "$gender", "age": "$age"},"gender": {"$sum": 1}}}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $sort
排序,-1
:降序、1
:升序,类似于 SQL 中的sort。
db.accounts.aggregate([{"$sort": {"age": -1, "balance": 1}}])
1
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$sort": {"age": -1, "balance": 1}}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $unwind
新增一条数据,用于测试。
db.accounts.insert({"name": "demo", "hobby": ["basketball", "swimming", "排球"]})
db.accounts.aggregate([{"$match": {"name": "demo"}}, {"$unwind": "$hobby"}])
1
import pymongo
db = pymongo.MongoClient("mongodb://localhost:27017/")["ts"]
print(db.accounts.aggregate([{"$match": {"name": "demo"}}, {"$unwind": "$hobby"}]))
1
2
3
2
3
// Make sure to add code blocks to your code group
# $geoNear
上次更新: 2023/08/08, 20:00:46