node.js – 避免聚合16MB限制

我有大约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”方法.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...