【问题标题】:MongoError: document constructed by $facet is 104860008 bytes, which exceeds the limit of 104857600 bytesMongoError: $facet构造的文档是104860008字节,超过了104857600字节的限制
【发布时间】:2021-04-29 00:10:24
【问题描述】:

在 $facet 中运行多个子管道时出现内存大小限制错误。有人可以帮我解决这个问题。 情景:我有一份每天运行一次的皇冠工作。每当触发作业时,我想使用 $facet 对包含数百万个文档的集合执行多个管道。

[ 
     {
          $facet: {
                  query1: [pipeline_1],
                  query2: [pipeline_2],
                  query3: [pipeline_3]
                  ...
                  query_n: [pipeline_n]
          },
     },
     {
        $merge:{ into: some_collection}
     }
]

我试过db.collection.aggregate([], {allowDiskUse: true});,但仍然遇到同样的错误。 有什么办法可以解决这个问题。请帮忙。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    在大多数情况下,使用allowDiskUse 应该可以消除此错误,这就是为什么我怀疑您使用了错误的语法。根据您的 Mongo 版本,在某些运算符(例如 $graphLookup)上有一些 hard limitations,无论allowDiskUse 标志的使用情况如何,这些运算符都会始终出现内存错误。

    假设您不使用这些运算符中的任何一个 allowDiskUse 将起作用,这里是 nodejs 驱动程序的语法示例:

    db.collection.aggregate([], {allowDiskUse: true});
    

    如果您是$graphLookup 或其他受限运营商之一,那么您无能为力。我首先将这些$facet 阶段拆分为单独的管道。如果问题仍然存在,您需要优化聚合或寻找其他方法。

    【讨论】:

    • 我使用与上面相同的语法。它应该给出 allowDiskUse 错误/警告,但它给出了 $facet 的内存限制错误。当我将它与 $group 一起使用时,它运行良好。有没有其他方法可以并行运行多个管道并将输出合并到另一个集合中。
    • 很难回答你的问题,因为我看不到实际的查询,但假设你使用的是 nodejs mongo 驱动程序(不是 mongoose 或其他东西)和正在使用我给出的语法,那么除了将其拆分为不同的管道之外别无选择。
    • 嗨,汤姆,我正在使用 pymongo python 包来运行这样的管道:db_client.aggregate( db_name, collection_name, pipeline, allow_disk_use=True) 它在 $group 的情况下有效,但在 $facet 的情况下无效。
    • 应该是allowDiskUse=True 我不知道allow_disk_use=True 怎么没有给你一个错误。
    • PyMongo 是一个 python 包,所以allow_disk_use=True 绝对没问题。我检查了 mongodb CLI db.collection_name.aggregate( [pipeline], {allowDiskUse: true}}。仍然出现同样的错误。
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2023-03-24
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多