测验:文档数据库的取舍
“文档数据库没有模式”这句话,最准确的理解是什么?
- 确实无法施加任何约束
- 这是为了性能而放弃验证的设计
- 每个集合中的文档形状必须不同
- 模式并未消失,只是移到了应用程序一侧
判断订单明细应嵌入(embed)订单文档,还是单独存放并通过引用关联,依据是什么?
- 是否总是一起读取,以及是否会在外部独立变化
- 只需看文档大小是否超过 16MB
- 看明细是否超过十项
- 遵循规范化理论,始终使用引用
选择嵌入(embed)数据需要付出什么代价?
- 修改该数据时,必须找到并更新所有包含它的文档
- 虽然无需连接,查询仍会变慢
- 无法为数组中的字段建立索引
- 该集合将无法使用事务
执行计划中出现 COLLSCAN,表示什么?
- 集合已损坏
- 查询结果为空
- 未使用索引,而是扫描了集合中的所有文档
- 写锁正被占用
判断索引是否有效,最直接应看哪个指标?
- 索引占用的磁盘空间
- 集合中的文档总数和平均大小
- 该查询实际耗费的毫秒数
- nReturned 与 totalDocsExamined 的比值
“以防万一”创建多个索引,会付出什么代价?
- 候选查询计划增多,选择计划耗时变长
- 每次写入都要更新所有相关索引,导致写入变慢并占用空间
- 只是稍微增加内存占用,没有其他影响
- 传输到副本的数据增多,导致复制延迟
不用 $set,而用 replaceOne 整体替换文档,通常会发生什么?
- 更新速度更快
- 索引会失效
- 新文档中未写出的字段会消失
- 会生成新的 _id
当 tags 是数组时,要按标签汇总,聚合管道中需要什么?
- 只用 $group 就够了
- 先用 $unwind 展开数组,再用 $group
- 先用 $lookup 连接,再用 $group
- 先用 $project 把数组转成字符串,再用 $group