Mongoose:如何在聚合中使用索引?

Posted

技术标签:

【中文标题】Mongoose:如何在聚合中使用索引?【英文标题】:Mongoose: how to use index in aggregate? 【发布时间】:2020-03-22 12:41:13 【问题描述】:

如何使用聚合索引?

看到文档https://docs.mongodb.com/manual/core/aggregation-pipeline/#pipeline-operators-and-indexes

当 $match 和 $sort 管道运算符出现在管道的开头时,它们可以利用索引。

有没有什么方法可以使用索引而不是开始的情况?

喜欢$sort$match$group

请帮帮我

【问题讨论】:

【参考方案1】:

索引的工作原理是保存指向集合中给定记录的某些数据片段的记录。可以把它想象成有一本小说,然后有一张纸,上面列出了小说中不同人物或地点的名字,以及他们被提及的页码。

聚合就像拿那本小说并将不同的页面转换成完全不同的信息流。在转换实际发生之前,您不知道新信息的位置,因此您不可能对转换后的信息建立索引。

换句话说,不可能在任何聚合管道阶段使用索引,因为该数据将被转换,而 MongoDB 甚至无法知道是否有可能有效地利用新的转换后的数据。

如果您的聚合管道太大而无法有效处理,那么您需要以某种方式限制管道的大小,以便更有效地处理它。理想情况下,这意味着拥有一个$match 阶段,足以将文档限制在一个合理大小的子集中。然而,这并不总是可行的,因此可能需要额外的努力。

一种可能性是生成“汇总”文档,这些文档是将所有新数据聚合在一起的结果,然后仅使用这些汇总文档执行您的主要聚合管道。例如,如果您希望汇总系统中的交易日志,那么您可以生成当天记录的不同交易的数量和类型的每日摘要,以及您需要的任何其他附加数据。需要。然后,您将聚合管道限制为仅这些每日摘要文档,并避免使用正常的交易文档。

但是,实际解决方案超出了此问题的范围。请注意,索引使用是您无法避免的限制。

【讨论】:

以上是关于Mongoose:如何在聚合中使用索引?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 如何聚合两个集合中的内容

如何在猫鼬中使用聚合

如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)

Mongoose:如何使用两个字段对聚合响应进行排序

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

Mongoose:如何向模式添加动态索引?