MongoDB操作命令和更改获胜计划

时间:2017-05-31 22:35:21

标签: mongodb mongodb-query aggregation-framework mongodb-indexes

我目前正在运行几个(重)文档的集合。

该文档的某些字段非常繁重,我们在投影阶段将它们排除在外。

我们发现排序实际上是在投影之前完成的,导致了一些内存问题:

  

溢出排序阶段缓冲数据使用量33658319字节超过内部限制33554432字节

以下是问题:

  • 是否可以手动指定获胜计划?
  • 排序前是否可以进行投影?
  • 为什么在投影之前完成排序?

1 个答案:

答案 0 :(得分:2)

是否可以指定获胜计划?

我认为您无法直接指定获胜计划,但您可以使用cursor.hint()选择要在查询中使用的索引,这将影响获胜计划。例如,如果要进行完整集合扫描,请使用{ $natural : 1 }

请注意,从MongoDB 2.6开始,如果您的查询形状存在索引过滤器,则会忽略hint()querysort和{{1的组合}})。

是否可以在排序之前进行投影?

是的,您可以使用aggregation framework指定操作的顺序,并在project之前执行$project

为什么在投影前执行排序?

如果排序在$sort$project$unwind之前完成,则可以利用索引。否则就无法做到。 From the docs

  

$ sort运算符和性能

     

$group运算符在放置在管道的开头或放在$sort$project$unwind聚合运算符之前时可以利用索引。如果在$group操作之前发生$project$unwind$group,则$sort无法使用任何索引。