我有大约1M文档的集合.每个文档都有internalNumber属性,我需要在node.js代码中获取所有internalNumbers.
以前我用过
db.docs.distinct("internalNumber")
要么
collection.distinct('internalNumber',{},(err,result) => { /* ... */ })
在节点中.
但随着收藏的增长,我开始得到错误:明显太大了,16米帽.
现在我想使用聚合.它消耗大量内存并且速度很慢,但是没关系,因为我只需要在脚本启动时执行一次.我在Robo 3T GUI工具中尝试过:
db.docs.aggregate([{$group: {_id: '$internalNumber'} }]);
它工作,我想在node.js代码中使用它以下方式:
collection.aggregate([{$group: {_id: '$internalNumber'} }],docs) => { /* ... * });
但在Node I中出现错误:“MongoError:聚合结果超出了Function.MongoError.create的最大文档大小(16MB)”.
请帮助克服这个限制.
解决方法
问题是本机驱动程序与默认情况下shell方法的工作方式不同,因为“shell”实际上返回了一个“游标”对象,其中本机驱动程序“明确地”需要此选项.
没有“游标”,.aggregate()
将单个BSON文档作为文档数组返回,因此我们将其转换为游标以避免限制:
let cursor = collection.aggregate( [{ "$group": { "_id": "$internalNumber" } }],{ "cursor": { "batchSize": 500 } } ); cursor.toArray((err,docs) => { // work with resuls });
然后,您可以使用常规方法(如.toArray()
)将结果设置为“客户端”不具有相同限制的JavaScript数组,或其他用于迭代“cursor”的方法.