# 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 自动计算边界使各桶数据量均衡 ✓ 正确答案