为了性能,我应该在 MongoDB 更新命令中有多具体?

How specific should I be in MongoDB update commands, for performance?

我很好奇在使用 mongoose 执行 updateMany 命令时应该在 where 查询中指定什么。

例如给定此更新操作:{ $pull: { tags: { $in: ["tagone", "tagtwo"] } } }

where 查询应该是:

{organisation: "fffffff..."}{organisation: "fffffff...", tags: {$in: ["tagone", "tagtwo"]}

where 查询中的额外特异性会提高或降低性能,还是没有区别?

(没有应用数据库索引)

我会介绍一些我知道的东西,如果有任何改进请更新:

1) 好的,如果您没有指定过滤器并且没有索引,那么可以这样想——然后查询将遍历集合中的所有文档,查看 tags 数组中传递的值输入数组并拉取这些值(如果它们存在于 tags 中)。每个文档 tags 数组都必须搜索值。

2) 如果你有一个过滤器 - 即使那样,因为你没有启用任何索引,查询必须扫描集合中的所有文档,这是一个 collection scan,然后它会遍历过滤后的文档(来自提供的过滤器的匹配文档)并更新 tags 数组。

为什么我们需要集合中的索引和查询中的过滤器?

首先,您为什么要在不应用索引的情况下执行此操作?每个集合都必须正确索引。

迭代内存中的索引键(索引字段的值)并从磁盘中获取实际文档,更新这些文档并将其写回使用索引会很快,另一方面,使用过滤器将使查询 运行 通过更少的文档或索引键(如果索引)来处理任何更新,或者在聚合的情况下在进一步阶段对文档进行任何转换。