我目前正在使用 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的查询,但仍然出现错误。
因为这个
$facet
阶段超过了16兆字节的BSON文档大小限制。
参考$方面考虑:
$facet 阶段的输出受 16 MB BSON 文档大小限制。如果 $facet 阶段的结果超出 BSON 文档大小限制,聚合会产生错误。
对于您的情况,也许这个配置命令会有所帮助
db.adminCommand({setParameter: 1, internalQueryFacetBufferSizeBytes: BIGGER_THAN_100MB })
在某些情况下,使用 $skip 和 $limit 有助于管理大型数据集并防止超出内存或文档大小限制。这些阶段可以帮助减少在任何给定时间处理的文档数量,这可能会解决您遇到的错误。
这里有关于如何使用 $skip 和 $limit 的修订解释和示例:
$skip 和 $limit 如何提供帮助: $skip:跳过聚合管道中指定数量的文档。如果您想要分块处理数据并避免一次处理太多文档,这会很有用。 $limit:限制从管道处理或返回的文档数量。这有助于减小中间结果的大小,从而更容易避免达到文档大小限制。 何时使用 $skip 和 $limit: