'$facet 构造的文档超出限制',allowDiskUse:true

问题描述 投票:0回答:2

我目前正在使用 mongoDb v4.4 和 Mongoose v5.10。并在我的聚合查询中通过 $facet 获取限制超出错误,该查询通过

allowDiskUse: true
选项提供大量响应。

MongoError: document constructed by $facet is 104859602 bytes, which exceeds the limit of 104857600 bytes

它工作得很好,直到我使用 mongoDb v3.4 和 Mongoose v4.13 来获得大结果。

使用facets创建聚合管道并使用

aggregate.allowDiskUse(true)
后,mongo查询日志确实显示allowDiskUse标志为true的查询,但仍然出现错误。

node.js mongodb mongoose aggregate facet
2个回答
1
投票

因为这个

$facet
阶段超过了16兆字节的BSON文档大小限制。

参考$方面考虑

$facet 阶段的输出受 16 MB BSON 文档大小限制。如果 $facet 阶段的结果超出 BSON 文档大小限制,聚合会产生错误。


对于您的情况,也许这个配置命令会有所帮助

db.adminCommand({setParameter: 1, internalQueryFacetBufferSizeBytes: BIGGER_THAN_100MB })

0
投票

在某些情况下,使用 $skip 和 $limit 有助于管理大型数据集并防止超出内存或文档大小限制。这些阶段可以帮助减少在任何给定时间处理的文档数量,这可能会解决您遇到的错误。

这里有关于如何使用 $skip 和 $limit 的修订解释和示例:

$skip 和 $limit 如何提供帮助: $skip:跳过聚合管道中指定数量的文档。如果您想要分块处理数据并避免一次处理太多文档,这会很有用。 $limit:限制从管道处理或返回的文档数量。这有助于减小中间结果的大小,从而更容易避免达到文档大小限制。 何时使用 $skip 和 $limit:

© www.soinside.com 2019 - 2024. All rights reserved.