我对用猫鼬执行updateMany命令时应该在where查询中指定什么感到很好奇。
例如,给出此更新操作:{ $pull: { tags: { $in: ["tagone", "tagtwo"] } } }
查询应该在哪里:
[{organisation: "fffffff..."}
或{organisation: "fffffff...", tags: {$in: ["tagone", "tagtwo"]}
在where查询中额外的特异性会提高还是降低性能,或者没有区别?
(无数据库索引适用)
我将介绍一些我所知道的东西,如果有任何增强,请更新此内容:
1]好吧,如果您没有指定过滤器且没有索引,请以这种方式思考-然后查询将遍历集合中的所有文档,并查找tags
数组中输入数组中传递的值并将其拉出值(如果它们存在于tags
中)。每个文档tags
数组都必须搜索值。
2)如果您有一个过滤器-即使那样,因为您没有启用任何索引,因此查询必须扫描集合中的所有文档,它们都是collection scan
,然后它将遍历过滤后的文档(与提供的过滤器匹配的文档)并更新tags
数组。
为什么我们需要集合中的索引和查询中的过滤器?]
首先,为什么要在不应用索引的情况下进行操作?每个集合都必须正确索引。
迭代内存中的索引键(索引字段的值)并从磁盘中获取实际文档,更新这些文档并使用索引将其写回将会很快,另一方面,使用过滤器将使查询运行在更少的文档或索引键中(如果已建立索引)在以后的阶段处理文档的任何更新或汇总时的任何转换。