$addToSet 使用了太多内存,无法溢出到磁盘。内存限制:104857600 字节

Shi*_*ibu 1 mongodb mongodb-query aggregation-framework

[
  {
    $match: {
      $and: [
        {
          $or: [
            { assignee: 'eaa68f83-5024-4a8e-93f0-4b849d598585' },
            { parent: 'eaa68f83-5024-4a8e-93f0-4b849d598585' },
          ],
        },
        { $and: [{ stage: 'COMPLETE' }] },
      ],
    },
  },
  { $group: { _id: null, valueSet: { $addToSet: '$_id' } } },
  { $project: { key: null, value: { $size: '$valueSet' } } },
]
Run Code Online (Sandbox Code Playgroud)

由于记录数 ($_id) 很大,因此出现以下错误。

$addToSet 使用了太多内存,无法溢出到磁盘。内存限制:104857600 字节

有什么解决办法吗?

Joe*_*Joe 5

默认情况下,聚合管道中任何单个 $push 或 $addToSet 操作的内存限制为 100MB。

MongoDB 3.6.17、4.0.14 和 4.2.3 中添加了这些限制以及更改默认值的选项。请参阅https://jira.mongodb.org/browse/SERVER-44869。

编辑

经过思考片刻后,我意识到最终结果将是管道中文档的value唯一值的计数。_id这可以通过不使用 $addToSet 以更具可扩展性的方式获得。

不是按分组null并将每个添加_id到一个集合中,而是按_id结果中的文档数量进行分组并计数。

  { $group: { _id: '$_id' } },
  { $count: 'value' },
  {
    $project: {
      key: null,
      value: 1,
    },
  },
Run Code Online (Sandbox Code Playgroud)