python - 使用 $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 是有意义的。但同样,没有变化。
如何优化此查询?
解决方案
推荐阅读
- php - 选择文本框时如何更改div的css属性
- wolfram-mathematica - 如何在 Mathematica 中更改 x 和 y 轴的范围间隔
- java - 如何设置引导日期并允许使用日期选择器来更改日期值?
- hadoop - Hive 将数据加载到 HDFS
- pandas - 通过for循环输出由列组成的数据框
- javascript - 使用javascript生成和下载带有表情符号的utf8文件
- python - Qhull Convex hull 要我输入至少3分
- google-chrome-extension - Chrome 扩展程序:contextMenus.create:无效的 url 模式
- mobile-safari - 内容安全策略在台式机上按预期工作,但在移动设备上不起作用
- c++ - c++ stl容器:我们可以在哪里使用它们