【问题标题】:Mongoose: how to use index in aggregate?Mongoose:如何在聚合中使用索引?
【发布时间】:2020-03-22 12:41:13
【问题描述】:
【问题讨论】:
标签:
node.js
mongodb
mongoose
mongodb-query
aggregation-framework
【解决方案1】:
索引的工作原理是保存指向集合中给定记录的某些数据片段的记录。可以把它想象成有一本小说,然后有一张纸,上面列出了小说中不同人物或地点的名字,以及他们被提及的页码。
聚合就像拿那本小说并将不同的页面转换成完全不同的信息流。在转换实际发生之前,您不知道新信息的位置,因此您不可能对转换后的信息建立索引。
换句话说,不可能在任何聚合管道阶段使用索引,因为该数据将被转换,而 MongoDB 甚至无法知道是否有可能有效地利用新的转换后的数据。
如果您的聚合管道太大而无法有效处理,那么您需要以某种方式限制管道的大小,以便更有效地处理它。理想情况下,这意味着拥有一个$match 阶段,足以将文档限制在一个合理大小的子集中。然而,这并不总是可行的,因此可能需要额外的努力。
一种可能性是生成“汇总”文档,这些文档是将所有新数据聚合在一起的结果,然后仅使用这些汇总文档执行您的主要聚合管道。例如,如果您希望汇总系统中的交易日志,那么您可以生成当天记录的不同交易的数量和类型的每日摘要,以及您需要的任何其他附加数据。需要。然后,您将聚合管道限制为仅这些每日摘要文档,并避免使用正常的交易文档。
但是,实际解决方案超出了此问题的范围。请注意,索引使用是您无法避免的限制。