聚合框架主要操作符
- $match:用于过滤文档,只保留符合指定条件的文档,类似于SQL中的WHERE子句。例如:
{
"$match": {
"status": "A",
"score": { "$gt": 80 }
}
}
- $group:按指定的表达式对文档进行分组,并可以对每个组应用累加器操作。例如,计算每个类别(category)的平均分数(score):
{
"$group": {
"_id": "$category",
"avgScore": { "$avg": "$score" }
}
}
- $project:用于修改输出文档的结构,可选择包含或排除某些字段,也可以创建新字段。例如,只输出名称(name)和年龄(age)字段:
{
"$project": {
"name": 1,
"age": 1,
"_id": 0
}
}
- $sort:根据指定的字段对文档进行排序,1表示升序,-1表示降序。例如,按分数(score)降序排序:
{
"$sort": {
"score": -1
}
}
- $limit:限制聚合管道返回的文档数量。例如,只返回前10个文档:
{
"$limit": 10
}
- $skip:跳过指定数量的文档,通常与$limit一起使用实现分页。例如,跳过前20个文档:
{
"$skip": 20
}
- $unwind:将数组类型的字段拆分成多个文档,每个文档包含数组中的一个元素。例如,对于包含多个爱好(hobbies)的文档:
{
"$unwind": "$hobbies"
}
分片键选择对聚合操作的影响
- 性能影响:
- 高效情况:如果分片键选择得当,聚合操作相关的数据可能集中在少数几个分片上,减少跨分片的数据传输。例如,按时间(time)分片,当聚合操作主要基于时间范围(如统计某段时间内的数据)时,数据可在特定分片上快速处理,提升性能。
- 低效情况:若分片键与聚合条件不相关,如聚合按用户类型(userType)统计,而分片键是用户ID(userId),则可能导致数据在所有分片上分散,跨分片传输数据量增大,聚合性能降低。
- 数据一致性:
- 保证一致性:正确的分片键选择有助于在聚合操作时保证数据一致性。当聚合操作基于分片键进行分组等操作时,同一组的数据可能位于同一分片,减少数据同步和一致性问题。
- 一致性问题:若分片键选择不当,跨分片的数据聚合可能由于网络延迟、分片故障等原因,导致部分数据更新不及时,影响聚合结果的一致性。
- 扩展性:
- 利于扩展:合理的分片键能使聚合操作随着数据量增长和集群扩展仍保持较好性能。例如,按地理位置(location)分片,随着业务发展数据量增加,新的分片可以根据地理位置轻松添加,聚合操作仍能高效执行。
- 限制扩展:不合适的分片键,在数据量增大时,可能导致聚合操作负载不均衡,部分分片压力过大,限制集群扩展性,影响聚合操作效率。