首页 > 解决方案 > 使用 $unwind 聚合 Mongodb 数组值需要很长时间

问题描述

我有一个大集合(>100M 个文档),它的字段是一个数组,最多可以包含 ~500 个值。我试图计算每个唯一值在集合中重复的次数。

问题是它需要几个小时才能完成。

数组字段被索引。

作为一个例子(为了进一步解释我想要实现的目标),假设我们有以下文件

doc_1 = {'name': 'George', 'books': ['123', '321']}
doc_2 = {'name': 'Julia', 'books': ['555', '321']}

我想得到以下

{'123': 1, '321': 2, '555': 1}

我目前正在做的是

query = [
    {'$unwind': f"${books}"},
    {'$group': {"_id": f"${books}", "count": {'$sum': 1}}}
]
db_connection.collection_name.aggregate(query, allowDiskUse=True)

当我在实际集合(再次,>100M 文档)上使用 allowDiskUse=False 运行它时,我遇到了内存问题,这就是我将其用作 True 的原因。

此外,我尝试使用不同的 batchSize,但即使我阅读了它,我也不完全理解它是如何工作的,以及它是否真的改进了某些东西。

我尝试将投影用于“书籍”字段,但没有任何好处。

我知道使用 $unwind 基本上将文档(保留_id)复制为每个文档数组中的值的数量,并且复制所有其他字段没有意义,这就是为什么在我看来使用 $projection 是有意义的。但同样,没有变化。

如何优化此查询?

标签: pythonmongodbnosqlpymongoaggregation

解决方案


推荐阅读