MongoDB开启allowDiskUse:true仍报BSONObj大小错误的原因是什么
错误原因说明
你开启allowDiskUse: true仍然报错的核心原因如下:
allowDiskUse的作用仅为允许聚合操作的中间计算阶段(如分组、排序的中间运算)使用磁盘存储,突破默认100MB的内存使用上限,它无法绕过MongoDB单个BSON文档最大16MB的硬编码限制。- 你当前的聚合逻辑会将所有唯一的
user_id全部存入单个输出文档的user_ids数组中,从报错信息可看出最终生成的文档大小约为44MB,远超过16MB的上限,因此触发BSONObjectTooLarge错误,该错误和是否开启磁盘使用无关。
正确实现方案
不要将所有唯一值塞入同一个数组,改为每个唯一user_id单独作为一个输出文档,通过游标遍历获取全部结果即可:
db.collection.aggregate([ // 按user_id分组,天然去重,每个唯一user_id生成一个文档 { $group: { _id: "$user_id" } }, // 可选:调整字段名,输出更清晰的结构 { $project: { user_id: "$_id", _id: 0 } } ], { allowDiskUse: true }).forEach(doc => { // 此处可自定义处理逻辑,比如写入文件、存入其他集合等 print(doc.user_id); });
如果你的user_id字段已经建立了索引,上述聚合会直接走索引扫描,执行效率会非常高。
内容的提问来源于stack exchange,提问作者pepsi
相关产品推荐
相关产品推荐

