聚合管道

共 19 题
#

1. $match、$project、$group、$sort、$limit 的执行顺序优化?

A $project 应放在最后以保留完整字段
B $match 应放在最前以利用索引,$sort 后接 $limit 可做 top-k 优化 ✓ 正确答案
C $group 是流式阶段,无需收集全部数据
D $limit 放在 $sort 前会扩大排序量
#

2. 聚合管道(Aggregation Pipeline)的执行阶段与顺序?

A 阶段顺序不影响结果
B 管道由有序阶段组成,每阶段处理上一阶段输出,优化器可重排部分阶段 ✓ 正确答案
C $match 放在最后效果最好
D 聚合管道只能有一个阶段
#

3. $facet 多面聚合?

A $facet 的子管道不能使用 $group
B $facet 只能执行一个子管道
C $facet 是流式阶段,几乎不占内存
D $facet 在单阶段内执行多个子管道,对同一输入独立处理并输出多面结果 ✓ 正确答案
#

4. 聚合管道的累加器($sum/$avg/$first/$last/$push/$addToSet/$top)语义与内存边界

A 聚合累加器没有内存限制
B $addToSet 会保留重复值
C $sum 会累积成数组
D $push/$addToSet 会累积数组,$group 受 100MB 内存限制,超额需 allowDiskUse ✓ 正确答案
#

5. $lookup 的 pipeline 语法(let + pipeline)如何实现条件关联与过滤?与普通等价关联相比在索引利用与性能上有何差异?

A let 只能定义常量,不能引用当前文档字段
B pipeline 语法必然比普通关联更快
C let+pipeline 实现复杂关联,但比普通等价关联更依赖索引匹配,可能性能下降 ✓ 正确答案
D pipeline 语法无法做条件过滤
#

6. 哪些聚合阶段是阻塞型($sort、$group、$facet)哪些可流式处理?阻塞阶段对内存与端到端延迟的影响如何评估?

A 阻塞阶段不占内存
B $project/$match 是阻塞型
C $sort/$group/$facet 是阻塞型,需全量输入并占用内存,增加端到端延迟 ✓ 正确答案
D 流式阶段必须等全部输入才输出
#

7. $lookup 的应用场景与性能?

A $lookup 性能强依赖 from 集合的 foreignField 索引,无索引会退化为全表扫描 ✓ 正确答案
B $lookup 无需索引即可高效执行
C $lookup 会修改外部集合数据
D $lookup 与本地文档数量无关
#

8. MongoDB 聚合管道的 $lookup 与 $unwind 的性能陷阱,何时应反规范化?

A $lookup 无索引会全表扫描,$unwind 展开大数组会文档爆炸,高频关联应反规范化 ✓ 正确答案
B $unwind 不产生额外文档
C $lookup 无需索引也能高效
D 反规范化总比 $lookup 慢
#

9. 聚合管道的分片感知,$group/$sort 在分片集群下的数据流与内存限制?

A 分片聚合不会产生网络开销
B 聚合先在分片本地执行,再在 merge 分片合并,合并受 100MB 内存限制 ✓ 正确答案
C 跨分片 $group 无需合并
D 分片聚合无内存限制
#

10. 聚合管道的优化器,$match/$sort 的索引利用、$project 提前裁剪字段、$group 前 $match 过滤如何写?

A 优化器会提前 $match 以利用索引,$project 提前裁剪字段,$group 前应加 $match 过滤 ✓ 正确答案
B 优化器会忽略 $match 的索引
C $project 放在最后才能裁剪
D $group 前加 $match 会增加数据量
#

11. 聚合的内存限制与 allowDiskUse,100MB 内存限制、$group/$sort 落盘行为与分片集群的差异?

A 分片集群聚合不受内存限制
B 聚合无内存限制
C allowDiskUse 会提高内存占用
D 聚合默认 100MB 内存限制,allowDiskUse 可落盘突破,分片集群 merge 也受此限制 ✓ 正确答案
#

12. $lookup 的索引要求与 $unwind 组合,关联查询的优化?

A $unwind 不改变文档数量
B $lookup 需 foreignField 索引,$unwind 前应过滤减少展开量 ✓ 正确答案
C $lookup 无需索引也能高效
D $unwind 应放在 $lookup 之前
#

13. 聚合 $merge 写回的目标集合与 upsert/冲突时的行为

A $merge 不产生写入
B $merge 只能插入,不能更新
C $merge 按匹配键对目标集合做 upsert,可配置 whenMatched/whenNotMatched 策略 ✓ 正确答案
D $merge 只能写回同一集合
#

14. $unionWith 与 $lookup、$graphLookup 的组合用法,跨集合合并/关联在分片集群下的限制与性能特征?

A $unionWith 用于关联集合
B $unionWith 合并集合、$lookup 关联、$graphLookup 递归遍历,分片集群中跨分片开销大 ✓ 正确答案
C $graphLookup 是等值关联
D 分片集群中跨集合操作无额外开销
#

15. $sort 后接 $limit 为什么可以避免全量排序(top-k 优化)?与单独 $sort 的索引利用有何不同?

A 单独 $sort 比 $sort+$limit 更省内存
B $sort+$limit 仍需全量排序
C $sort+$limit 只需维护前 k 条避免全量排序,索引字段可免内存排序 ✓ 正确答案
D $sort 有索引时仍需内存排序
#

16. $lookup 与 $graphLookup 的差异,图遍历(层级查询)与普通关联各自的适用场景与性能边界?

A $lookup 支持递归层级查询
B $graphLookup 只做单层关联
C $lookup 单层关联,$graphLookup 递归图遍历,适合层级查询但需控深度与索引 ✓ 正确答案
D $graphLookup 无需索引
#

17. 聚合管道的 $densify 与 $fill 阶段如何补全缺失的时间序列点?

A $densify 生成缺失的时间序列点,$fill 填充缺失字段值,两者配合补全序列 ✓ 正确答案
B $densify 用于填充数值
C $fill 用于生成时间点
D $densify 与 $fill 不用于时间序列
#

18. 聚合管道 $unwind 对空数组/缺失字段的处理(preserveNullAndEmptyArrays)

A $unwind 默认丢弃空数组/缺失字段文档,preserveNullAndEmptyArrays: true 可保留 ✓ 正确答案
B $unwind 默认保留空数组文档
C preserveNullAndEmptyArrays 只影响数值
D $unwind 不处理数组
#

19. $bucket 与 $bucketAuto 如何实现直方图分桶?$bucketAuto 的边界自动计算与分桶数控制有什么注意点?

A $bucketAuto 的算法分桶数总是精确等于设定值
B $bucketAuto 使用固定等宽边界
C $bucket 自动计算边界
D $bucket 手动指定边界,$bucketAuto 自动计算边界使各桶数据量均衡 ✓ 正确答案